{"version":3,"sources":["kendo.dataviz.js"],"names":["f","define","$","window","undefined","Class","compilePart","part","stringPart","split","join","replace","first","charAt","rest","substring","pad","number","digits","end","length","zeros","getShadows","element","shadow","css","kendo","support","transitions","radius","match","boxShadowRegExp","blur","math","max","left","right","bottom","wrap","autosize","percentage","width","height","percentWidth","percentHeight","forceWidth","browser","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","windowOuterWidth","removeClass","hasClass","wrapResize","style","percentRegExp","test","is","addClass","boxSizing","mozBoxSizing","webkitBoxSizing","msie","floor","version","zoom","children","wrapper","wrapperStyle","display","position","deepExtend","destination","i","arguments","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","OBJECT","constructor","Array","RegExp","Date","getTime","isFunction","clone","UNDEFINED","testRx","agent","rxs","dflt","rx","hasOwnProperty","toHyphens","str","g","toLowerCase","toCamelCase","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","each","idx","value","getPropertyValue","currentStyle","size","isScrollable","className","indexOf","overflow","scrollLeft","isRtl","webkit","mozila","mozilla","el","scrollWidth","clientWidth","Math","abs","obj","key","result","getOffset","type","positioned","offset","sign","top","pointers","msPointers","pageYOffset","documentElement","scrollTop","pageXOffset","parseEffects","input","effects","this","fx","Element","prepareAnimationOptions","options","duration","reverse","complete","STRING","BOOLEAN","extend","init","noop","teardown","hide","completeCallback","animate","instance","queue","promise","toggleClass","classes","add","htmlEncode","ampRegExp","ltRegExp","gtRegExp","quoteRegExp","aposRegExp","parseOption","option","dashRegExp","getAttribute","ns","numberRegExp","parseFloat","jsonRegExp","jsonFormatRegExp","Function","parseOptions","role","templateRegExp","template","html","containmentComparer","a","b","contains","resizableWidget","widget","inArray","attr","focusable","isTabIndexNotNaN","nodeName","disabled","href","visible","expr","pseudos","parents","addBack","filter","kendoJQuery","selector","context","fn","Template","preventDefault","isDefaultPrevented","Observable","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","directions","eventTarget","wrapExpression","localUrlRe","Widget","DataBoundWidget","ContainerNullObject","MobileWidget","MOUSE_EVENTS","EXCLUDE_BUST_CLICK_SELECTOR","MouseEventNormalizer","eventMap","getEventMap","eventRegEx","on","rootjQuery","animationFrame","animationQueue","cultures","isArray","proxy","JSON","formatRegExp","FUNCTION","NUMBER","NULL","getterCache","setterCache","slice","noDepricateExtend","src","copyIsArray","copy","name","target","deep","jQuery","isPlainObject","proto","member","base","that","subclass","apply","prototype","Object","_initOptions","_defaultPrevented","_events","bind","eventName","handlers","one","original","handler","events","eventNames","handlersIsFunction","unbind","push","unshift","trigger","e","sender","call","splice","paramName","useWithBlock","render","compile","parts","settings","argumentName","functionBody","_slotCount","Error","format","quote","string","escapable","lastIndex","c","meta","charCodeAt","toString","holder","k","v","partial","mind","gap","toJSON","rep","isFinite","String","indent","\b","\t","\n","\f","\r","\"","\\","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","","findCulture","culture","numberFormat","getCulture","current","formatDate","date","calendar","calendars","standard","days","months","patterns","dateFormatRegExp","minutes","getDate","namesAbbr","getDay","names","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","AM","PM","getTimezoneOffset","formatNumber","decimal","precision","pattern","literals","symbol","isCurrency","isPercent","customPrecision","formatAndPrecision","negative","integer","fraction","integerLength","fractionLength","replacement","ch","hasGroup","hasNegativeFormat","decimalIndex","sharpIndex","zeroIndex","hasZero","hasSharp","percentIndex","currencyIndex","startZeroIndex","start","exp","rounded","POINT","decimals","EMPTY","toLocaleString","standardFormatRegExp","exec","currency","percent","toExponential","round","groupInteger","literalRegExp","quoteChar","literal","PLACEHOLDER","SHARP","ZERO","COMMA","commaRegExp","lastIndexOf","EN","objectToString",",",".","groupSize","abbr","namesShort","d","D","F","G","m","M","s","t","T","u","y","Y","/",":","firstDay","twoDigitYearMax","cultureName","newGroupSize","groupSizes","shift","toFixed","min","fmt","values","index","placeholderFormat","parseInt","_extractFormat","_activeElement","activeElement","_round","includeMargin","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","adjustDST","hours","setHours","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","strict","count","pmHour","UTC","matches","amDesignators","pmDesignators","hoursOffset","minutesOffset","hasTime","lookAhead","getNumber","rg","substr","valueIdx","getIndexByName","lower","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","month","day","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","longTimeZoneRegExp","shortTimeZoneRegExp","isNaN","setFullYear","parseMicrosoftFormatOffset","getDefaultFormats","cultureFormats","formatIdx","FORMATS_SEQUENCE","STANDARD_FORMATS","formats","concat","internalParseDate","tzoffset","dateRegExp","offsetRegExp","timezone","convert","nonBreakingSpaceRegExp","exponentRegExp","2","3","4","parseDate","parseExactDate","percentSymbol","table","docStyle","transforms","elementProto","mobileOS","documentMode","chrome","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","removeChild","closest","tbodyInnerHtml","touch","HTMLElement","hasHW3D","WebKitCSSMatrix","cssFlexbox","lowPrefix","prefix","hasTransitions","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","detectOS","ua","minorVersion","os","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","navigator","device","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","mouseAndTouchPresent","detectBrowser","edge","safari","opera","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","cssBorderSpacing","borderSpacing","cssClass","docElement","eventCapture","addEventListener","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","threshold","sorted","field","sort","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","nodeList","querySelectorAll","parentNode","matchMedia","pushState","history","hashChange","customElements","MSPointerEvent","PointerEvent","kineticScrollNeeded","down","up","in","out","enabled","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","kendoRemoveClass","kendoToggleClass","toggle","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","mousedown","mouseup","mousemove","mousecancel","click","resize","members","widgets","_widgetRegisteredCallbacks","ui","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","isLocalUrl","url","expression","safe","getter","setter","accessor","get","set","guid","random","id","roleSelector","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","console","suppressLog","log","dataSource","angular","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_setEvents","force","getSize","currentSize","_size","_resize","dimensions","setSize","destroy","removeData","_destroy","_muteAngularRebind","_muteRebind","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","domElement","offsetHeight","notify","initWidget","roles","fullPath","widgetKeyRegExp","widgetKey","nodeType","isEmptyObject","rolesFromNamespaces","namespaces","find","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","nullObject","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","appLevelNativeScrolling","application","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","editorToolbar","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","applyEventMap","pop","search","touchstart","touchend","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","findZone","zones","until","zoneRules","zoneAndRule","info","fromOffset","toOffset","diff","fromLocalOffset","toLocalOffset","tempToOffset","toLocalDate","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","lastDayOfMonth","last","timeOffset","moveDateToWeekStart","weekStartDay","addDays","calcWeekInYear","firstWeekInYear","newDate","diffInMS","MS_PER_DAY","weekInYear","prevWeekDate","nextWeekDate","weekNumber","toUtcTime","toInvariantTime","isInTimeRange","msValue","msMin","msMax","isInDateRange","setTime","ignoreDST","difference","MS_PER_MINUTE","today","isToday","staticDate","nextDay","previousDay","MS_PER_HOUR","stripWhitespace","iterator","child","createNodeIterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","nodeValue","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","queueAnimation","runNextAnimation","parseQueryStringParams","queryString","params","paramParts","decodeURIComponent","elementUnderCursor","x","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","throttled","lastExecTime","elapsed","caret","rangeElement","rangeDuplicated","selectionStart","selectionEnd","isPosition","focus","setSelectionRange","selection","createTextRange","collapse","moveStart","moveEnd","select","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","text","compileMobileDirective","scope","injector","invoke","$compile","$$phase","$digest","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","matchesMedia","mediaQuery","media","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","fileSaver","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","downloadAttribute","saveAs","save","forceProxy","proxyModelSetters","observable","forEach","defineProperty","dirty","amd","a1","a2","a3","parseInteger","parseCSS","propertyName","acc","strip3DTransforms","transformProps","transform2d","normalizeCSS","lowerKey","isTransformed","transformation","cssValues","TRANSFORM","animationProperty","transform","computed","NONE","matrix3dRegExp","translateXRegExp","atan2","capitalize","word","createEffect","definition","effectClass","Effect","direction","opt1","opt2","opt3","theDirection","createToggleEffect","defaultStart","defaultEnd","IN_OUT","startValue","_startValue","endValue","_endValue","shouldHide","_shouldHide","prepare","_direction","startDataValue","startDataValueIsSet","_reverse","clipInHalf","vertical","HEIGHT","WIDTH","CLIPS","curProxy","EffectSet","FOUR_DIRECTIONS","TRANSFER_START_STATE","ROTATIONS","RESTORE_OVERFLOW","IGNORE_TRANSITION_EVENT_SELECTOR","Animation","Transition","scaleProperties","scale","scalex","scaley","scale3d","translateProperties","translate","translatex","translatey","translate3d","hasZoom","cssParamsRegExp","oldEffectsRegExp","singleEffectRegExp","unitRegExp","transform2units","rotate","skew","cssPrefix","BLANK","PX","AUTO","HIDDEN","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","POSITION","COMPLETE_CALLBACK","TRANSITION","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","transition","modifier","horizontal","stopQueue","val","transformValue","step","elem","now","cur","prop","exclusive","ease","mirror","redirectedEffect","resolved","$1","$2","effect","effectBody","timeoutID","stopTransitionCalled","stopTransition","oldKeys","speeds","merge","uniqueSort","unique","taskKeys","retainPosition","restore","run","jdx","childrenLength","effectName","deferred","Deferred","done","setReverse","addRestoreProperties","reset","setup","resolve","restoreCallback","effectSet","parsedEffects","useTransition","show","multiple","single","isFixed","originalPosition","dX","dY","currentValue","marginLeft","marginTop","_additionalEffects","play","additional","_duration","compositeRun","_complete","divisor","tmp","previous","previousDivisor","slideIn","margin","origin","setLength","oldLength","realLength","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","_container","rotation","zIndex","_clipInHalf","clip","append","face","_face","temporary","back","temp","reverseDirection","faceClone","backClone","staticPage","turningPage","transformStyle","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","originalOverflow","both","_tickProxy","_tick","_started","tick","onEnd","onCancel","timePassed","startDate","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","pow","easeOutBack","inner","outer","fitScale","absoluteURL","path","pathPrefix","regEx","host","hashDelimiter","bang","locationHash","stripRoot","root","fixHash","fixBang","CHANGE","BACK","SAME","CHECK_URL_INTERVAL","BROKEN_BACK_NAV","hashStrip","HistoryAdapter","forward","replaceLocation","PushStateAdapter","navigate","title","replaceState","normalize","pathname","change","normalizeCurrent","fixedUrl","hash","hashBang","HashAdapter","_id","_interval","setInterval","clearInterval","History","adapter","createAdapter","historyLength","locations","silent","_navigate","backCalled","decode","_checkUrl","newLength","navigatingInExisting","prev","backButtonPressed","namedParamReplace","optional","routeToRegExp","route","ignoreCase","escapeRegExp","optionalParam","namedParam","splatParam","stripUrl","INIT","ROUTE_MISSING","Route","_callback","queryStringParams","_back","worksWith","Router","routes","_urlChangedProxy","_sameProxy","_backProxy","initEventObject","sameProxy","_same","backProxy","urlChangedProxy","_urlChanged","same","toOdataFilter","useOdataFour","operator","logic","filters","odataFilters","odataFiltersVersionFour","stripMetadata","hex16","createBoundary","createDelimeter","boundary","close","NEWLINE","createCommand","transport","item","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","getOperationContent","content","DOUBLELINE","getOperations","collection","skipContent","requestBody","processCollection","colection","getBoundary","createBatchRequest","colections","batchURL","batch","headers","Content-Type","updated","destroyed","created","parseBatchResponse","responseText","changeBody","status","code","marker","jsonModel","responseMarkers","markerIndex","collections","models","passed","parse","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","isnullorempty","isnotnullorempty","isempty","isnotempty","mappers","pageSize","page","useVersionFour","$filter","orderby","order","$orderby","skip","$skip","take","$top","defaultDataType","read","dataType","schemas","odata","results","total","transports","jsonp","update","create","parameterMap","$inlinecount","$format","odata-v4","$count","ajax","success","response","responses","error","XmlDataReader","idField","xmlParse","model","errors","serialize","modelBase","Model","fields","xpathToMember","modelInstance","evaluate","record","_parse","xml","parseDOM","parsedNode","attribute","attributes","attributeCount","firstChild","nextSibling","intermediateResult","tree","parseXML","raw","readers","eventHandler","_notifyChange","equal","xtype","ytype","getFieldByName","fieldName","Query","normalizeSort","descriptor","descriptors","normalizeOperator","operatorMap","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","compareFilters","expr1","expr2","filters1","filters2","normalizeAggregate","expressions","normalizeGroup","compare","skipItemSorting","aggregates","normalizeGroupWithoutCompare","anyGroupDescriptorHasCompare","groupDescriptors","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","isNumber","isDate","serializeRecords","getters","originalFieldNames","fieldNames","originalName","setters","convertRecords","convertGroup","hasSubgroups","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","group","flatGroups","groups","indexFunction","groupIndex","itemIndex","groupsLength","indexFn","flattenGroups","at","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","serverGrouping","viewIndex","removeModel","uid","indexOfPristineModel","_defaultId","indexOfModel","comparer","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","inferSelect","firstField","secondField","optgroup","label","specified","inferTable","fieldIndex","cells","cell","empty","tbody","tBodies","rows","fieldCount","dataMethod","_data","_attachBubbleHandlers","inferList","list","textChild","textField","urlField","spriteCssClassField","imageUrlField","_loaded","hasChildren","ObservableObject","parsers","defaultValues","Comparer","StableComparer","operators","LocalTransport","RemoteTransport","Cache","DataReader","Transport","Node","Buffer","BatchBuffer","ASCENDING","CREATE","READ","UPDATE","DESTROY","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","crud","identity","o","wrapAll","json","object","howMany","thisArg","reduce","reduceRight","every","some","Symbol","_parent","_handlers","shouldSerialize","_set","paths","composite","isSetPrevented","isObservableArray","isDataSource","boolean","default","defaults","_initializers","dirtyFields","editable","initiator","accept","isNew","functionFields","nullable","defaultValue","localeCompare","combine","comparers","asc","valueA","valueB","__position","desc","textOp","impl","ignore","accentFoldingFiltering","toLocaleLowerCase","op","getMatchRegexp","esc","doesnotstartwith","n","doesnotendwith","doesnotmatch","filterExpr","and","or","fieldFunctions","operatorFunctions","==","equals","isequalto","equalto","!=","ne","notequals","isnotequalto","notequalto","notequal","<","islessthan","lessthan","less","<=","le","islessthanorequalto","lessthanequal",">","isgreaterthan","greaterthan","greater",">=","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","toArray","range","inPlace","orderBy","orderByDescending","compiled","predicate","allData","groupBy","groupValue","_sortForGrouping","_sortGroups","sum","average","process","customGroupSort","query","groupDescriptorsWithoutCompare","normalizedSort","groupDescriptorsWithoutSort","filterCallback","groupDescriptor","parameters","operation","_store","clear","store","inmemory","schema","dataFunction","groupsFunction","serializeFunction","serializeGetters","_dataAccessFunction","fromName","_wrapDataAccessBase","_map","_prefetch","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","_page","_sort","_filter","_group","_aggregate","_total","_shouldDetachObservableParents","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","inPlaceSort","online","sync","offlineData","_isServerGrouped","_push","_readData","_flatData","useRanges","getByUid","_getByUid","_storeData","_addRange","_process","_observeView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","pushed","autoSync","pristine","rangeSpan","_getCurrentRangeSpan","pristineData","_updatePristineForModel","_removeItems","removePristine","shouldRemovePristine","found","_eachItem","_removePristineForModel","hasGroups","_removeModelFromRanges","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","_change","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","reject","_promise","converted","_params","_queueRequest","isPrevented","_dequeueRequest","_readAggregates","replaceSubset","itemIds","j","_aggregateResult","_skip","endless","_changeHandler","updatePristine","timestamp","_timeStamp","_sortRanges","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","arrayType","_updateTotalForAction","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","dataToAggregate","_setFilterTotal","_mergeState","_currentRangeStart","moreItemsCount","remote","filterTotal","setDefaultValue","fetch","_query","next","totalPages","_pageableQueryOptions","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","_skipRequestsInProgress","_currentRequestTimeStamp","pageSkip","_processRangeData","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","_mergeGroups","prevGroup","paging","sorting","filtering","_prefetchSuccessHandler","_timeout","_multiplePrefetch","_removeModelFromRange","_updateRangesLength","rangesLength","mismatchFound","mismatchLength","lengthDifference","transportOptions","hasChildrenObject","childrenField","childrenOptions","_childrenOptions","_initChildren","_updateChildrenField","loaded","level","_childrenLoaded","load","_matchFilter","_hierarchicalFilter","_markHierarchicalQuery","_updateHierarchicalFilter","_find","_dataSource","viewSize","disablePrefetch","_prefetching","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","batchSize","batchBuffer","endreached","prefetching","prefetched","dataSourceBinding","bindingName","Binder","bindings","_dataBinding","dataBinding","_dataBound","dataBound","_itemChange","itemChange","bindElement","_ns","_parents","removedItems","unbindElementTree","all","addedItems","hds","addedDataItems","multiselect","dropdowntree","Select","MultiSelect","DropDownTree","treeview","retrievePrimitiveValues","dataValueField","bindingTargetForRole","WidgetBindingTarget","parseBindings","token","colonIndex","keyValueRegExp","createBindings","binding","childrenCopy","unbindElement","whiteSpaceRegExp","valueField","valueUpdate","valuePrimitive","autoBind","BindingTarget","Binding","TemplateBinding","EventBinding","dom","destroyWidget","bindingTarget","deleteExpando","removeAttribute","destroyWidgets","unbindElementChildren","namespace","TypedBinder","arraySplice","binders","VALUE","SOURCE","EVENTS","CHECKED","CSS","dependencies","_access","dependency","currentSource","parsedValue","_parseValue","readonly","dataFormat","invisible","_initChange","cloneNode","reference","insertBefore","checked","selectedIndex","selected","valueIndex","sourceValue","optionIndex","optionValue","check","_range","_valueIsObservableObject","_valueIsObservableArray","_source","valueLength","sourceItem","dataTextField","isObservableObject","cascadeFrom","listView","bound","_preselect","old","removeIndex","newValue","oldValues","selectedNode","nonPrimitiveValues","_isMultipleSelection","_getAllChecked","newValues","selectedValue","gantt","_isBound","scheduler","grid","arr","addLength","shifted","shiftedLength","toDestroy","hasValue","hasSource","hasEvents","hasChecked","hasCss","widgetBinding","specificBinders","applyBinding","binder","observableHierarchy","recursiveRead","parseTransition","transitionRegExp","SCRIPT","TRANSITION_START","TRANSITION_END","SHOW","HIDE","ATTACH","DETACH","sizzleErrorRegExp","bodyRegExp","LOAD_START","LOAD_COMPLETE","SHOW_START","SAME_VIEW_REQUESTED","VIEW_SHOW","VIEW_TYPE_DETERMINED","AFTER","classNames","stretchedView","footer","View","renderOnInit","_createElement","wrapInSections","_renderSections","_wrap","_evalTemplate","evalTemplate","_fragments","detachOnHide","detachOnDestroy","notInitialized","_eachFragment","ViewClone","triggerBeforeShow","triggerBeforeHide","showStart","showEnd","hideEnd","detach","purge","fragments","methodName","getElementById","contents","replaceWith","_wrapper","_createContent","_createHeader","_createFooter","ccontentElements","contentSelector","contentElement","Layout","containers","_createContainer","showIn","ViewContainer","Fragment","attach","running","after","locationID","previousEntry","theTransition","transitionData","ViewEngine","sandbox","_hideViews","rootView","layouts","viewContainer","showView","remoteViewURLPrefix","_findViewElement","reload","_createView","urlPath","wrapInner","_locate","$angular","_findViewElementById","_createSpaView","_createMobileView","defaultTransition","loader","getLayout","getLayoutProxy","modelScope","viewOptions","isJQueryPromise","fail","isNativePromise","hub","signalr","callbacks","_crud","server","touchDelta","touch1","touch2","x1","y1","x2","y2","dx","dy","center","distance","sqrt","getTouches","currentTarget","api","identifier","pointerId","withEachUpEvent","downEvents","OS","invalidZeroEvents","DEFAULT_MIN_HOLD","CLICK_DELAY","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","MOVE","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURESTART","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","mouse","pointer","ENABLE_GLOBAL_SURFACE","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","initialTouch","pressEvent","_clicks","supportDoubleTap","_moved","_finished","press","_holdTimeout","minHold","_trigger","_tap","_clickTimeout","_hold","_withinIgnoreThreshold","UserEvents","dispose","_start","endTime","activeTouches","isMoved","startTime","xDelta","yDelta","defaultAction","surfaceElement","preventIfMovingProxy","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","eventNS","surface","global","ownerDocument","pressed","touchAction","preventDragEvent","preventIfMoving","_isMoved","removeEventListener","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","which","_move","_eachTouch","_end","_click","pageX","pageY","matchingTouch","dict","defaultThreshold","numericCssPropery","within","containerBoundaries","minX","minY","maxX","maxY","checkTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","targetElement","destroyDroppable","groupName","droppables","scrollableViewPort","scrollableRoot","$window","findScrollableParent","autoScrollVelocity","mouseX","mouseY","rect","AUTO_SCROLL_AREA","lastDropTarget","Movable","DropTarget","DropTargetArea","Draggable","draggables","dropTargets","dropAreas","KEYUP","DRAGSTART","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","TapCapture","_press","_release","attachEvent","captureNext","cancelCapture","PaneDimension","forcedEnabled","measure","scrollSize","makeVirtual","virtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesturestart","gesture","gesturechange","coordinates","offsetX","offsetY","previousGesture","previousCenter","scaleDelta","scaleWith","TRANSFORM_STYLE","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","_cache","_activated","hold","_drag","_cancel","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","_updateHint","boundaries","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","currentTargetOffset","scopeTarget","scopeFrom","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","_lastEvent","_processMovement","_scrollCompenstation","_scrollVelocity","_scrollInterval","_withDropTarget","_autoScroll","yIsScrollable","xIsScrollable","isRootNode","yInBounds","xInBounds","compensation","initialTarget","utils","SNAPBACK_DURATION","SCROLLBAR_OPACITY","FRICTION","VELOCITY_MULTIPLIER","MAX_VELOCITY","OUT_OF_BOUNDS_FRICTION","ANIMATED_SCROLLER_PRECISION","RELEASECLASS","REFRESHCLASS","PULL","RESIZE","SCROLL","MOUSE_WHEEL_ID","ZoomSnapBack","tapCapture","DragInertia","freeze","_moveTo","paneAxis","_snapBack","velocityMultiplier","friction","snapBack","AnimatedScroller","_updateCoordinates","setCoordinates","setCallback","ScrollBar","elementSize","scrollMovable","alwaysVisible","paneSize","sizeRatio","visibility","avoidScrolling","pane","zoomSnapBack","animatedScroller","_native","prepend","scrollElement","fixedContainer","velocityX","velocityY","horizontalSwipe","originatedFromFixedContainer","verticalSwipe","scrollTo","mousewheelScrolling","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","_wheelScroll","_wheelTimeout","pullOffset","visibleScrollHints","pullTemplate","releaseTemplate","refreshTemplate","contentResized","_scale","zoomOut","animatedScrollTo","pullHandled","refreshHint","hintContainer","yinertia","xinertia","_paneChange","_dragEnd","scrollBar","tabKeyTrapNS","focusableNodesSelector","TabKeyTrap","OPEN","CLOSE","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","BODY","LOCATION","VISIBLE","EFFECTS","ACTIVE","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","MOUSEDOWN","DOCUMENT_ELEMENT","WINDOW","NS","Popup","parentPopup","collisions","collision","downEvent","anchor","_hovered","scrollArea","animation","open","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","_hideDirClass","_closing","_toggleResize","fixed","flipped","_position","_openAnimation","_showDirClass","_location","dirClass","skipEffects","openEffects","closeEffects","popup","ev","_resizeTimeout","_scrollableParents","_fit","viewPortSize","output","_flip","anchorSize","boxSize","siblingContainer","parentZIndex","viewportOffset","viewportWidth","viewportHeight","pos","anchorParent","offsets","flipPos","elementHeight","wrapperHeight","isWindow","origins","positions","siblings","_align","offsetParent","appendToOffset","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","anchorWidth","anchorHeight","trap","_keepInTrap","removeTrap","shouldTrap","sortedElements","_focusableElements","_sortFocusableElements","_nextFocusable","_focus","tabIndex","attrName","contentWindow","_haveSelectionRange","elementType","restoreTitle","restoreTitleAttributeForElement","saveTitleAttributeForElement","saveTitleAttributes","DOCUMENT","ARIAIDSUFFIX","DESCRIBEDBY","CONTENTLOAD","KCONTENTFRAME","TEMPLATE","IFRAMETEMPLATE","POSITIONS","REVERSE","DIRCLASSES","DIMENSIONS","DEFAULTCONTENT","Tooltip","_documentKeyDownHandler","_documentKeyDown","showOn","_showOn","_isShownOnMouseEnter","_isShownOnClick","_mouseenter","autoHide","_mouseleave","_isShownOnFocus","_blur","showAfter","hideAfter","callout","_show","_appendContent","iframe","contentOptions","showIframe","_ajaxRequest","_initPopup","activate","ariaId","_positionCallout","_offset","arrow","_closeButtonClick","_closePopup","elementOffset","offsetAmount","isTopLeft","isFlipped","marginRule","createPromise","promiseAll","util","hex","hue2rgb","p","q","parseColor","color","BaseColor","matchNamedColor","RGB","namedColors","Bytes","HSV","HSL","Color","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgrey","darkgreen","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","grey","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgrey","lightgreen","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","regexp","colorNames","toHSV","toRGB","toHex","toBytes","toCss","toCssRgba","rgb","r","toDisplay","other","c1","c2","NaN","h","ref","toHSL","l","resolvedColor","formatRegex","processor","channels","this$1","resolveColor","re","normalizeByte","padDigit","brightness","percBrightness","fromBytes","fromRGB","fromHSV","fromHSL","normalizeText","REPLACE_REGEX","SPACE","objectKey","hashKey","zeroSize","baseline","measureText","measureBox","TextMetrics","LRUCache","DEFAULT_OPTIONS","defaultMeasureBox","_length","put","entry","_head","_tail","newer","older","baselineMarkerSize","styleKey","cacheKey","cachedResult","baselineMarker","textStr","_baselineMarker","offsetTop","second","arabicToRoman","roman","defined","definitionId","defId","deg","radians","DEG_TO_RAD","encodeUTF8","fromCharCode","encodeBase64","chr1","chr2","chr3","enc1","enc2","enc3","enc4","utfInput","KEY_STR","eventCoordinates","eventElement","isTransparent","limitValue","mergeSort","cmp","ai","bi","rad","degrees","power","valueOrDefault","bindEvents","getBoundingClientRect","clientTop","clientLeft","elementStyles","stylesArray","getPixels","size$1","unbindEvents","setAccessor","geometryChange","getAccessor","defineAccessors","capitalized","toMatrix","matrix","Transformation","ellipseExtremeAngles","ry","extremeX","extremeY","geometryAccessor","_observerField","defineGeometryAccessors","tolerance","PRECISION","closeOrLess","lineIntersection","p0","p1","p2","p3","s1x","s2x","s1y","s2y","nx","ny","Point","calculateAngle","cx","cy","cos","sin","normalizeArcParameters","cosine","sine","xT","yT","xt2","yt2","rx2","ry2","constT","cxT","cyT","uX","uY","vX","vY","startAngle","angleCosine","angle","endAngle","signEndAngle","largeArc","swipe","acos","radiusX","radiusY","xRotation","bboxStartAngle","pointAccessor","definePointAccessors","isOutOfEndPoint","endPoint","controlPoint","point","rotatedPoint","transformCopy","calculateCurveAt","points","t1","toCubicPolynomial","numberSign","solveQuadraticEquation","squareRoot","solveCubicEquation","Q","b3a","y3","z1","z2","ComplexNumber","nthRoot","multiplyConstant","negate","multiply","isReal","real","hasRootsInRange","rootField","intersection","polynomial","roots","curveIntersectionsCount","bbox","rayIntersection","intersectsRay","bottomRight","lineIntersectionsCount","intersects","arrayLimits","MAX_NUM","MIN_NUM","elementsBoundingBox","applyTransform","boundingBox","elementBoundingBox","rawBBox","Rect","union","elementsClippedBoundingBox","clippedBBox","toLineParamaters","isVertical","insertPosition","reflectionPoint","scaleCopy","quadraticToCubicControlPoints","scaledPoint","controlOut","translateWith","third","controlIn","parseParameters","SPLIT_REGEX","translateToPoint","transofrm","alignStart","align","sizeField","alignStartReverse","alignElements","alignment","vAlign","stackElements","stackAxis","otherAxis","previousBBox","createStackElements","stack","vStack","getStacks","maxSize","stacks","stackSize","addElementToStack","wrapElements","startElement","elementIdx","vWrap","fit","rectSize","transform$$1","optionsAccessor","defineOptionsAccessors","swing","PI","linear","easeOutElastic","asin","renderAttr","renderAllAttr","attrs","renderStyle","isDefinition","baseUrl","hashIndex","getElementsByTagName","supportBrowser","alignToScreen","ctm","getScreenCTM","decodeEntities","ENTITY_REGEX","innerText","exportGroup","exportRoot","svg","RootNode","skipBaseHref","rootGroup","getOrigin","Group","SVG_NS","renderPath","ctx","segment","prevSeg","prevOut","segments","bezierCurveTo","lineTo","closed","closePath","zIndexComparer","_zIndex","addGradientStops","gradient","stops","addColorStop","exportImage","surfaceOptions","cors","Surface$3","suspendTracking","draw","image","exportSVG","slice$1","thing","cls","classList","setCSS","getXY","drawDOM","doOne","setTransform","nodeInfo","_clipbox","_matrix","Matrix","unit","_stackingContext","_avoidLinks","avoidLinks","renderElement","makeTemplate","template$$1","firstElementChild","handlePageBreaks","forceBreak","pageWidth","pageHeight","doPageBreak","splitElement","makePage","pages","pageNum","cacheImages","whenImagesAreActuallyLoaded","keepTogether","adjust","tag","bottomPadding","bottomBorder","saveAdjust","isFirst","fall","tableLayout","breakAtElement","fallsOnMargin","splitText","firstInParent","colgroup","thead","gridHead","querySelector","repeatHeaders","doc","setStartBefore","setEndBefore","extractContents","preventBulletOnListItem","padding","pageClassName","available","nextnode","selectNodeContents","findEOP","setEnd","endOffset","li","_destructive","cloneNodes","tfoot","ol","paddingLeft","paddingRight","beforePageBreak","pdf","defineFont","getFontFaces","forcePageBreak","hasPaperSize","paperSize","paperOptions","getPaperOptions","def","hasMargin","multiPage","_ignoreMargin","canceled","doStylesheet","ss","cssRules","ex","addRules","findFonts","font","splitProperty","getFontURL","styleSheet","family","bold","italic","addRule","styleSheets","getCounter","getAllCounters","getPrototypeOf","incCounter","inc","_root","resetCounter","doCounters","updateCounters","counterIncrement","counterReset","parseColor$1","pending","img","images","onload","onerror","IMAGE_CACHE","urls","dive","parseBackgroundImage","bg","Image","crossOrigin","alphaNumeral","pushNodeInfo","decoration","createsStackingContext","popNodeInfo","updateClipbox","intersect","emptyClipbox","cb","pseudoElt","defa","microsoft","pleaseSetPropertyValue","important","setProperty","getBorder","side","saveStyle","getBorderRadius","sanitizeRadius","getContentBox","wt","wr","wb","wl","getTransform","radiansToDegrees","parseAngle","num","shape","setClipping","clipPath","addArcToPath","Arc$2","curvePoints","curveTo","adjustBorderRadiusForBox","rTL","rTR","rBR","rBL","tl_x","tl_y","tr_x","tr_y","br_x","br_y","bl_x","bl_y","tl","tr","br","bl","elementRoundBox","bt","bb","pt","pr","pb","pl","roundBox","rTL0","rTR0","rBR0","rBL0","Path","fill","stroke","formatCounter","evalPseudoElementContent","displayCounter","separator","getCssText","_renderWithPseudoElements","pseudo","kind","place","psel","KENDO_PSEUDO_ELEMENT","fake","saveClass","_renderElement","adjustBoxes","boxes","tableBorderLeft","tableBorderTop","tableBox","firstCell","firstCellBox","drawEdge","Wtop","Wleft","Wright","rl","rr","drawRoundCorner","ri","anticlockwise","drawBackground","background","backgroundColor","backgroundImage","drawOneBackground","backgroundRepeat","backgroundPosition","backgroundOrigin","backgroundSize","drawBackgroundImage","img_width","img_height","renderBG","rewX","rewY","repeatX","aspect_ratio","orgBox","Image$1","gradientRenderer","drawBullet","_drawBullet","bullet","listStylePosition","textAlign","elementIndex","listStyleType","fontSize","lineHeight","fontFamily","disc","circle","square","drawOneBox","isLast","inv","shouldDrawLeft","shouldDrawRight","textOverflow","saveTextOverflow","innerbox","getClientRects","_pdfLink","clipit","isFormField","maybeRenderWidget","renderContents","pxlen","scaledAngle","implicit","atan","fromRect","LinearGradient","userSpace","visual","wrap$$1","_kendoExportVisual","exportDOMVisual","exportVisual","renderImage","zIndexSort","sa","sb","za","zb","pa","getSelectedOption","selectedOptions","renderCheckbox","Circle","Circle$2","renderFormField","whiteSpace","floats","floating","toDataURL","renderText","actuallyGetRangeBoundingRect","rectangles","Infinity","prevLineBottom","doChunk","cc","origStart","setStart","isJustified","columnCount","findEOL","eol","estimateLineLength","startOffset","drawText","getFontHeight","textTransform","TextRect","decorate","line","ypos","underline","lineThrough","overline","align$$1","hasDecoration","selectNode","groupInStackingContext","main","_dom_zIndex","invert","mmul","multiplyCopy","b1","d1","e1","b2","d2","e2","kendoDrawing","kendoDrawingUtil","kendoUtil","ObserversMixin","OptionsStore","Size","Element$1","PI_DIV_2","GRADIENT","Paintable","IDENTITY_MATRIX_HASH","Measurable","DEFAULT_STROKE","MAX_INTERVAL","pow$1","ElementsArray","GeometryElementsArray","Segment","MultiPath","ShapeMap","SEGMENT_REGEX","PathParser","DEFAULT_STROKE$1","Arc","DEFAULT_FONT","DEFAULT_FILL","Text","Traversable","forEachReverse","Rect$2","StopsArray","GradientStop","Gradient","RadialGradient","easingFunctions","AnimationFactory","SurfaceFactory","Surface","BaseNode","NODE_MAP","renderSVG","testFragment","testContainer","hasParser","renderSVG$1","DefinitionMap","GradientStopNode","GradientNode","LinearGradientNode","RadialGradientNode","ClipNode","DefinitionNode","RTL","Surface$1","GroupNode","DASH_ARRAYS","SOLID","BUTT","ATTRIBUTE_MAP","PathNode","ArcNode","CircleNode","RectNode","ImageNode","TextNode","MultiPathNode","geometry","NODE_MAP$2","Node$2","GroupNode$2","FRAME_DELAY","RootNode$2","QuadRoot","QuadNode","ROOT_SIZE","LEVEL_STEP","MAX_LEVEL","ShapesQuadTree","SurfaceCursor","PathNode$2","ArcNode$2","CircleNode$2","RectNode$2","ImageNode$2","TextNode$2","MultiPathNode$2","canvas","inBrowser","observers","_observers","addObserver","removeObserver","observer","_suspended","optionsChange","suspend","resume","1","10","100","20","200","30","300","40","400","5","50","500","6","60","600","7","70","700","8","80","800","9","90","900","1000","MAX_VALUE","parentObj","_clear","wrapped","det","scaleX","scaleY","IDENTITY","originPoint","distanceTo","doRound","arg0","arg1","arguments$1","minPoint","maxPoint","defineProperties","setOrigin","topLeft","topRight","bottomLeft","fromPoints","expand","expandCopy","containsPoint","_isOnPath","rectOuter","rectInner","rect1","rect2","_optionsChange","parentTransform","parentMatrix","currentTransform","elementTransform","elementMatrix","combinedMatrix","_clippedBBox","transformedPoint","_hasFill","_containsPoint","_hasStroke","setCenter","setRadius","getCenter","pointAt","_pointAt","currentPointX","currentPointY","currentPoint","extremeAngles","inCircle","pointDistance","newFill","strokeWidth","matrixHash","_bboxCache","_matrixHash","_bbox","_geometry","radian","nextAngle","interval","_arcInterval","intervalAngle","subIntervalsCount","subIntervalAngle","currentAngle","_intervalCurvePoints","cp1","cp2","currentAngleX","currentAngleY","oldStart","p1Derivative","_derivativeAt","p2Derivative","inAngleRange","angleRad","pointRadius","startPoint","arcParameters","_splice","_add","_remove","_clearObserver","_setObserver","cNumber","addConstant","rad$$1","nthR","bboxTo","toSegment","segmentAnchor","toSegmentAnchor","_curveBoundingBox","_lineBoundingBox","extremesX","_curveExtremesFor","extremesY","xLimits","yLimits","extremes","_curveExtremes","x3","x4","t2","_intersectionsTo","intersectionsCount","_isOnCurveTo","endSegment","p4","rotatedPoints","_isOnLineTo","_isOnPathTo","isOnPath","arc","arcTo","isRelative","lastControlIn","previousCommand","cubicControlPoints","lastSegment","multiPath","lineJoin","_addArcSegments","pathWidth","segmentBox","fromArc","toPath","metrics","_rect","traverse","childrenChange","_reparent","insertAt","removeAt","newParent","alignContent","justifyContent","alignItems","spacing","orientation","lineSpacing","revers","_fieldMap","_initMap","fieldMap","groupsSizeField","groupAxis","groupsAxis","justifyAlign","reflow","groupsSize","ref$1","groupOrigin","elementOrigin","groupStart","elementStart","groupBox","arrangeElements","groupIdx","scaledStart","scaledSize","newStart","_initGroups","lineSize","bboxes","_newGroup","addGroup","_addToGroup","arg","_createStops","_userSpace","addStop","removeStop","_radius","_fallbackFill","fallbackFill","_items","easing","finish","abort","loop","wallTime","easingPosition","_stopped","preferred","_handler","_mousemove","_visual","_enableTracking","domNode","_kendoNode","parentElement","srcElement","_suspendedTracking","resumeTracking","_elementOffset","paddingTop","_surfacePoint","coord","observe","removeSelf","invalidate","DOMParser","namespaceURI","parser","chartDoc","parseFromString","importedDoc","adoptNode","definitions","clearDefinitions","childNode","createDefinitions","attachTo","setElement","nodes","childElement","renderChildren","updateDefinition","allAttr","allCss","mapTransform","renderTransform","transformChange","mapStyle","cursor","renderOpacity","renderId","hasDefinitions","definitionChange","refUrl","renderDefinitions","mapDefinitions","baseHref","renderOffset","loadStops","stopNode","mapCoordinates","renderCoordinates","mapSpace","definitionMap","addDefinitions","removeDefinitions","createDefinition","addDefinition","mapItem","removeDefinition","defs","rtl","_template","_rootElement","mouseover","mouseout","viewBox","implementation","hasFeature","dot","dash","longdash","dashdot","longdashdot","longdashdotdot","fill.opacity","stroke.color","stroke.width","stroke.opacity","renderData","mapFill","mapStroke","printPath","currentType","segmentType","printPoints","segmentStart","segmentEnd","renderLinecap","dashType","renderDashType","renderStroke","dashArray","lineCap","renderFill","mapPosition","mapSource","renderPosition","encode","renderSource","setY","renderContent","renderTextAnchor","initClip","clearClip","setClip","beginPath","loadElements","setOpacity","globalAlpha","opactity","renderTo","getContext","invalidateHandler","_invalidate","clearRect","shapes","_quadNode","pointShapes","inBounds","nodeRect","nodeBottomRight","inserted","halfWidth","halfHeight","initRoots","rootMap","rootElements","pointShape","sectorRoot","assignZindex","levelWeight","bboxChange","_insertShape","elementsArray","_insert","sectors","getSectors","inRoot","bottomX","bottomY","_resetCursor","_shapeCursor","_current","_defaultCursor","_getCursor","_setCursor","_mouseTrackHandler","_trackMouse","_searchTree","_cursor","resolveDataURL","rootElement","loadingStates","currentShape","_currentShape","renderPoints","setLineDash","setLineCap","setLineJoin","setFill","setStroke","hasFill","setGradientFill","fillStyle","createLinearGradient","createRadialGradient","strokeStyle","lineWidth","mozDash","webkitLineDash","onLoad","onError","drawImage","fillText","strokeText","_pdfRect","$el","$clone","canvases","canvas$$1","skip_ws","tok_whitespace","read_stop","tok_length","tok_percent","read_linear_gradient","propName","to1","to2","tok_popen","tok_angle","tok_comma","tok_keyword","tok_pclose","read_url","tok_content","tok","cache1","tok_linear_gradient","tok_url","cache2","looking_at","last$$1","in_paren","in_string","TOOLTIP_TEMPLATE","TOOLTIP_CLOSE_TEMPLATE","SurfaceTooltip","_tooltipOptions","popupOptions","_openPopupHandler","_openPopup","_bindEvents","hideDelay","_showHandler","_showEvent","_surfaceLeaveHandler","_surfaceLeave","_mouseleaveHandler","_mousemoveHandler","_hideClick","_tooltipLeave","getPopup","shared","_tooltipShape","tooltip","_updateContent","tooltipOffset","_instance","surfaceOffset","_showTimeout","_autoHide","_measure","_closeButton","_popupRelatedTarget","DrawingSurface","_triggerInstanceHandler","_triggerInstanceEvent","_bindHandler","hideTooltip","_tooltip","showTooltip","classArray","SPACE_REGEX","alignPathToPixel","clockwise","angle1","angle2","isString","convertableToNumber","isObject","styleValue","isSizeField","SIZE_STYLES_REGEX","field$1","getSpacing","defaultSpacing","getTemplate","TemplateService","hasClasses","interpolateValue","COORD_PRECISION","mousewheelDelta","setDefaultOptions","sparseArrayLimits","MIN_VALUE","autoMajorUnit","relativeValue","scaleMultiplier","DEFAULT_PRECISION","rotatePoint","theta","numericComparer","boxDiff","Box","innerRadialStops","currentStop","usedSpace","innerRadius","currentStops","rectToBox","createAxisTick","tickOptions","tickX","tickY","createAxisGridLine","gridLine","lineStart","lineEnd","absoluteDateDiff","offsetDiff","TIME_PER_MINUTE","addTicks","ticks","toDate","startOfWeek","daysToSubtract","TIME_PER_DAY","addHours","tzDiff","roundedDate","setMinutes","TIME_PER_HOUR","addDuration","dateValue","YEARS","MONTHS","WEEKS","DAYS","HOURS","MINUTES","setSeconds","SECONDS","TIME_PER_SECOND","MILLISECONDS","setMilliseconds","floorDate","ceilDate","dateComparer","dateDiff","toTime","dateEquals","timeIndex","baseUnit","TIME_PER_UNIT","dateIndex","baseUnitStep","lteDateIndex","sortedDates","currentDate","low","high","intlService","parseDates","dates","categoryRange","categories","autoBaseUnit","startUnit","startStep","unitSteps","nextStep","categoryLimits","span","autoBaseUnitSteps","maxDateGroups","autoUnit","FIT","autoUnitIx","BASE_UNITS","units","totalUnits","defaultBaseUnit","lastCategory","categoryIx","category","minDiff","TIME_PER_YEAR","TIME_PER_MONTH","TIME_PER_WEEK","initUnit","useDefault","autoAxisMin","narrow","axisMin","minValue","ZERO_THRESHOLD","autoAxisMax","axisMax","maxValue","limitCoordinate","COORDINATE_LIMIT","autoAxisOptions","seriesMin","seriesMax","narrowRange","autoMin","autoMax","majorUnit","autoOptions","roundToMajorUnit","remainderClose","totalAxisOptions","clearNullValues","axisOptions","userOptions","userSetMin","userSetMax","userSetLimits","minorUnit","ratio","remainder","timeUnits","applyDefaults","baseUnitTime","userMajorUnit","actualUnits","unitsToAdd","head","tail","initRange","axisCrossingValue","throwNegativeValuesError","autoAxisMin$1","autoAxisMax$1","logMaxRemainder","angularDistance","geometryTransform","__common_getter_js","ARC","AXIS_LABEL_CLICK","BLACK","CIRCLE","CROSS","DATE","DEFAULT_HEIGHT","DEFAULT_WIDTH","FORMAT_REGEX","HIGHLIGHT_ZINDEX","INSIDE","NOTE_CLICK","NOTE_HOVER","NOTE_LEAVE","OUTSIDE","TRIANGLE","WHITE","X","constants","defaultImplementation","IntlService","FORMAT_REPLACE_REGEX","FormatService","ChartService","current$1","DomEventsBuilder","current$2","services","HashMap","TRIGGER","InstanceObserver","FontLoader","Ring","Sector","DIRECTION_ANGLE","ShapeBuilder","ChartElement","BoxElement","ShapeElement","LINEAR","RADIAL","GRADIENTS","RootElement","FloatElement","DrawingText","ROWS_SPLIT_REGEX","TextBox","Title","AxisLabel","DEFAULT_ICON_SIZE","DEFAULT_LABEL_COLOR","Note","Axis","TIME_PER_MILLISECOND","MIN_CATEGORY_POINTS_RANGE","CategoryAxis","DateLabelFormats","EmptyDateRange","DateRange","DateCategoryAxis","MIN_VALUE_RANGE","NumericAxis","DateValueAxis","DEFAULT_MAJOR_UNIT","LogarithmicAxis","GridLinesMixin","RadarCategoryAxis","PolarAxis","RadarNumericAxisMixin","RadarNumericAxis","RadarLogarithmicAxis","WEIGHT","EXTREMUM_ALLOWED_DEVIATION","CurveProcessor","userImplementation","_intlService","auto","formatString","intl","localeAuto","locale","chart","isPannable","pannable","lock","_key","handlerMap","callObserver","fnName","requiresHandlers","fetchFonts","fonts","depth","MAX_DEPTH","loadFonts","Promise","preloadFonts","cosT","sinT","onCircle","targetBox","wrapPoint","arrayPoint","snapTo","alignTo","targetCenter","shrink","dw","dh","unpad","getHash","overlaps","r1","r2","r3","r4","toRect","hasSize","sizeFunc","middle","newRadius","radianAngle","ax","ay","adjacentBox","sector","midAndle","midPoint","hw","hh","ca","vector","startVector","endVector","dist","getBBox","angles","allAngles","startAngleIndex","endAngleIndex","createRing","innerEnd","initUserOptions","currentChild","getRoot","getSender","service","getService","chartService","translateChildren","childrenCount","renderVisual","createVisual","addVisual","createAnimation","renderComplete","chartElement","appendVisual","childVisual","noclip","clipRoot","stackRoot","stackVisual","isStackRoot","sibling","here","visuals","matched","hasHighlight","highlight","createHighlight","toggleHighlight","highlightOptions","customVisual","_highlight","highlightVisualArgs","series","runningTotal","createGradientOverlay","gradientOptions","overlay","createGradient","shrinkToFit","hasSetSize","borderWidth","border","reflowPaddingBox","paddingBox","contentBox","hasBox","visualStyle","pointData","getElement","visualOptions","glass","sharpBevel","roundedBevel","roundedGlass","supportVML","sharpGlass","bubbleShadow","rootOptions","gradients","currentBox","createBackground","drawingGradient","hashCode","cleanGradients","_initDirection","elementAxis","groupSizeField","elementSizeField","groupSpacing","elementSpacing","vSpacing","reflowChildren","groupElements","groupElementsCount","elementSize$$1","groupElementStart","elementBox","groupOptions","maxGroupElementsSize","groupsCount","groupsStart","groupElementsSize","_initContainer","_autoReflow","rowIdx","floatElement","textOptions","visualBox","visualFn","_boxReflow","visualContext","normalBox","rotatedBox","rotationTransform","getDefaultVisual","boxCenter","buildTitle","defaultOptions","titleOptions","alignRotation","rotationMatrix","rotationOrigin","alignAxis","distanceAxis","axisAnchor","distanceLeft","distanceRight","alignEnd","alignCenter","icon","childAlias","noteTemplate","aliasFor","wrapperBox","linePoints","createLine","defaultVisual","eventArgs","over","labels","majorTickSize","minorTickSize","minorTicks","minorTickType","majorTicks","majorTickType","initFields","_deferLabels","createLabels","createTitle","createNotes","labelsRange","labelsCount","labelOptions","clearLabels","autoRotateLabels","createAxisLabel","clearTitle","lineBox","axisX","axisY","visualSize","note","notes","parseNoteValue","createPlotBands","gridLinesVisual","gridLines","_gridLines","createTicks","lineGroup","tickPositions","skipUnit","tickLineOptions","getMajorTickPositions","getMinorTickPositions","_alignLines","_lineGroup","getActualTickSize","tickSize","_backgroundPath","altAxis","slotX","slotY","bandRect","plotBands","plotArea","_plotbandGroup","axes","getSlot","createGridLines","axisLineVisible","linePos","lineOptions","minorGridLines","majorGridLines","labelSize","sizeFn","titleSize","rootBox","maxLabelSize","arrangeTitle","arrangeLabels","arrangeNotes","getLabelsTickPositions","labelTickIndex","tickIx","labelPos","labelBox","firstTickPosition","nextTickPosition","labelX","labelY","labelsBetweenTicks","labelOffset","idx$1","slot","shouldRenderNote","noteSlot","secondAxis","axisLabelText","tmpl","limit","lastLabel","maxLabelOffset","startTick","endTick","offsetField","startPosition","endPosition","maxStartOffset","maxEndOffset","limitRange","rangeSize","valueRange","justified","prepareUserOptions","years","weeks","_ticks","categoriesHash","definedMin","definedMax","srcCategories","rangeIndices","totalRange","totalRangeIndices","roundedRange","_seriesMax","scaleOptions","hideOutOfRangeLabels","valueAxis","firstLabel","getTicks","labelTicks","tickIndices","stepSize","indices","getTickPositions","hasMinor","_hash","filterOutOfRangePositions","slotBox","singleSlot","limitSlot","limittedSlot","categoryIndex","pointCategoryIndex","getCategory","totalIndex","categoryAt","categoriesCount","translateRange","zoomRange","rate","totalMin","totalMax","scaleRange","hideOutOfRangeNotes","pan","pointsRange","diffStart","diffEnd","rangeMin","rangeMax","_categoriesMap","currentRangeIndices","totalCount","mapCategories","map$$1","displayIndices","displayRange","valuesCount","dateAt","roundToBaseUnit","lowerEnd","expandEnd","roundToTotalStep","justifyEnd","valueStart","displayStart","valueEnd","displayEnd","minIdx","maxIdx","_indices","_values","upper","roundedStep","dataRange","maxDivisions","divisionOptions","dataRangeOptions","_parsed","panning","userSetBaseUnit","userSetBaseUnitStep","divisionRange","rounds","totalLimits","panRange","isEmpty","datesRange","indicesRange","maxDiff","rangeDiff","baseUnitIndex","autoBaseUnitStep","stepIndex","unitFormat","dateFormats","dateRange","totalOptions","totalMajorUnit","getDivisions","stepValue","divisions","startEdge","skipStep","getValue","valueOffset","isValidRange","newRange","axisCrossingValues","timeRange","exact","limittedRange","logMin","logMax","floorMax","traverseMajorTicksPositions","tickPosition","traverseMinorTicksPositions","_lineOptions","minorOptions","ref$2","_minorIntervalOptions","minorStep","acceptOptionsRange","acceptNewRange","nextValue","majorAngles","minorAngles","skipMajor","majorGridLineAngles","renderMajorGridLines","minorGridLineAngles","renderMinorGridLines","renderGridLines","radiusCallback","gridLineAngles","skipAngles","divs","intervals","altAxisVisible","alpha","reflowLabels","skipOption","stepOption","divCount","divAngle","majorIntervals","minorIntervals","minorAngle","minorRadius","band","ring","plotBandSlot","slotStart","toValue","slots","totalDivs","slotAngle","fromValue","instanceOptions","bandStyle","polarAxis","plotBandPoints","innerPoints","outerPoints","innerCircle","outerCircle","radarMajorGridLinePositions","radarMinorGridLinePositions","tickRadius","angleIx","midAngle","gamma","beta","axisType","minorSkipStep","dataPoints","tangent","initialControlPoint","lastControlPoint","controlPoints","tangent$1","cp0","controlPoints$1","controlPoints$2","tangent$2","removeDuplicates","firstControlPoint","secondControlPoint","invertAxis","lineFunction","calculateFunction","isLine","monotonic","oldXField","xField","yField","restrict","switchOrientation","isMonotonicByField","restrictControlPoint","cp","xValue","yValue","Gradients","SASS_THEMES","ExportMixin","skipLegacy","exportPDF","imageDataURL","Point2D","Box2D","mwDelta","BAR_GAP","BAR_SPACING","SANS","SANS11","SANS12","SANS16","TRANSPARENT","axisDefaults","areaSeries","rangeAreaSeries","barSeries","boxPlotSeries","bubbleSeries","bulletSeries","candlestickSeries","columnSeries","donutSeries","lineSeries","ohlcSeries","radarAreaSeries","radarLineSeries","rangeBarSeries","rangeColumnSeries","scatterLineSeries","waterfallSeries","pieSeries","funnelSeries","seriesDefaults","legend","baseTheme","markers","outliersField","meanField","_brightness","downColor","whiskers","mean","median","area","rangeArea","verticalRangeArea","bar","boxPlot","bubble","candlestick","column","pie","donut","funnel","horizontalWaterfall","ohlc","radarArea","radarLine","polarArea","polarLine","rangeBar","rangeColumn","scatterLine","verticalArea","verticalBoxPlot","verticalBullet","verticalLine","waterfall","categoryAxis","chartBaseTheme","autoTheme","mapColor","varName","queryStyle","hook","theme","defaultFont","titleFont","labelFont","letterPos","letter","seriesPos","seriesColors","fuse","arr1","arr2","gaugeBaseTheme","diagramBaseTheme","shapeDefaults","hover","handles","selectable","connectionDefaults","tools","registerTheme","themeName","gauge","diagram","treeMap","inactiveItems","errorBars","scatter","chartArea","crosshair","rangePlaceholderColor","connectorDefaults","thumb","colors","connectors","noteStyle","AXIS","TEXT","INACTIVE","INACTIVE_SHAPE","AXIS_MINOR","SERIES","SERIES_LIGHT","PRIMARY","DIAGRAM_HOVER","sass","findAxisByName","ChartAxis","countNumbers","getField","row","evalOptions","dryRun","needsEval","excluded","MAX_EXPAND_DEPTH","seriesCount","toGeometryPoint","lintPoint","stepAxis","stepDir","GeometryPoint","anyHasZIndex","hasGradientOverlay","areNumbers","wrapData","seriesItem","paneID","ID","appendIfNotNull","segmentVisible","pointVisibility","bindSegments","SeriesBinder","bindPoint","valueFields","equalsIgnoreCase","filterSeriesByType","currentSeries","seriesTypes","getDateField","isDateAxis","sampleCategory","dateCategory","singleItemOrArray","seriesMissingValues","missingValues","AREA_REGEX","INTERPOLATE","hasValue$1","findNext","pointHasValue","outPoint","getter$$1","hasItem","createOutOfRangePoints","hasMinPoint","hasMaxPoint","_outOfRangeMinPoint","_outOfRangeMaxPoint","axisGroupBox","axisBox","paneAnchor","setValue","updateAxisOptions","targetOptions","axesOptions","axisIndex","groupSeries","axisIx","acceptKey","mouseKey","ctrlKey","altKey","toChartAxisRanges","axisRanges","axisRange","createDiv","closestHandle","updateAxisOptions$1","yAxis","xAxis","tooltipAlignment","RAD_60","RAD_30","uat","ub","xComparer","resolveAxisAliases","alias","aliases","AXIS_NAMES","pointByCategoryName","applyAxisDefaults","themeOptions","mapAxisOptions","axisColor","themeAxisDefaults","axisName","applySeriesDefaults","seriesType","baseOptions","seriesLength","commonDefaults","themeSeriesDefaults","commonThemeDefaults","cleanupNestedSeriesDefaults","_defaults","sortDates","uniqueDates","srcDates","transpose","rowIx","colCount","colIx","rowCount","clearMissingValues","originalOptions","fieldValue","originalValue","nullValue","DATA_FIELDS","triggerPaneRender","panes","notifyRender","datavizConstants","ChartPane","ChartPlotArea","Aggregates","STD_ERR","STD_DEV","percentRegex","standardDeviationRegex","ErrorRangeCalculator","INITIAL_ANIMATION_DURATION","FADEIN","GLASS","BORDER_BRIGHTNESS","TOOLTIP_OFFSET","START_SCALE","ERROR_LOW_FIELD","ERROR_HIGH_FIELD","X_ERROR_LOW_FIELD","X_ERROR_HIGH_FIELD","Y_ERROR_LOW_FIELD","Y_ERROR_HIGH_FIELD","LINE_MARKER_SIZE","GAP","ABOVE","BELOW","SMOOTH","STEP","AREA","BAR","BOX_PLOT","BUBBLE","BULLET","CANDLESTICK","COLUMN","DONUT","FUNNEL","HORIZONTAL_WATERFALL","LINE","OHLC","PIE","POLAR_AREA","POLAR_LINE","POLAR_SCATTER","RADAR_AREA","RADAR_COLUMN","RADAR_LINE","RANGE_AREA","RANGE_BAR","RANGE_COLUMN","SCATTER","SCATTER_LINE","VERTICAL_AREA","VERTICAL_BOX_PLOT","VERTICAL_BULLET","VERTICAL_LINE","VERTICAL_RANGE_AREA","WATERFALL","EQUALLY_SPACED_SERIES","LEGEND_ITEM_CLICK","LEGEND_ITEM_HOVER","LEGEND_ITEM_LEAVE","SERIES_CLICK","SERIES_HOVER","SERIES_OVER","SERIES_LEAVE","PLOT_AREA_CLICK","PLOT_AREA_HOVER","PLOT_AREA_LEAVE","DRAG_END","DRAG_START","ZOOM_START","ZOOM","ZOOM_END","SELECT_START","SELECT_END","RENDER","SHOW_TOOLTIP","HIDE_TOOLTIP","PANE_RENDER","LOGARITHMIC","CATEGORY","INSIDE_END","INSIDE_BASE","OUTSIDE_END","MOUSEWHEEL","MOUSEWHEEL_DELAY","DEFAULT_ERROR_BAR_WIDTH","ErrorBarBase","CategoricalErrorBar","CategoricalChart","PointEventsMixin","NoteMixin","LinePoint","LineSegment","StepLineMixin","StepLineSegment","SplineSegment","LineChartMixin","ClipAnimation","ClipAnimationMixin","LineChart","AreaSegment","StepAreaSegment","SplineAreaSegment","AreaChart","AxisGroupRangeTracker","BarLabel","BAR_ALIGN_MIN_WIDTH","Bar","ClusterLayout","StackWrap","BarChart","Candlestick","CandlestickChart","BoxPlot","VerticalBoxPlot","BoxPlotChart","ScatterErrorBar","ScatterChart","Bubble","BubbleChart","Target","Bullet","BulletChart","BaseTooltip","CrosshairTooltip","Crosshair","ChartContainer","PlotAreaBase","allPaneAxes","PlotAreaEventsMixin","SeriesAggregator","DefaultAggregates","RangeBar","RangeBarChart","RangeLinePoint","DEFAULT_FROM_FORMAT","DEFAULT_TO_FORMAT","RangeAreaPoint","RangeAreaSegment","SplineRangeAreaSegment","StepRangeAreaSegment","RangeAreaChart","OHLCPoint","OHLCChart","WaterfallSegment","WaterfallChart","AREA_SERIES","OUT_OF_RANGE_SERIES","CategoricalPlotArea","Highlight","Pannable","ZoomSelection","MousewheelZoom","LegendLayout","LegendItem","HORIZONTAL","POINTER","CUSTOM","Legend","PlotAreaFactory","ZOOM_ACCELERATION","SELECTOR_HEIGHT_ADJUST","Selection","SharedTooltip","BarChartAnimation","BubbleAnimation","FadeInAnimation","PieAnimation","ScatterLineChart","XYPlotArea","PieSegment","PieChartMixin","PIE_SECTOR_ANIM_DELAY","PieChart","PiePlotArea","DonutSegment","DONUT_SECTOR_ANIM_DELAY","DonutChart","DonutPlotArea","DEFAULT_PADDING","PolarPlotAreaBase","PolarScatterChart","PolarLineChart","SplinePolarAreaSegment","PolarAreaSegment","PolarAreaChart","PolarPlotArea","RadarLineChart","SplineRadarAreaSegment","RadarAreaSegment","RadarAreaChart","RadarSegment","RadarClusterLayout","RadarStackLayout","RadarBarChart","RadarPlotArea","FunnelSegment","FunnelChart","FunnelPlotArea","COLOR","FIRST","FROM","MAX","MIN","NOTE_TEXT","SUMMARY_FIELD","TO","MOUSEMOVE","CONTEXTMENU","MOUSELEAVE","MOUSEMOVE_DELAY","Chart","_axis","chartsVisual","chartContainer","_pane","_plotArea","backgroundVisual","_bgVisual","sumOrNull","avg","_valueFields","_otherFields","_nullValue","_undefinedValue","otherFields","_makeValue","canonicalFields","pointIx","fieldData","srcValueFields","srcPointFields","_bindFromArray","sourceFields","_bindFromObject","initialValue","srcFields","srcFieldName","sourceFieldName","errorValue","initGlobalRanges","deviation","errorRange","standardError","deviationMatch","valueGetter","createValueGetter","getAverage","getStandardDeviation","globalRange","getStandardError","getErrorRange","pointValue","percentValue","isSample","squareDifferenceSum","endCaps","getAxis","valueBox","centerBox","capsWidth","getCapsWidth","capValue","capStart","capEnd","createDefaultVisual","seriesValueAxis","seriesCategoryAxis","valueAxisRanges","categoryPoints","seriesPoints","seriesOptions","_evalSeries","traverseDataPoints","addValue","pointOptions","seriesIx","pointType","invertAxes","plotValue","otherValues","categorySum","otherStack","isStacked100","plotRange","positive","prevValue","isStackedBar","otherValue","isStacked","categoryAxisCrossingValue","stackLimits","stackName","pIx","updateStackRange","limits","errorTotals","chartSeries","limitsCache","addErrorBar","lowValue","highValue","seriesErrorRanges","addPointErrorBar","stackedErrorRange","errorBar","updateRange","createPoint","owner","noteText","evalPointOptions","doEval","namedValueAxes","categorySlots","chartPoints","valueSlot","pointSlot","categorySlot","aboveAxis","stackValue","reflowPoint","reflowCategories","limitPoints","limitPoint","crossingValues","seriesIx$1","currentCategory","seriesIx$2","_outOfRangeCallback","_bindPoint","outOfRangePoint","bindCache","_bindCache","formatPointValue","createNote","tooltipTracking","labelTemplate","labelText","_rendered","createMarker","formatValue","markerBorder","markerBox","_childBox","childBox","noteTargetBox","reflowLabel","defaultColor","highlightVisual","halfSize","tooltipAnchor","horizontalAlign","verticalAlign","clipBox","overlapsBox","unclipElements","toGeometryPoints","segmentVisual","coords","getNearestPoint","calculateStepPoints","stepPoint","previousPoint","curveProcessor","curve","renderSegments","sortedPoints","pointCount","_segments","sortPoints","createSegment","_addSegment","assumeZero","nearestPoint","pointBox","allPoints","nearestPointDistance","_setEnd","setX","_setChildrenAnimation","animationPoints","prevSegment","stackPoints","createFill","createStroke","strokeSegments","_strokeSegments","createStrokeSegments","segmentsFromPoints","stackSegments","createStackSegments","hasStackSegment","fillSegments","hasStackSegments","fillToAxes","fillPath","crossingValue","endSlot","firstPoint","lastPoint","previousSegment","_gapStackPoints","stackPoint","_stackPoints","endIdx","pointOffset","currentSeriesIx","gapStackPoint","startIdx","_previousSegmentPoint","_createGapStackPoint","segmentIx","seriesIdx","chartAxisRanges","chartRange","textBox","alignToClipBox","parentBox","createLabel","rectVisual","createRect","strokeOpacity","getBorderColor","baseColor","borderColor","slotSize","positionAxis","clusterType","stackType","cluster","stackWrap","negativeColor","getStackWrap","stackGroup","wraps","_stackGroup","zeroSlot","_setAnimationOptions","pointVisual","mid","ocSlot","lhSlot","realBody","lines","reflowNote","_mainVisual","mainVisual","createOverlay","createBody","createLines","drawLines","lineStyle","normalColor","valueParts","splitValue","whiskerSlot","boxSlot","medianSlot","meanSlot","q1","q3","reflowBoxSlot","reflowWhiskerSlot","meanPoints","calcMeanPoints","whiskerPoints","calcWhiskerPoints","medianPoints","calcMedianPoints","renderOutliers","outlierValue","markersBorder","outliers","outerFence","reflowOutliers","filterOutliers","seriesAxes","_initFields","xAxisRanges","yAxisRanges","valueErrorField","lowField","highField","createMissingValue","xAxisName","yAxisName","xAxisRange","yAxisRange","namedXAxes","namedYAxes","currentSeriesPoints","highlightGroup","_maxSize","negativeValues","updateBubblesSize","pointsCount","animationOptions","minSize","minR","maxR","minArea","maxArea","areaRange","areaRatio","baseZIndex","targetValueSlot","targetSlotX","targetSlotY","targetSlot","bodyVisual","bulletOptions","getStyle","pointColor","paddingBottom","tooltipOptions","formatService","initAxisName","showAt","stickyMode","formattedValue","getAnchor","ref_options","moveLine","getBox","dim","axisLineBox","currentAxis","shouldClip","_clipBox","chartsBox","clipRect","unclipLabels","charts","appendAxis","appendAxisAt","appendChart","i$1","removeAxis","removeChart","allAxes","vGridLines","hGridLines","axisValueField","length$1","axis$1","lineBox$1","paneIndex","initSeries","crosshairs","createPanes","createCrosshairs","setTitle","currentPane","paneOptions","panesLength","currentCrosshair","removeCrosshairs","hideCrosshairs","findPane","matchingPane","findPointPane","axisToRemove","filteredAxes","chartToRemove","filteredCharts","addToLegend","seriesVisible","itemLabelOptions","markerColor","inactiveItemsLabels","visibleInLegend","active","groupAxes","paneIx","paneAxes","xAxes","yAxes","any","groupSeriesByPane","seriesByPane","seriesPaneName","filterVisibleSeries","reflowPanes","detachLabels","reflowAxes","reflowCharts","redraw","panesArray","crossingAxes","valuesToAdd","alignAxisTo","targetAxis","targetCrossingValue","slotEdge","targetEdge","alignAxes","paneId","anchorCrossings","pane$1","paneId$1","visible$1","anchor$1","anchorCrossings$1","xAnchor","yAnchor","xAnchorCrossings","yAnchorCrossings","leftAnchors","rightAnchors","topAnchors","bottomAnchors","_overlap","_mirrored","shrinkAxisWidth","overflowX","shrinkAxisHeight","shrinked","overflowY","fitAxes","paneBox","currentAxis$1","reflowPaneAxes","autoRotateAxisLabels","groupedAxes","rotated","chartPane","percents","currentPane$1","i$2","currentPane$2","remainingHeight","remainingPanes","autoHeightPanes","backgroundBox","axisA","axisB","axesCount","chartsBoxes","addBackgroundPaths","multipath","backgroundContainsPoint","pointsByCategoryIndex","pointsBySeriesIndex","seriesIndex","filterPoints","pointsBySeriesName","findPoint","paneByPoint","detachAxisGroupLabels","labelAxis","labelAxisCount","createLabelAxis","onAxis","_dispatchEvent","defaultAggregates","fieldAggregate","seriesFields","_seriesFields","rootAggregate","_series","_binder","canonicalName","aggregatePoints","srcPoints","srcValues","_bindPoints","firstDataItem","_bindField","fromOptions","toOptions","labelFrom","_createLabel","labelTo","plotLimits","initLabelsFormat","fromPoint","toPoint","copyFields","fromBox","toBox","positionLabels","fromLabelPosition","toLabelPosition","toPoints","fromSegments","fromPath","createCurveSegments","fromSlot","toSlot","oPoints","cPoints","lhPoints","oSlot","cSlot","createSegments","summary","totalCategories","prevPoint","namedCategoryAxes","valueAxisRangeTracker","stack100","createCategoryAxes","aggregateCategories","createCategoryAxesLabels","createCharts","createValueAxes","paneSeries","visibleSeries","groupIx","groupSeriesByCategoryAxis","createChartGroup","createAreaChart","createRangeAreaChart","createBarChart","createRangeBarChart","createBulletChart","createCandlestickChart","createBoxPlotChart","createOHLCChart","createWaterfallChart","createLineChart","axisPane","dateAxis","srcSeries","processedSeries","_currentPointsCache","_seriesPointsCache","categoryField","aggregateSeries","filterSeries","outOfRangePoints","dataLength","clearSeriesPointsCache","seriesSourcePoints","srcData","getFn","aggregator","categoryItem","categoryIdx","categoriesToAdd","defaultPaneName","paneName","stackableChartOptions","firstSeries","axisSeries","categoryAxes","barChart","rangeColumnChart","bulletChart","lineChart","areaChart","rangeAreaChart","waterfallChart","axisRequiresRounding","categoryAxisName","categoryAxisIndex","seriesAxis","centeredSeries","aggregatedAxis","primaryAxis","defaultAxisRange","tracker","defaultRange","eventType","_eventCoordinates","pointPane","_points","arrayPoints","togglePointHighlight","toggleHandler","isHighlighted","_active","_panAxes","updatedAxes","marqueeColor","marquee","_marquee","removeElement","setStyles","zoomPane","_zoomPane","_zoomPaneClipBox","_selectionPosition","elementOffset$$1","selectionPosition","_updateAxisRanges","updateRanges","legendItem","createContainer","markerOptions","eventSink","_itemOverlay","_legendItemHover","pointIndex","_unsetActivePoint","createItems","userAlign","innerElement","hasItems","legendBox","containerCustomReflow","containerReflow","alignTarget","containerBox","_registry","registry","_dateAxis","initOptions","createElements","_index","onPane","leftHandle","rightHandle","selectionStyles","leftHandleHeight","rightHandleHeight","leftMask","rightMask","borderLeftWidth","borderRightWidth","mousewheel","_mousewheelHandler","_mousewheel","_domEvents","tap","_gesturestart","_gesturechange","gestureend","_gestureend","_mwTimeout","_state","_rangeEventArgs","_value","moveTarget","oldRange","rightClick","_toModelCoordinates","_slot","rightMaskWidth","leftMaskWidth","zDir","tooltipPoints","_slotAnchor","_defaultAnchor","categoryText","categoryFormat","centerPoint","slotCenter","fromScale","fadeTo","missingValue","xAxisRangeTracker","yAxisRangeTracker","filteredSeries","createScatterChart","createScatterLineChart","createBubbleChart","createAxes","xAxisOptions","yAxisOptions","createXYAxis","seriesAxisName","firstPointValue","inferredDate","namedAxes","isLog","typeSamples","axisPane$1","xAxesOptions","yAxesOptions","xValues","yValues","brightnessValue","themeLabels","animationDelay","labelHeight","labelWidth","lp","labelsOptions","labelsDistance","createSegmentVisual","borderOptions","singleSegment","createLegendItem","pointVisible","legendOptions","legendItems","colorsCount","anglePerValue","constantAngle","explode","evalSegmentOptions","segmentOptions","minWidth","halfMinWidth","defaultPadding","newBox","newBoxCenter","leftSideLabels","rightSideLabels","seriesConfig","seriesConfigs","labelComparator","leftLabelsReflow","rightLabelsReflow","distances","distanceBetweenLabels","distributeLabels","secondBox","lr","firstBox","remaining","_takeDistance","amount","boxX","labelDistance","boxY","hAlignLabel","connectorsColor","connectorLine","sr","crossing","_connectorLines","pointInCircle","reverseValue","originalX","sector_center","createPieChart","pieChart","totalSize","seriesWithoutSize","holeSize","currentSeries$1","createDonutChart","donutChart","createPolarAxis","createValueAxis","axisDefaultRange","valueAxisOptions","valueAxisBox","heightDiff","valueRadius","_polarAxisCenter","centerSegment","_hasMissingValuesGap","scatterChart","slotSector","childSector","_hasBarCharts","_isStacked100","chartOptions","chartBox","createPath","labelPadding","dynamicSlopeReflow","totalHeight","lastUpperSide","previousOffset","previousHeight","nextSegment","nextPercentage","firstSegment","maxSegment","dynamicHeight","segmentSpacing","constantSlopeReflow","decreasingWidth","neckRatio","topMostWidth","finalNarrow","dynamicSlope","createFunnelChart","funnelChart","errorLow","errorHigh","_initElement","_originalOptions","_theme","_initTheme","_initHandlers","_initSurface","bindCategories","fontLoaded","_redraw","_attachEvents","_setElementClass","seriesCopies","applySeriesColors","_noTransitionsRedraw","_model","findPaneByName","findPaneByIndex","seriesName","categoryName","togglePointsHighlight","_sharedTooltip","_surfaceWrap","renderAs","_destroySurface","_surfaceMouseenterHandler","_surfaceMouseleaveHandler","_getModel","_destroyView","_createTooltip","_setupSelection","_createPannable","_createZoomSelection","_createMousewheelZoom","_navState","_cancelDomEvents","exportOptions","currentOptions","_pannable","zoomable","_zoomSelection","_mousewheelZoom","_toggleDragZoomEvents","allowDrag","allowZoom","_dragZoomEnabled","_touchAction","_toggleDomEvents","drag","domEvents","toggleDrag","toggleZoom","_createSharedTooltip","seriesColor","_createPlotArea","_modelOptions","skipSeries","selections","_selections","_selectStart","_selectEnd","_clickHandler","_mouseover","_mouseout","_toDocumentCoordinates","obj$1","_shouldAttachMouseMove","_hoveredPoint","hovered","_stopChartHandlers","_gestureDistance","_zooming","previousGestureDistance","mousewheelZoom","_drawingChartElement","leave","_startNavigation","_suppressHover","ranges$1","_endNavigation","prevented","totalDelta","chartEvent","_getChartElement","_elementPadding","_padding","drawingElement","sharedTooltip","_startHover","_trackSharedTooltip","_propagateClick","handlingTap","activePoint","hoveredPoint","_activePoint","_mouseMoveTrackHandler","_mouseMoveTracking","seriesPoint","overPlotArea","_trackCrosshairs","pointArgs","hoverArgs","_tooltipCategoryIx","_sharedHighlight","hideElements","_deferRedraw","_clearRedrawTimeout","_redrawTimeout","bindCategoryAxisFromSeries","dataIx","dataRow","uniqueCategories","bindable","_isBindable","transitionsState","updateMouseMoveHandler","applyOptions","setDirection","setIntlService","noTransitionsRedraw","createProxyMember","nameTemplate","seriesClone","legacyTemplate","groupNameTemplate","_groupIx","_groupValue","normalizeStyle","ChartInstanceObserver","proxyMembers","SeriesVisibilityState","geom","ChartSeries","KendoChart","MOUSELEAVE_NS","DATABOUND","LEAVE","TOOLTIP_ANIMATION_DURATION","TOOLTIP_SHOW_DELAY","TOOLTIP_INVERSE","SHARED_TOOLTIP_CLASS","legendItemClick","_seriesVisibility","_initDataSource","_bindSeries","_bindCategories","_getThemeOptions","_sourceSeries","setDataSource","_hasDataSource","_onDataChanged","_dataChangeHandler","_hasData","_destroyCrosshairTooltips","findSeries","findSeriesByName","_createSeries","findSeriesByIndex","originalChartArea","_seriesOptions","_initChart","_createChart","_isRtl","_onInit","_initTooltip","tooltips","_crosshairTooltips","_getCrosshairTooltip","_showTooltip","_hideTooltip","_onRender","_copyMembers","_tooltipleave","_onLegendItemClick","_legendItemClick","_bindData","groupedSeries","grouped","seriesVisibility","applyByGroup","applyByIndex","seriesData","categoriesData","_bindCategoryAxis","PDFMixin","persistSeriesVisibility","saveState","mobileScrollerSelector","_mobileScroller","_clearShowTimeout","sharedTemplate","_ensureElement","showTimeout","_sharedContent","_pointContent","_hideElement","nameColumn","colorMarker","colspan","fadeOut","always","tooltipTemplate","xLow","xHigh","yLow","yHigh","_chart","_options","_filterPoints","_clearFields","toggleVisibility","hasFilter","_filterData","buildLabelElement","Path$1","styleGeometry","styleBox","getRange","renderAxisTick","tickRenderOptions","tickPath","Path$2","renderTicks","tickGroup","drawTicks","tickAngles","tickStart","tickEnd","Group$5","getRadiusX","Path$5","rangeSegment","DrawingGroup","DrawingPath","ANGULAR_SPEED","LINEAR_SPEED","ARROW","ARROW_POINTER","BAR_POINTER","DEFAULT_LINE_WIDTH","DEGREE","RADIAL_POINTER","RADIAL_RANGE_POINTER","DEFAULT_MARGIN","Gauge","Group$2","LinearScale","Pointer","LinearPointer","ArrowLinearPointerAnimation","Point$1","Path$3","ArrowLinearPointer","BarLinearPointerAnimation","Group$3","Path$4","BarLinearPointer","DEFAULT_MIN_WIDTH","DEFAULT_MIN_HEIGHT","Group$1","LinearGauge","GEO_ARC_ADJUST_ANGLE","RadialScale","RadialPointerAnimation","CAP_SIZE","Group$6","Path$6","RadialPointer","Group$4","RadialGauge","ArcScale","MAX_DURATION","RangePointerAnimation","RangePointer","ArcGauge","contextService","pointerValue","_setValueOptions","_draw","_visuals","allValues","arrayValues","_toggleTransitions","_surfaceSize","gaugeArea","_createGaugeArea","_createModel","_gaugeAreaMargin","currentTheme","areaGeometry","_surfaceElement","_getSize","defaultSize","_defaultSize","renderLabels","scaleLine","renderLine","scaleTicks","renderRanges","linePath","_oldValue","repaint","track","pointerBox","pointerRangeBox","trackBox","trackSize","pointerHalfSize","getElementOptions","_margin","toScale","translateX","translateY","pointerShape","elementOptions","newPoints","oldPoints","speed","minSlot","sizeAxis","pointerPath","oldShape","renderTrack","trackOptions","bboxX","bboxY","_shrinkScaleWidth","_getBox","_alignElements","_shrinkElements","_buildVisual","scaleElements","pointerType","plotAreaBox","scaleBox","renderArc","labelElements","repositionRanges","hasRanges","ticksSize","isInside","hasLabelElements","labelAngle","labelElement","prevLabelPos","labelTransform","labelsGroup","rangeDistance","setRadiusX","setRadiusY","rangeRadius","getRangeRadius","rangeSegments","segmentsCount","rangeGeom","allTicks","tickArc","majorTickAngles","_tickDifference","minorTickAngles","normalizeTickAngles","tickCount","repositionTicks","minor","newPoint","xDiff","yDiff","newAngle","oldAngle","setAngle","_renderNeedle","_renderCap","capSize","cap","needleColor","needlePath","capColor","_initialPlotArea","alignScale","_buildPointers","midDiff","oldDiff","getDiff","staleFlag","getPlotBox","scaleArc","plotBbox","plotBox","plotBoxCenter","paddingX","paddingY","pointersArr","rangeLineCap","placeholderRangeAngle","geometry$$1","setEndAngle","setStartAngle","addRange","startColor","currentColor","rangeColor","centerLabelPosition","yLimit","lowerName","createExportMethod","ArcGaugeWidget","_centerElement","RadialGaugeWidget","LinearGaugeWidget","exportMethods","_createInstance","_copyFields","gaugeType","_gaugeType","_centerTemplate","centerElement","centerTemplate","_getCenterElement","getNext","state128","state128AB","states128","code128Base","msiBase","Barcode","DEFAULT_QUIETZONE_LENGTH","numberRegex","alphanumericRegex","InvalidCharacterErrorTemplate","Encoding","quietZoneLength","addQuietZone","initValue","addData","addCheckSum","invalidCharacterError","character","encodings","code39Base","minBaseUnitLength","addStart","addCharacter","pushCheckSum","prepareValues","charData","characterMap","addBase","code39ExtendedBase","addExtended","extendedMappings","shiftCharacters","dataCharacter","specialAsciiCodes","0","64","96","127","shiftValuesAsciiCodes","39","41","42","+","%","code39","checkSumMod","minRatio","maxRatio","gapWidth","splitCharacter","patternString","minBaseUnit","minHeight","getBaseUnit","getBaseWidth","characterLength","addPattern","addCharacterGap","patternMappings","w","B","W","A","C","E","H","I","J","K","L","N","O","P","R","S","U","V","Z","-"," ","code39extended","SHIFT0","SHIFT1","SHIFT2","SHIFT3","code93","cCheckSumTotal","kCheckSumTotal","setBaseUnit","checkSumLength","TERMINATION_BAR","checkValues","_getCheckValues","checksum","_findCharacterByValue","cValue","kValue","wightedSum","weightedValue","code93extended","encoding","FNC4","states","_initMoves","isCode","encodingState","_moves","numberMatch","maxLength","_moveFNC","_shiftState","_moveState","fnc","previousState","SHIFT","next4","dependentStates","_initSubStates","subState","_getSubState","_initSubState","_pushStart","pushData","subStates","_getAll","FNC1","startState","startAI","endAI","nextStart","separatorLength","regexSeparators","getBySeparator","getByLength","validate","getAI","unsupportedAIError","applicationIdentifiers","multiKey","ids","22","402","7004","242","8020","703","8008","253","8003","_initStates","checkSum","getNextState","STOP","code128a","code128b","code128c","code128","startStopLength","checkSumFunction","checkSums","checkSumType","Modulo10","evenSum","oddSum","odd","Modulo11","weight","checkValue","weightedSum","mod","Modulo11Modulo10","mod11Value","Modulo10Modulo10","mod10Value","msimod10","msimod11","msimod1110","msimod1010","code11","kCheckSumMinLength","DASH_VALUE","DASH","getWeightedSum","postnet","VALID_CODE_LENGTHS","DIGIT_SEPARATOR","baseHeight","ean13","calculateChecksum","leftKey","leftPart","rightPart","addPieces","addSide","keyTable","arrToAdd","limitedHeight","even","ean8","surfaceWrap","_setOptions","_render","textToDisplay","textHeight","textMargin","barHeight","_getBackground","_getText","_bandsGroup","_getBands","_textbox","toDecimal","toBitsString","splitInto","fillFunctionCell","matrices","bit","fillDataCell","maskPatternConditions","generatePowersOfTwo","powersOfTwoResult","powersOfTwo","generateGeneratorPolynomials","firstPolynomial","secondPolynomial","maxErrorCorrectionCodeWordsCount","generatorPolynomials","multiplyPolynomials","multiplyByConstant","getNumberAt","scoreFinderPatternOccurance","scores","rowColumn","finderPatternValue","scoreAdjacentSameBits","previousBits","adjacentBits","calculateDarkModulesRatioScore","darkModules","mod5","score","modeInstances","mode","FreeCellVisitor","fillData","padDataString","xorPolynomials","generateErrorCodewords","getBlocks","chooseMode","getModes","getDataCodewordsCount","getVersion","getDataString","encodeFormatInformation","encodeBCH","dividePolynomials","initMatrices","addFormatInformation","encodeVersionInformation","addVersionInformation","addCentricPattern","addFinderSeparator","addFinderPatterns","addAlignmentPatterns","addTimingFunctions","scoreMaskMatrixes","EncodingResult","IsoEncoder","UTF8Encoder","QRCodeDataEncoder","encodeData","QRCodeDefaults","QRCode","terminator","NUMERIC","ALPHA_NUMERIC","BYTE","irregularAlignmentPatternsStartDistance","15","16","18","19","24","26","28","31","32","33","36","37","versionsCodewordsInformation","totalDataCodewords","errorCodewordsPerBlock","finderPattern","alignmentPattern","errorCorrectionPatterns","formatMaskPattern","formatGeneratorPolynomial","versionGeneratorPolynomial","paddingCodewords","alphaPattern","alphaExclusiveSet","alphaRegex","alphaNumericRegex","byteRegex","initMinNumericBeforeAlpha","initMinNumericBeforeByte","initMinAlphaBeforeByte","minNumericBeforeAlpha","minNumericBeforeByte","minAlphaBeforeByte","QRDataMode","getVersionIndex","getBitsCharacterCount","bitsInCharacterCount","getModeCountString","modeIndicator","getStringBitsLength","modes","inputLength","mod3","characters","*","startColumn","getNextCell","getNextRemainderCell","blocks","block","codewordIdx","blockIdx","cellVisitor","dataString","dataBitsCount","terminatorIndex","paddingCodewordIndex","errorCodewordsCount","generator","generatorPolynomial","steps","errorCodewords","dataStream","versionCodewordsInformation","dataBlock","blockCodewordsCount","groupBlocksCount","messagePolynomial","codeword","codewordStart","dataBlocks","errorBlocks","versionGroups","previousMode","modeString","numeric","numericMatch","alphaMatch","alphaNumeric","alphaNumericMatch","nextMode","dataCodewordsCount","errorCorrectionLevel","encodedString","codeLength","generatorNumber","polynomialLength","valueNumber","valueString","numberX","numberY","yLength","xLength","modules","quotient","nextX","nextY","startDistance","adjacentSameBits","getEncodingResult","inputString","encodingMode","utfBOM","initialModeCountStringLength","encodeCharacter","significantOnes","bytesCount","getBytesCount","bc","optimalMatrix","encoder","encodingResult","versionInformation","DEFAULT_SIZE","QUIET_ZONE_LENGTH","DEFAULT_ERROR_CORRECTION_LEVEL","DEFAULT_BACKGROUND","DEFAULT_DARK_MODULE_COLOR","MIN_BASE_UNIT_SIZE","quietZoneSize","dataSize","contentSize","errorCorrection","_calculateBaseUnit","_renderBackground","_renderMatrix","matrixSize","QRCodeFunctions","QRCodeFields","ClonedObject","FadeOutAnimation","NavigatorHint","NAVIGATOR_PANE","NAVIGATOR_AXIS","Navigator","AUTO_CATEGORY_WIDTH","StockChart","_initialOpacity","chartPadding","scroll","tooltipStyle","minPos","maxPos","posRange","clearHideTimeout","_visible","borderTopWidth","_hideTimeout","_hideAnimation","chartObserver","clean","_redrawSelf","initSelection","mainAxis","axisClone","selectStart","selectEnd","setRange","filterAxes","redrawSlaves","slavePanes","navigatorAxis","naviRange","inNavigator","liveDrag","showHint","readSelection","ref_selection_options","_zoom","fromIx","toIx","_zoomEnd","naviOptions","__navi","attachAxes","attachSeries","valueAxes","equallySpacedSeries","justifyAxis","_collapse","autoBindElements","user","navigatorSeries","dateField","stockDefaults","destroyNavigator","_fullRedraw","_dirty","partialRedraw","_seriesCount","copyNavigatorCategories","buildFilter","KendoStockChart","StockInstanceObserver","navigatorFilter","navigatorCreated","_initNavigatorOptions","navigatorOptions","isTouch","isFirefox","dummyAxis","hasServerFiltering","hasSelect","_onNavigatorCreated","_navigator","_initNavigatorDataSource","dsOptions","_navigatorDataChangedHandler","_onNavigatorDataChanged","_navigatorDataSource","_bindNavigatorSeries","naviCategories","axesLength","_removeNavigatorDataSource","_onNavigatorFilter","navigatorDataSource","wrapNumber","TOP_OFFSET","SharedTooltip$1","DEAULT_BAR_WIDTH","DEAULT_BULLET_WIDTH","NO_CROSSHAIR","Sparkline","_initialWidth","stage","displayState","_autoWidth","inline","_calculateWidth","currentChart","pointWidth","normalizeOptions","SparklineTooltip","KendoSparkline","sqr","renderSize","renderPos","romanToArabic","memoize","isUnicodeLetter","RX_UNICODE_LETTER","withExit","Return","Extent","Location","lat","lng","DISTANCE_ITERATIONS","DISTANCE_CONVERGENCE","DISTANCE_PRECISION","FORMAT","loc","datum","greatCircleTo","bearing","fromLat","fromLng","dToR","datums","WGS84","U1","sinU1","cosU1","U2","sinU2","cosU2","lambda","prevLambda","converged","sinLambda","cosLambda","sino","cosA2","coso","cos2om","sigma","sinA","u2","deltao","azimuthFrom","azimuthTo","fromLngLat","ll","fromLatLng","nw","se","containsAny","locs","include","includeAll","edges","sw","extent","World","Attribution","itemTemplate","_extent","_itemText","inZoomLevel","_inZoomLevel","minZoom","maxZoom","inArea","_inArea","button","BUTTONS","_keyroot","_keydown","panStep","_pan","iconClass","PLUS","MINUS","FF_PLUS","FF_MINUS","ZoomControl","zoomStep","PI_DIV_4","Mercator","MAX_LNG","MAX_LAT","INVERSE_ITERATIONS","INVERSE_CONVERGENCE","centralMeridian","clamp","proj","lng0","_projectLat","ecc","ts","con","inverse","_inverseY","dphi","ecch","phi","SphericalMercator","Equirectangular","EPSG3857","crs","_proj","_tm","_itm","toLocation","EPSG3395","EPSG4326","projections","Layer","_beforeReset","_panEnd","_activate","_updateAttribution","_deactivate","_applyExtent","_setVisibility","matchMinZoom","matchMaxZoom","inside","attribution","layers","ShapeLayer","_initRoot","_markers","_dataChange","_translateSurface","_load","_clearMarkers","_loader","GeoJSONLoader","shapeCreated","cancelled","_createMarker","layer","featureCreated","_panning","locationToView","locator","defaultStyle","unwrap","_loadGeometryTo","_featureCreated","_shapeCreated","_loadPolygon","_setLineFill","_loadPoint","_loadShape","rings","_buildPolygon","geojson","features","geometries","BubbleLayer","locationField","opt","scaleType","_scaleType","_createSymbol","_drawSymbol","scales","symbols","SqrtScale","domain","domainRange","outputRange","_domain","_ratio","rel","Symbols","geo","roundPoint","drawingUtil","TileLayer","subdomains","viewType","_viewType","locationToLayer","viewOrigin","_updateView","TileView","extentToPoint","pool","TilePool","tileSize","urlTemplate","_center","_viewOrigin","pointToTileIndex","tileCount","firstTileIndex","indexToPoint","subdomainText","subdomainIndex","tile","createTile","currentIndex","tileOptions","wrapIndex","subdomain","errorUrlTemplate","wrapValue","ImageTile","errorUrl","urlResult","urlOptions","z","quadkey","_create","maxDist","BingLayer","_scheme","_onMetadata","_fetchMetadata","imagerySet","uriScheme","resource","resourceSets","resources","imageUrl","imageUrlSubdomains","zoomMin","zoomMax","_addAttribution","BingView","imageryProviders","coverageAreas","tileQuadKey","digit","quadKey","bing","MarkerLayer","_markerClick","titleField","_addOne","Marker","addTo","getLocation","getTitle","renderTooltip","contentTemplate","contentUrl","CSS_PREFIX","FRICTION_MOBILE","DEFAULT_ZOOM_RATE","Map","_getOrigin","_initScroller","_initMarkers","_initControls","_initLayers","controls","layerDefaults","markerDefaults","wraparound","scroller","zoomControl","_setExtent","_getExtent","_layerSize","layerToLocation","viewToLocation","eventOffset","eventToView","eventToLayer","eventToLocation","_setOrigin","_origin","layerWidth","layerHeight","_zoomAround","pivot","_createAttribution","_createNavigator","_createZoomControl","_createControlElement","defaultPos","posSelector","_navigatorPan","_navigatorCenter","bounds","_virtualSize","_scrollEnd","_zoomControlChange","_scroll","_scaleStart","_doubleTap","_scrollOffset","_panComplete","_panEndTS","_scaleToZoom","gestureCenter","centerLocation","tiles","_resetScroller","xBounds","yBounds","_renderLayers","scrollWrap","toZoom","postZoom","fromZoom","Range","rangeIntegerScale","Utils","findRadian","sngXComp","sngYComp","Easing","Ticker","EPSILON","isNearZero","isDefined","isUndefined","has","isBoolean","isType","simpleExtend","initArray","serializePoints","res","deserializePoints","randomInteger","DFT","getMatrixAngle","getMatrixScaling","sX","sY","findAngle","thisRef","what","fold","constraint","bisort","sortfunc","easeInOut","adapters","lastTime","_this","timerDelegate","onTimerEvent","addAdapter","onComplete","removeHandler","caller","onStep","seekTo","seekFromTo","intervalId","initState","propagate","movement","intersectLine","start1","end1","start2","end2","isSegment","num1","num2","tangensdiff","normalVariable","randomId","chars","PathDefiner","Intersect","RectAlign","Polar","MatrixVector","Geometry","HashTable","Dictionary","Queue","Set","Link","Graph","HITTESTAREA","plus","minus","times","lengthSquared","middleOf","toPolar","useDegrees","halfpi","factor","isOnLine","o1","u1","inflate","tempStr","xy","rotatedBounds","delimiter","staicPoint","adornerCenter","scaled","thisCenter","rectBottomRight","Empty","rectWithLine","rects","reverseAngle","alignValues","_singleAlign","_left","_right","stretch","_stretch","_top","_middle","_bottom","alignCalc","applyRect","fromSVGMatrix","vm","fromMatrixVector","fromList","translation","scaling","nums","fromMatrix","_distanceToLineSquared","pt1","pt2","vx","vy","distanceToLine","distanceToPolyline","minimum","_buckets","_createGetBucket","_bucketExists","containsKey","hashId","bucket","hashes","_hashes","ht","_hashString","_objectHashId","_hashId","dictionary","_hashTable","forEachValue","forEachKey","enqueue","kv","links","outgoing","incoming","associatedShape","shortForm","isVirtual","isIsolated","isLinkedTo","link","getComplement","getChildren","getParents","balance","adjacentTo","removeLink","hasLinkTo","degree","incidentWith","getLinksWith","getNeighbors","neighbors","connection","sourceFound","targetFound","associatedConnection","getCommonNode","isBridging","v1","v2","getNodes","changeSource","changeTarget","changesNodes","oldSource","oldTarget","directTo","createReverseEdge","reversed","idOrDiagram","_nodeMap","_hasCachedRelationships","cacheRelationships","forceRebuild","assignLevels","startNode","visited","getConnectedComponents","componentId","components","graph","componentIndex","setItemIndices","_collectConnectedNodes","addNodeAndOutgoings","setIds","nodeIndex","nextId","calcBounds","getSpanningTree","levelCount","ni","cn","newLink","treeLevels","_addNode","addLink","takeRandomNode","excludedNodes","incidenceLessThan","isHealthy","hasNode","sourceOrLink","foundSource","foundTarget","addExistingLink","getNode","addNode","removeAllLinks","hasLink","linkOrId","nodeOrId","_removeNode","removeNode","areConnected","n1","n2","layoutRect","newNode","newLinks","saveMapping","nodeMap","linkMap","nOriginal","nCopy","linkOriginal","linkCopy","linearize","addIds","depthFirstTraversal","foundNode","_dftIterator","breadthFirstTraversal","_stronglyConnectedComponents","excludeSingleItems","lowLinks","connected","component","findCycles","isAcyclic","isSubGraph","otherArray","thisArray","makeAcyclic","oneLink","oneNode","rev","intensityCatalog","flowIntensity","catalogEqualIntensity","sourceStack","targetStack","intensity","targetLink","sources","si","sourceLink","maxdiff","ril","vertexOrder","kk","reversedEdges","Predefined","EightGraph","Mindmap","ThreeGraph","BinaryTree","levels","createBalancedTree","Linear","Tree","siblingsCount","Forest","trees","createBalancedForest","Workflow","Grid","graphString","previousLink","lin","_addShape","kendoDiagram","undoable","addShape","_addConnection","connect","createDiagramFromGraph","doLayout","randomSize","gli","sourceShape","targetShape","shi","SpringLayout","layoutGraph","limitToView","counter","lastAdded","news","treeCount","createRandomConnectedGraph","nodeCount","maxIncidence","isTree","poolNode","randomAdditions","randomDiagram","shapeCount","diffNumericOptions","sizeOptionsOrDefault","normalizeDrawingOptions","drawingOptions","getColor","lineAngle","toDrawingRect","Scale","Translation","Rotation","CompositeTransform","AutoSizeableMixin","VisualBase","TextBlock","Rectangle","MarkerBase","CircleMarker","ArrowMarker","MarkerPathMixin","Line","Polyline","Canvas","Markers","none","arrowStart","filledCircle","arrowEnd","FULL_CIRCLE_ANGLE","toMatrixVector","Length","_transform","_renderTransform","rotateMatrix","scaleMatrix","translatePoint","_setScale","originWidth","_originWidth","originHeight","_originHeight","_setTranslate","_initSize","autoSize","_updateSize","_diffNumericOptions","_originSize","drawingContainer","_hover","_measured","_boundingBox","_fill","_stroke","strokeOptions","fillOptions","GradientClass","_textColor","_font","_initText","fontOptions","fontStyle","fontWeight","sizeChanged","_initPath","_setPosition","_drawPath","sizeOptions","_transformToPath","positionMarker","targetSegment","_linePoints","_getPath","_normalizeMarkerOptions","startCap","endCap","_removeMarker","_createMarkers","markerType","_positionMarker","_capMap","_redrawMarker","pathChange","pathOptions","pathCapType","optionsCap","_redrawMarkers","_createElements","_setData","_updatePath","_pointsDiffer","currentPoints","differ","_initImage","_childrenChange","toFront","toBack","_reorderChildren","toIndex","drawingChildren","fixedPosition","childBoundingBox","_includeInBBox","drawingRect","_initCircle","circleOptions","_circle","_translate","_viewBox","clearHtml","testKey","hitToOppositeSide","hit","canDrag","hitTestShapeConnectors","connector","HIT_TEST_DISTANCE","noMeta","PositionAdapter","LayoutUndoUnit","CompositeUnit","ConnectionEditUnit","ConnectionEditUndoUnit","DeleteConnectionUnit","DeleteShapeUnit","TransformUnit","AddConnectionUnit","AddShapeUnit","PanUndoUnit","RotateUnit","ToFrontUnit","ToBackUnit","UndoRedoService","EmptyTool","ScrollerTool","PointerTool","SelectionTool","ConnectionTool","ConnectionEditTool","ToolService","ConnectionRouterBase","LinearConnectionRouter","PolylineRouter","CascadingRouter","AdornerBase","ConnectionEditAdorner","ConnectorsAdorner","ResizingAdorner","Selector","ConnectorVisual","Cursors","grip","cross","south","east","west","north","rowresize","colresize","DEFAULT_SNAP_SIZE","DEFAULT_SNAP_ANGLE","ITEMROTATE","ITEMBOUNDSCHANGE","MIN_SNAP_SIZE","MIN_SNAP_ANGLE","MOUSE_ENTER","MOUSE_LEAVE","SCROLL_MIN","SCROLL_MAX","PAN","ROTATED","TARGET","HANDLE_NAMES","-1","layoutState","pusher","getShapeById","subjects","froms","tos","initialState","finalState","_initialState","_finalState","undo","setState","redo","ticker","conn","undoUnit","redoSource","redoTarget","_redoSource","_redoTarget","_undoSource","_undoTarget","_updateConnector","updateModel","undoSource","undoTarget","targetConnector","undoStates","adorner","redoStates","layout","refreshBounds","deselect","initialPosition","finalPosition","finalPos","undoRotates","redoRotates","redoAngle","_angle","_innerBounds","_initialize","initialIndices","_toIndex","capacity","begin","commit","execute","_restart","addCompositeItem","toolService","tryActivate","getCursor","virtualScroll","tool","scrollable","movableCanvas","hoveredItem","hoveredAdorner","_hoveredConnector","scrollPos","_storePan","selectSingle","_hitTest","_resizingAdorner","isDragHandle","connections","undoRedoService","isSelected","selectArea","_createConnection","_c","connectionHandle","_connectionManipulation","_removeHover","activeConnection","_cachedTouchTarget","cachedTouchTarget","sourceConnector","Shape","getConnector","_syncConnectionChanges","_connectorsAdorner","isActive","handleName","activeTool","_updateHoveredItem","_activateTool","_updateCursor","updateHovered","keyDown","toRemove","metaKey","_triggerRemove","_syncChanges","_destroyToolBar","_discardNewConnection","selectAll","wheel","zoomRate","zoomOptions","setTool","addToSelection","newConnection","disabledShape","selectedConnections","_selectedItems","Connection","_hitTestItems","_hitTestElements","mainLayer","shapeIdx","connectionIdx","shapeHit","connectionHit","hitTest","rec","getBounds","SAME_SIDE_DISTANCE_RATIO","routePoints","_connectorPoints","_floatingPoints","_resolvedSourceConnector","_resolvedTargetConnector","sourcePoint","targetPoint","_connectorSides","boundsPoint","secondarySign","_connectorSide","sideDistance","minSide","shapeBounds","sides","_sameSideDistance","pointX","pointY","sourceConnectorSide","targetConnectorSide","deltaX","sameSideDistance","shiftX","shiftY","cascadeStartHorizontal","_startHorizontal","sourceSide","_adorners","sp","tp","_ts","spVisual","epVisual","_initialSource","_initialTarget","sourcePointDistance","targetPointDistance","sourceHandle","targetHandle","modelToLayer","_refreshHandler","ctr","_clearVisual","_keepCachedTouchTarget","visualChildren","_manipulating","_initSelection","_createHandles","_internalChange","_rotatedHandler","_resizable","_handleOptions","_bounds","handleBounds","handlesCount","_getHandleBounds","_rotationOffset","_startAngle","_rotates","_positions","initialRotates","initialStates","handleOptions","_sp","_cp","_lp","shapeStates","visibleHandles","dragging","newBounds","staticPoint","thr","newCenter","oldBounds","dtl","dbr","changed","_truncateAngle","_rotating","shouldSnap","_truncateDistance","_displaceBounds","_truncatePositionToGuides","ruler","truncatePositionToGuides","_truncateSizeToGuides","truncateSizeToGuides","snap","snapOptions","snapAngle","snapSize","_diffStates","_syncShapeChanges","rotationThumb","_rotationThumbBounds","_ep","_adorn","visualBounds","modelToView","relative","_visualBounds","HyperTree","LayoutBase","subtype","nodeDistance","iterations","horizontalSeparation","verticalSeparation","underneathVerticalTopOffset","underneathHorizontalOffset","underneathVerticalSeparation","componentSpacingX","componentSpacingY","layerSeparation","layeredIterations","startRadialAngle","endRadialAngle","radialSeparation","radialFirstLevelSeparation","keepComponentsInOneRadialLayout","ignoreContainers","layoutContainerChildren","ignoreInvisible","animateTransitions","gridLayoutComponents","maxWidth","startX","startY","resultLinkSet","resultNodeSet","boundingRect","currentHeight","currentWidth","moveToOffset","nodeBounds","newpoints","deltax","deltay","currentHorizontalOffset","transferOptions","DiagramToHyperTreeAdapter","shapeMap","edgeMap","finalNodes","finalLinks","ignoredConnections","ignoredShapes","hyperMap","hyperTree","finalGraph","_renormalizeShapes","_renormalizeConnections","mapConnection","mapShape","getEdge","listToRoot","containerGraph","parentContainer","firstNonIgnorableContainer","isContainer","_isIgnorableItem","isContainerConnection","isDescendantOf","isIgnorableItem","isCollapsed","_isVisible","_isTop","isShapeMapped","leastCommonAncestor","al","xa","xb","_isCollapsed","sink","sourceNode","sinkNode","newEdge","areConnectedAlready","finalNodeSet","LayoutState","initialTemperature","guessBounds","temperature","_expectedBounds","refineStage","_repulsion","_attraction","_shake","rho","_InverseSquareForce","wn","hn","wm","hm","_SquareForce","av","squareSize","multiplier","TreeLayoutProcessor","treeGraph","layoutSwitch","layoutLeft","setChildrenDirection","setChildrenLayout","TreeDirection","Width","arrange","layoutRight","layoutUp","layoutDown","treeDirection","layoutRadialTree","previousRoot","maxDepth","calculateAngularWidth","radialLayout","Angle","tipOverTree","startFromLevel","aw","diameter","sectorAngle","sortChildren","nl","col","basevalue","normalizeAngle","childAngleFraction","deltaTheta","deltaThetaHalf","parentSector","setPolarLocation","BoundingRectangle","includeStart","rootDirection","rootLayout","childrenLayout","givenSize","shapeWidth","shapeHeight","AngleToParent","SectorAngle","pp","childrenwidth","selfLocation","male","female","leftcount","tipOverTreeStartLevel","TreeLayout","layoutComponents","getTree","givenRootShape","getTreeForRoot","LayeredLayout","_initRuntimeProperties","downstreamLinkCount","upstreamLinkCount","uBaryCenter","dBaryCenter","upstreamPriority","downstreamPriority","gridPosition","_prepare","targetLayer","sortedNodes","minLayer","layerMap","layerCount","o2","o1layer","o2layer","linksTo","_dummify","_optimizeCrossings","_swapPairs","arrangeNodes","_moveThingsAround","_dedummify","setMinDist","minDist","layerIndex","minDistances","getMinDist","i1","i2","placeLeftToRight","leftClasses","classNodes","rightSibling","neighbor","leftPos","placeLeft","POSITIVE_INFINITY","nodeLeftClass","upNodes","downNodes","intDiv","placeRightToLeft","rightClasses","leftSibling","rightPos","placeRight","NEGATIVE_INFINITY","nodeRightClass","_getLeftWing","leftWing","computeClasses","_getRightWing","rightWing","wingPair","ndsinl","vnode","wings","currentWing","wing","_nodesInLink","classIndex","_isVerticalLayout","_isHorizontalLayout","_isIncreasingLayout","maximumHeight","currentNode","currDown","downNode","placed","sequenceStart","sequenceEnd","fromLayerIndex","reachedFinalLayerIndex","layerIncrement","_gridPositionComparer","virtualStartIndex","virtualStart","sequence","virtualEnd","virtualEndIndex","_firstVirtualNode","_sequencer","nextVirtualNode","adjustDirections","prevBridge","prevBridgeTarget","nextBridge","nextBridgeTarget","clayer","j1","j2","getNeighborOnLayer","_sequenceSingle","combineSequences","pair","rightHeap","leftRes","rightRes","leftHeap","_positionDescendingComparer","_positionAscendingComparer","leftClass","_getComposite","rightClass","maxLayoutIterations","it","gridPos","layoutLayer","iconsidered","considered","n1Priority","n2Priority","nodeGridPos","nodeBaryCenter","calcBaryCenter","nodePriority","moveRight","moveLeft","calcDownData","calcUpData","priority","rightNode","rightNodePriority","leftNode","leftNodePriority","mapVirtualNode","nodeToLinkMap","linkToNodeMap","addLinkBetweenLayers","oLayer","dLayer","oPos","dPos","upLayer","downLayer","depthOfDumminess","prevLink","dedum","moves","maxIterations","iter","optimizeLayerCrossings","presorted","inode","compareValue","n1BaryCenter","n2BaryCenter","compareByIndex","downwards","secondPass","hasSwapped","calcCrossings","memCrossings","crossBefore","node1","node2","node1GridPos","node2GridPos","crossAfter","revert","countLinksCrossingBetweenTwoLayers","ulayer","dlayer","link1","link2","n11","n12","n21","n22","l1","l2","n11gp","n12gp","n21gp","n22gp","crossings","numerator","denominator","graphOrNodes","diagramOrGraphOrNodes","GraphAdapter","toggleActive","STATE_ACTIVE","actionSheetWrap","preventClick","findFocusableSibling","getSibling","candidate","OVERFLOW_ANCHOR","Item","Button","ToolBarButton","OverflowButton","ButtonGroup","ToolBarButtonGroup","OverflowButtonGroup","ToolBarSplitButton","OverflowSplitButton","ToolBarSeparator","OverflowSeparator","ToolBarSpacer","TemplateItem","OverflowTemplateItem","ToolBar","TOOLBAR","BUTTON","OVERFLOW_BUTTON","TOGGLE_BUTTON","BUTTON_GROUP","SPLIT_BUTTON","SEPARATOR","SPACER_CLASS","SPACER","POPUP","RESIZABLE_TOOLBAR","STATE_DISABLED","STATE_HIDDEN","GROUP_START","GROUP_END","ICON","ICON_PREFIX","BUTTON_ICON","BUTTON_ICON_TEXT","LIST_CONTAINER","SPLIT_BUTTON_ARROW","OVERFLOW_CONTAINER","FIRST_TOOLBAR_VISIBLE","LAST_TOOLBAR_VISIBLE","CLICK","TOGGLE","OVERFLOW_OPEN","OVERFLOW_CLOSE","OVERFLOW_NEVER","OVERFLOW_AUTO","OVERFLOW_ALWAYS","OVERFLOW_HIDDEN","OPTION_LIST_SUFFIX","KENDO_UID_ATTR","toolbar","overflowAnchor","overflowContainer","registerComponent","addOverflowAttr","addUidAttr","addIdAttr","addOverflowIdAttr","hidden","overflowHidden","isEnabled","twin","splitContainerId","resizable","useButtonTag","primary","togglable","addToGroup","clickHandler","getParentGroup","isChild","_addGraphics","spriteCssClass","showText","hasIcon","showIcon","createButtons","buttonConstructor","buttons","buttonGroup","mainButton","arrowButton","popupElement","createMenuButtons","createPopup","_navigatable","splitButton","kendoPopup","menuButtons","rootUid","adjustPopupWidth","computedWidth","min-width","_groups","isMobile","_renderOverflow","overflowUserEvents","_toggleOverflow","_resizeHandler","_shrink","_buttonClick","release","_toggleOverflowAnchor","overflowTool","itemClasses","overflowTemplate","_getItem","toolbarItem","overflowItem","isResizable","buttonGroupInstance","getSelectedFromGroup","horizontalDirection","isComplexTool","hasVisibleChildren","paddingEnd","splitContainer","eventData","urlTarget","isSplitButtonArrow","_toggle","lastHasFocus","firstHasFocus","isOnlyOverflowAnchor","lastItemNotOverflowAnchor","isFirstTool","prevFocusable","isOverflowAnchor","not","_getPrevFocusable","_preventNextFocus","_getNextElement","directionNumber","searchIndex","focusableItem","elementToFocus","prevElement","prevElements","prevAll","containerWidth","_markVisibles","_childrenWidth","childrenWidth","commandElement","visibleCommands","_hideItem","hiddenCommands","_showItem","overflowItems","toolbarItems","visibleOverflowItems","visibleToolbarItems","elementPosition","Selectable","ARIASELECTED","SELECTED","SELECTABLE","UNSELECT","UNSELECTING","INPUTSELECTOR","supportEventDelegation","_lastActive","aria","inputSelectors","_isElement","whichCode","buttonCode","_allowSelection","selectRange","_firstSelectee","_unselect","_notify","_downTarget","currentElement","useAllItems","_selectElement","_invalidateSelectables","toSelect","selectElement","preventNotify","resetTouchEvents","continuousItems","asLowerString","modular","minYear","maxYear","build","weekNumberBuild","isWeekColumnVisible","cellsPerRow","perRow","otherMonth","weekNumberTemplate","cellTemplate","emptyCellTemplate","otherMonthTemplate","otherMonthCellTemplate","createDate","disableDates","OTHERMONTH","isInRange","date1","date2","year1","getToday","restrictValue","shiftArray","daysBetweenTwoDates","endDate","fromDateUTC","endDateUTC","addDaysToArray","numberOfDays","fromDate","mousetoggle","HOVER","MOUSEENTER","FOCUS","prevent","dateObject","getCalendarInfo","extractFormat","MONTH","makeUnselectable","isIE8","addClassToViewContainer","currentView","isEqualDatePart","value1","value2","isEqualMonth","getDisabledExpr","createDisabledExpr","convertDatesArray","disabledDates","searchExpression","isEqualDate","oldValue","toDateObject","transitionOrigin","KEYDOWN_NS","SLIDE","CENTURY","NAVIGATE","DISABLED","FOCUSED","OTHERMONTHCLASS","OUTOFRANGE","TODAY","CELLSELECTOR","CELLSELECTORVALID","WEEKCOLUMNSELECTOR","BLUR","FOCUS_WITH_NS","MOUSEENTER_WITH_NS","PREVARROW","NEXTARROW","ARIA_DISABLED","ARIA_SELECTED","ARIA_LABEL","decade","century","Calendar","unescape","_templates","_selectable","_header","_viewWrapper","_footer","_focusView","focusOnNav","_cellID","_class","_selectDates","_addClassProxy","_cell","todayString","toDateString","_cellByDate","_removeClassProxy","selectDates","weekColumnHeader","_today","_title","_destroySelectable","_table","_bindTable","_option","navigateToPast","navigateToFuture","navigateUp","navigateDown","future","_oldTable","_changeView","_animate","_visualizeSelectedDatesInView","validSelectedDates","datesUnique","_validateValue","selectedDates","selectableOptions","_onSelect","_onRelatedTarget","_toggleSelection","_cellsBySelector","_deselect","_addSelectedCellsToArray","_rangeSelection","currentCell","toDateCell","daysDifference","currentDateIndex","_dateInView","firstDateInView","lastDateInView","_isNavigatable","cellIndex","isDisabled","focusedDate","_keyboardToggleSelection","_nextNavigatable","_keyboardRangeSelection","navigatableDate","viewWrapper","insertAfter","_horizontal","viewWidth","float","margin-left","_vertical","disabledDate","firstDayCurrentMonth","isBigger","isTodayDisabled","_todayClick","footerTemplate","firstVisibleDay","calendarInfo","tzOffsetBefore","resultDATE","tzOffsetDiff","navigateUrl","showHeader","hasUrl","currentCalendar","firstDayIdx","shortNames","linkClass","dateString","month1","month2","year2","setMonth","viewsEnum","approximateStringMatching","oldText","oldFormat","newText","deletedSymbol","oldTextSeparator","knownSymbols","customDateTime","INPUT_EVENT_NAME","STATEDISABLED","STATEDEFAULT","STATEINVALID","READONLY","DateInput","insidePicker","_inputWrapper","_form","weekday","hour","minute","dayperiod","_unbindInput","_bindInput","_updateElementValue","_formElement","_resetHandler","_dateTime","getDateObject","stringAndFromat","toPair","_oldText","_format","_editable","_paste","_input","_mouseUp","navigationOnly","valid","difSym","newEvent","stateInvalid","blinkInvalid","parsePart","_selectSegment","_blinkInvalidTimeout","_selectNearestSegment","returnValue","formId","keycode","modifyPart","initDate","initFormat","initCulture","initMessages","generateMatcher","retFormat","returnsFormat","matcher","setExisting","typedMonthPart","typedDayPeriodPart","sampleFormat","placeholders","mins","formatResult","newMonth","currentChar","newHours","monthNames","newYear","newMinutes","newSeconds","parseFormats","DatePicker","DIV","SPAN","DEFAULT","HOVEREVENTS","ARIA_EXPANDED","ARIA_HIDDEN","DateView","_dateViewID","_calendar","popupHovered","selectIsClicked","handled","_initialOptions","dateView","_updateARIA","_icon","aria-expanded","aria-owns","autocomplete","_createDateInput","_old","_update","ARIATemplate","dateInput","_dateInput","_dateIcon","_toggleHover","_focusElement","dateChanged","valueUpdated","textFormatted","_typing","stopImmediatePropagation","aria-controls","isSameType","_ariaTemplate","buttonHtml","CLASS_ICON","truncate","placeholderSupported","INPUT","SPIN","TOUCHEND","STATE_INVALID","INTEGER_REGEXP","NumericTextBox","inputType","isStep","_focusout","_arrows","_validation","_text","_toggleText","restrictDecimals","spinners","upArrowText","downArrowText","_upArrowEventHandler","_downArrowEventHandler","_spin","_upArrow","_downArrow","_keypress","_keyup","_arrowsWrap","_placeholder","aria-valuemin","aria-valuemax","adjusted","_adjust","_focusin","arrows","_spinning","_validationIcon","_focusing","groupRegExp","extractRegExp","caretPosition","_culture","_removeInvalidState","CLASSNAME","accessKey","_step","isNumPadDecimal","isValid","_numericRegex","_addInvalidState","fractionRule","_separator","_floatRegExp","rounder","isNotNull","DOMElement","resolveRules","resolvers","validator","ruleResolvers","numberOfDecimalDigits","parseHtml","parseHTML","searchForMessageContainer","invalidMsgRegExp","Validator","INVALIDMSG","INVALIDINPUT","VALIDINPUT","emailRegExp","urlRegExp","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","NAME","FORM","NOVALIDATE","VALIDATE","VALIDATE_INPUT","patternMatcher","hasAttribute","validateAttributeSelector","_errorTemplate","errorTemplate","_inputSelector","_checkboxSelector","_errors","_isValidated","required","email","dateCompare","checkbox","raise","validateOnBlur","_checkElement","validateInput","inputs","invalid","lbl","messageText","wasValid","messageLabel","lblId","inputWrap","_checkValidity","_findMessageContainer","_extractMessage","_decorateMessageContainer","hideMessages","locators","messageLocators","locate","ruleKey","nonDefaultMessage","customMessage","fieldType","convertToValueBinding","bindAttr","createAttributes","ruleName","stringRule","validation","DATATYPE","BINDING","specialRules","AUTOCOMPLETEVALUE","addIdAttribute","convertItems","addValidationRules","modelField","oldIE","nameSpecialCharRegExp","ERRORTEMPLATE","EQUAL_SET","editors","kendoNumericTextBox","kendoDatePicker","mobileEditors","Editable","_isMobile","_validateProxy","_validate","clearContainer","skipFocus","editor","isValuesEditor","isCustomEditor","preventChangeTrigger","_validationEventInProgress","bindAttribute","bindingRegex","validatable","modelFields","toInt","constrain","normalizedValue","executableScript","getPosition","parentOverflowX","parentOverflowY","offsetLeft","WindowResizing","wnd","_preventDragging","_draggable","KWINDOWRESIZEHANDLES","dragstart","dragend","addOverlay","removeOverlay","WindowDragging","dragHandle","dragcancel","MODAL_NS","KWINDOW","KWINDOWTITLE","KWINDOWTITLEBAR","KWINDOWCONTENT","KDIALOGCONTENT","KOVERLAY","LOADING","KHOVERSTATE","KFOCUSEDSTATE","MAXIMIZEDSTATE","CURSOR","REFRESH","MINIMIZE","MAXIMIZE","RESIZESTART","RESIZEEND","DATADOCOVERFLOWRULE","ZINDEX","MINIMIZE_MAXIMIZE","KPIN","KUNPIN","PIN_UNPIN","TITLEBAR_BUTTONS","REFRESHICON","WINDOWEVENTSHANDLED","zero","SIZE","small","medium","large","Window","windowContent","windowFrame","globalWindow","isVisible","suppressActions","actions","containment","_createWindow","_dimensions","minTop","minLeft","maxTop","maxLeft","_overlay","_buttonEnter","_buttonLeave","_windowActionHandler","windowInstance","pinned","pin","aria-labelledby","_onDocumentResize","_marker","_tabKeyTrap","maxHeight","sizeClass","contentBoxSizing","lrBorderWidth","tbBorderWidth","_isPinned","_updateBoundaries","_animationOptions","basicAnimation","resizing","toggleMaximization","templates","resizeHandle","_actions","titlebar","windowSpecificCommands","cachedOptions","_enableDocumentScrolling","fade","autoFocus","isMaximized","isMinimized","_closable","newWidth","newHeight","_close","unpin","maximize","minimize","preventScroll","_stopDocumentScrolling","_actionForIcon","k-i-close","k-i-window-maximize","k-i-window-minimize","k-i-window-restore","k-i-refresh","k-i-pin","k-i-unpin","_modals","zStack","_object","newTop","newLeft","documentWindow","_scrollIsAppended","titleBarHeight","encoded","titleBar","titleElement","scrollContainer","otherModalsVisible","overlayFx","showOptions","containmentContext","Fade","fadeIn","_containerScrollTop","_containerScrollLeft","_removeOverlay","suppressAnimation","modals","hideOverlay","hideOptions","systemTriggered","defaultPrevented","userTriggered","lastModal","_actionable","_shouldFocus","windowTop","currentWindow","originalZIndex","windowObject","zIndexNew","shouldRestrictTop","restoreOptions","_sizingAction","actionId","before","$body","$html","_storeOverflowRule","_restoreOverflowRule","$element","_isOverflowStored","overflowRule","win","contentFrame","_triggerRefresh","_ajaxComplete","_loadingIconTimeout","_ajaxError","_ajaxSuccess","_showLoading","iframeSrcAttributes","contentHtml","wrapperPosition","relativeElMarginLeft","relativeElMarginTop","elementPadding","resizeDirection","initialSize","containerOffset","_relativeElMarginLeft","_relativeElMarginTop","leftRtlOffset","scrollOffset","windowBottom","windowRight","newWindowTop","initialWindowPosition","initialPointerPosition","_finishDrag","unifyType","mapChangedItems","itemsToMatch","itemsLength","selectedLength","unchanged","isValidFilterExpr","removeFiltersForField","STATIC_LIST_NS","StaticList","percentageUnitsRegex","GROUPHEADER","ITEMSELECTOR","LABELIDPART","CASCADE","HIDDENCLASS","isIE","quotRegExp","alternativeNames","ComboBox","DropDownList","List","_isSelect","ul","aria-hidden","_listMousedown","columns","_columnsHeader","_noData","_accessors","_initValue","headerTemplate","noDataTemplate","_renderFooter","_renderNoData","_focused","_angularElement","colGroup","currentColumn","columnsHeaderTemplate","currentWidthInt","widthStyle","columnsHeader","noData","_listOptions","changeEventOption","_listChange","listBoundHandler","_listBound","_activateItem","deactivate","_deactivateItem","groupTemplate","fixedGroupTemplate","_initList","listOptions","selectedItemChange","VirtualList","_setListValue","_updateSelectionState","filterInput","_isFilterEnabled","_hideClear","_showClear","_clearValue","_clearText","_accessor","_customOption","enforceMinLength","highlightFirst","_clearFilter","_filterSource","newExpression","dataSourceState","isMultiColumnFiltering","filterFields","resetPageSettings","removed","_clearFilterExpressions","_pushFilterExpression","_cascading","setDSFilter","filtersToRemove","_toggleNoData","_toggleHeader","groupHeader","_allowOpening","_ignoreCase","widgetOptions","fromFilter","_buildExpression","_open","_clearButton","clearButton","_inputValue","_typingTimeout","minLength","_emptySearch","_searchByWord","_unbindDataSource","selectedDataItems","_aria","suggest","_ariaLabel","labelId","focusedElm","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","_valueBeforeCascade","_userTriggered","_oldIndex","isFiltered","typing","_enable","_dataValue","_offsetHeight","_height","popups","footerHeight","_openHandler","_adjustListWidth","autoWidth","_closeHandler","_focusItem","noFocusedItem","scrollToIndex","_calculateGroupPadding","_calculatePopupHeight","_calculateColumnsHeaderPadding","_refreshScroll","enableYScroll","_resizePopup","_popup","_makeUnselectable","preventFocus","touchEnabled","MSPointers","_prevent","_triggerCascade","_cascadeTriggered","_cascadedValue","_triggerChange","_requestStartHandler","_requestEndHandler","_errorHandler","requireValueMapper","valueMapper","_initial","_initialIndex","_parentWidget","_cascadeSelect","_cascadeValue","_accessorInput","_accessorSelect","_custom","_syncValueAndText","custom","_hideBusy","_busy","_arrowIcon","_showBusy","_request","_requestEnd","_firstItem","focusFirst","_lastItem","focusLast","_nextItem","focusNext","_prevItem","focusPrev","activeFilter","shouldTrigger","_fetch","dataItemByIndex","getElementIndex","focusout","scrollWith","_fetchData","optionLabel","dataText","dataValue","htmlElement","_cascade","cascade","_cascadeHandlerProxy","_cascadeHandler","_cascadeFilterRequests","_selectedValue","_toggleCascadeOnFocus","valueBeforeCascade","_clearSelection","_cascadeChange","filterValue","cascadeFromParentField","cascadeFromField","currentHandler","_touchHandlers","_optionID","_selectedIndices","_dataItems","_getter","_onScroll","_scrollId","_renderHeader","_fixedHeader","endY","tapPosition","_touchTriggered","_triggerClick","itemOffsetTop","itemOffsetHeight","contentScrollTop","contentOffsetHeight","bottomDistance","_getValues","_valueGetter","hasCandidate","_get","focusIndex","skipUpdate","_skipUpdate","filtered","singleSelection","selectedIndices","uiSelectedIndices","added","_deselectFiltered","_valueComparer","_valueDeferred","_valueIndices","_valueExpr","normalized","_valueType","_dataItemPosition","valueExpr","removedIndices","templateText","_normalizeIndices","newIndices","_firstVisibleItem","itemHeight","lastChild","previousSibling","isGrouped","visibleItem","_renderItem","notFirstItem","hasColumns","isLastGroupedItem","_renderColumns","dataContext","_selected","_lastDSFilter","skipUpdateOnBind","isItemChange","_bound","lastFrom","isPrimitive","getItemCount","listScreens","getDefaultItemHeight","mockList","bufferSizes","opposite","listValidator","downThreshold","upThreshold","lastScrollTop","scrollCallback","syncList","reorder","webkitTransform","map2","ITEMCHANGE","reshift","placeholderTemplate","renderColumns","GROUPITEM","isActivePromise","WRAPPER","VIRTUALLIST","CONTENT","LIST","HEADER","VIRTUALITEM","ITEM","HEIGHTCONTAINER","LISTBOUND","VIRTUAL_LIST_NS","_fetching","_selectedDataItems","_selectedIndexes","_rangesList","_promisesList","_renderItems","_triggerListBound","oppositeBuffer","mapValueTo","_selectProxy","_clean","_deferValueSet","mute","_selectingValue","_highlightSelectedItems","_getElementByDataItem","_mute","_createList","_forcePrefetch","shouldClear","_prefetchByValue","_checkValuesOrder","_removedAddedIndexes","dataView","_dataView","forSelection","mapValueToIndex","mapValueToDataItem","indexes","_getIndecies","deferredRange","itemCount","_","existingRange","isEmptyList","_activeDeferred","_getSkip","_findDataItem","_getRange","triggerEvent","_getElementByIndex","_focusedIndex","_getElementLocation","_screenHeight","heightContainer","isAlreadySelected","prefetchStarted","_selectDeferred","_deselectCurrentValues","_listCreated","_lastScrollTop","hasData","setScreenHeight","yPosition","yDownPostion","screenEnd","_generateItems","_saveInitialRanges","_buildValueGetter","_setHeight","getList","_listItems","_whenChanged","_reorderList","padHeight","lastRequestedRange","lastRangeStart","rangeStart","flatGroup","groupLength","_getterDeferred","firstItemIndex","_indexConstraint","firstVisibleGroup","fixedGroupText","currentVisibleGroup","firstVisibleDataItemIndex","firstVisibleDataItem","_itemMapper","listType","_currentGroup","_getDataItemsCollection","_listIndex","theValidator","theNew","currentOffset","list2","range2","_bufferSizes","buffers","selectedIndexes","removedindexesCounter","_deselectSingleItem","oldSkip","firstItem","assign","normalizeIndex","sameCharsOnly","nsFocusEvent","CLICKEVENTS","STATE_FILTER","STATE_ACCEPT","MSG_INVALID_OPTION_LABEL","_focusHandler","_focusInputHandler","_focusInput","_optionLabel","_inputTemplate","_prev","_word","_span","_mobile","_filterHeader","_attachFocusHandlers","hasOptionLabel","_textAccessor","_optionLabelText","valueTemplate","optionLabelTemplate","_arrow","_focusFilter","_resizeFilterInput","isInputActive","originalPrevent","_optionLabelDataItem","loweredText","_valueSetter","_assignInstance","_buildOptions","optionLabelValue","initialIndex","_presetValue","_selectValue","_filterPaste","_search","_focusinHandler","_focusoutHandler","isIFrame","self","_wrapperMousedown","_wrapperClick","dropDownWrapper","isPopupVisible","_getElementDataItem","_matchText","_shuffleData","splitIndex","optionDataItem","_selectNext","oldFocusedItem","isInLoop","_last","charCode","_popupOpen","compareElement","jQueryCandidate","_resetOptionLabel","focusedItem","additionalClass","keepState","aria-haspopup","SELECTOR","DOMelement","accesskey","unselectable","getElements","optionLabelText","origEvent","isAutoConnector","closestConnector","resCtr","minimumDistance","MAXINT","indicesOfItems","filterShapeDataItem","filterConnectionDataItem","fromConnector","fromX","fromY","toConnector","toX","toY","connectionSelector","kendoDropDownList","InactiveItem","InactiveItemsCollection","cloneDataItem","splitDiagramElements","createModel","clearField","copyDefaultOptions","mainOptions","translateToOrigin","defaultButtons","DiagramElement","Connector","Diagram","DiagramToolBar","Editor","PopupEditor","CASCADING","DEFAULT_CANVAS_WIDTH","DEFAULT_CANVAS_HEIGHT","DEFAULT_SHAPE_TYPE","DEFAULT_SHAPE_WIDTH","DEFAULT_SHAPE_HEIGHT","DEFAULT_SHAPE_MINWIDTH","DEFAULT_SHAPE_MINHEIGHT","DEFAULT_SHAPE_POSITION","DEFAULT_CONNECTION_BACKGROUND","TRANSFORMED","MOUSEWHEEL_NS","MOBILE_ZOOM_RATE","MOBILE_PAN_DISTANCE","BUTTON_TEMPLATE","CONNECTION_CONTENT_OFFSET","DefaultConnectors","imageClass","extra","serializable","_content","contentVisual","_contentVisual","_updateContentVisual","_createContentVisual","elementTemplate","_canSelect","shapeId","updateOptionsFromModel","createShapeVisual","updateBounds","_createConnectors","_setOptionsFromModel","modelOptions","redrawVisual","_isEditable","_redrawVisual","syncChanges","_suspendModelRefresh","_resumeModelRefresh","_rotate","_alignContent","containerRect","aligner","contentBounds","contentRect","alignedBounds","_transformedBounds","_rotatedBounds","_setBounds","_triggerBoundsChange","_layouting","refreshConnections","deselected","_internalSelection","_selectionChanged","sc","deltaAngle","newPosition","cons","nameOrPoint","_transformPoint","shapeOptions","boundsChange","shapeVisual","_visualOptions","_updateConnectors","_showConnectors","visualTemplate","_initRouter","_sourcePoint","_targetPoint","_setSource","_setTarget","definers","dataMap","_dataMap","connectionsDataSource","shapeSource","defaultConnector","_removeFromSourceConnector","_clearSourceConnector","_setFromOptions","sourceDefiner","_sourceDefiner","shapeTarget","_removeFromTargetConnector","_clearTargetConnector","_setToOptions","targetDefiner","_targetDefiner","connectorName","setNewTarget","inactiveItem","_inactiveShapeItems","_deferredConnectionUpdates","onActivate","alignToPath","midIdx","_router","pts","_resolveConnectors","_refreshPath","sourceConnectors","targetConnectors","_resolveAutoConnectors","minNonConflictSource","minNonConflictTarget","minSource","minTarget","sourceIdx","targetIdx","minNonConflict","_testRoutePoints","exclude","router","passRoute","_getRouteExclude","_shapesQuadTree","hitTestRect","_isPointInsideShape","boundsX","boundsY","_initElements","_extendLayoutOptions","_initDefaults","_interactionDefaults","_initCanvas","adornerLayer","_createHandlers","_clipboard","pauseMouseHandlers","_fetchFreshData","_createGlobalToolBar","_createOptionElements","toolBar","_toolBarClick","createShape","_createShape","edit","createConnection","_connectionsDataMap","addConnection","editModel","editorType","connectionSelectorHandler","cancelEdit","shapeEditors","shapeTemplate","connectionEditors","connectionTemplate","_editArgs","_getEditDataSource","_destroyEditor","saveEdit","userShapeDefaults","canvasContainer","viewPort","_userEvents","_dragStart","_gestureStart","_gestureChange","_gestureEnd","doubleTap","_mouseMove","_mouseDown","_syncHandler","_pauseMouseHandlers","_eventPositions","_meta","_createToolBar","ctrlPressed","focused","documentToModel","initialCenter","_gesture","_initialCenter","zoomedPoint","documentToView","updateZoom","_getValidZoom","_panTransform","_updateAdorners","pointPosition","shapesLength","_createShapes","_createConnections","_findConnectionTarget","destroyScroller","_destroyGlobalToolBar","_removeItem","_removeShapeDataItem","_removeConnectionDataItem","_getDiagramItems","_fixOrdering","bringIntoView","newPan","_zoomMainLayer","alignShapes","viewportVector","_getPan","_copyOffset","copied","mapping","_updateCopiedConnection","sourceConnection","di","_containerOffset","viewToDocument","viewToModel","_transformWithMatrix","_matrixInvert","_layerMatrix","layerToModel","_layerMatrixInvert","viewPoint","modelToDocument","setConnectionsDataSource","_connectionDataSource","_redrawConnections","getShapeByModelId","getShapeByModelUid","getConnectionByModelId","getConnectionByModelUid","_transformMainLayer","_finishPan","_storeViewMatrix","_storeLayerMatrix","canvasTransform","shapePos","conPos","removedConnections","_removeShape","_removeConnection","_removeDataItems","recursive","_removeShapeConnections","_addDataItem","_addDataItemByUid","_addDataItems","parentShape","_refreshSource","_bindingRoots","_addItem","preventClosing","popupWidth","popupHeight","connectionBounds","singleToolBar","popupZIndex","_normalizePointZoom","undone","redone","_loadingShapes","_loadingConnections","ds","_shapesRefreshHandler","_shapesRequestStartHandler","_shapesErrorHandler","_refreshShapes","_shapesRequestStart","_error","_treeDataSource","_connectionsRefreshHandler","_connectionsRequestStartHandler","_connectionsErrorHandler","_refreshConnections","_connectionsRequestStart","_connectionsError","_shouldRefresh","_removeShapes","_updateShapes","_syncShapes","_rebindShapesAndConnections","_addShapes","_addConnections","_removeConnections","_updateConnections","_addConnectionDataItem","_validateConnector","adorners","_refresh","viewRect","clipWrap","deferredConnectionUpdates","_tools","createToolBar","createTools","appendTools","getKendoPopup","_toolBar","kendoToolBar","getKendoToolBar","createTool","toolName","_setAttributes","editTool","deleteTool","rotateAnticlockwiseTool","_appendGroup","_rotateGroup","rotateClockwiseTool","createShapeTool","_createGroup","createConnectionTool","undoTool","_historyGroup","redoTool","_getAttributes","selectedElements","delete","selectedElemens","rotateClockwise","rotateAnticlockwise","_getFields","createEditable","formContent","_renderTemplate","_renderFields","_renderButtons","_cancelClick","_attachButtonEvents","_createButton","_cancelClickHandler","_updateClickHandler","_updateClick","_editUpdateClickHandler","deffered","_testRect","overlapsBounds","childIdx","boundsChangeHandler","_boundsChange","rootSize","xIdx","yIdx","colorsByLength","rgbColor","minRGBtoDecimal","rgbToDecimal","maxRGBtoDecimal","isDarker","colorBrightness","colorByIndex","buildColorFromRGB","minColor","maxColor","currentStep","decimalToRgb","colorToRGB","rgbToHex","colorLength","DATA_BOUND","ITEM_CREATED","MOUSEOVER_NS","TreeMap","_setLayout","colorField","_layout","SliceAndDice","SliceAndDiceView","Squarified","SquarifiedView","_onDataChange","htmlSize","_wrapItem","compute","_setColors","_cleanItems","createRoot","_colorIdx","colorRange","leafNodes","colorIdx","_contentSize","renderHeight","findByUid","_removeActiveState","_resizeItems","setItemSize","leaf","layoutChildren","minimumSideValue","parentArea","totalArea","itemsArea","layoutHorizontal","squarify","initElement","computeDim","newCoords","layoutLast","layoutRow","worstAspectRatio","layoutV","layoutH","layoutVertical","layoutChange","areaSum","rootCoord","newRootCoord","ans","_totalArea","_createTitle","_compile","_createWrap","rootWrap","_createLeaf","_createTile","_tileColorBrightness","_itemCoordinates","titleTemplate","sliceAndDice","withoutTimeout","$timeout","createWidget","origAttr","controllers","createIt","originalElement","destroyRegister","kNgDisabled","kNgReadonly","isReadonly","kRebind","ctor","OPTIONS_NOW","exposeWidget","$emit","destroyWidgetOnScopeDestroy","setupRebind","$eval","bindToKNgDisabled","bindToKNgReadonly","kNgModel","bindToKNgModel","ngModel","bindToNgModel","ngForm","propagateClassToWidgetWrapper","kNgDelay","delayValue","parsed","unresolved","unwatch","$watch","$root","unregister","$attr","$apply","addOption","scopeValue","widgetEvents","optionsPath","kOptions","optionsValue","dataName","eventKey","optionName","ignoredOwnProperties","ignoredAttributes","kDataSource","createDataSource","PanelBar","Menu","$log","warn","kendoWidget","$parse","formValue","isForm","formRegExp","haveChangeOnElement","viewRender","onChange","currentVal","$viewValue","$modelValue","$render","formPristine","$pristine","$setViewValue","$setPristine","digest","AutoComplete","$isEmpty","rangePickerModels","rangePickerStartModel","rangePickerEndModel","updating","valueIsCollection","currentValueLength","watchHandler","changeHandler","DateRangePicker","_startDateInput","_endDateInput","RangeSlider","$angular_setLogicValue","$watchCollection","$setDirty","$angular_getLogicValue","deregister","$on","mo","disconnect","prevClassList","MutationObserver","changes","chg","currClassList","attributeName","rebindAttr","templateOptions","isUpload","_cleanUp","WIDGET_TEMPLATE_OPTIONS","templateContents","replaceChild","setTemplate","createDirectives","klass","make","directiveName","widgetName","module","directive","directiveFactory","shortcut","dashed","SKIP_SHORTCUTS","TAGNAMES","scopeField","kScopeField","MANUAL_DIRECTIVES","kendoWidgetInstance","isDigesting","destroyScope","$destroy","defadvice","origMethod","pendingPatches","$injector","$defaultCompile","encOpen","encClose","TreeList","TreeView","Scheduler","PivotGrid","PivotConfigurator","ContextMenu","toDataSource","mew","factory","kendoRenderedTimeout","RENDERED","require","controller","$scope","$attrs","roleattr","DateTimePicker","TimePicker","ColorPicker","MaskedTextBox","Upload","MobileButton","MobileBackButton","MobileDetailButton","ListView","MobileListView","ScrollView","ActionSheet","Switch","$angular_scope","$angular_init","itemScope","$$kendoScope","vars","$new","$angular_makeEventHandler","kendoEvent","elems","colIdx","locals","_checkBoxSelection","angularDataItem","templateSettings","terminal","pre","post","_scroller","kAttr","MobileScrollView","Pager","templateDirectives","templateName","outerHTML"],"mappings":"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ASm4H,MACL,KAAUh2H,OAAM,6DAEpB,QAAS6b,IAAIrT,EAAG8hB,GACZ,MAAOl1B,MAAKymB,IAAIrT,GAAKpT,KAAKymB,IAAIyO,GA0iBlC,QAAS8rG,IAAgB/8H,EAAGC,GACxB,MAAO,KAAMlE,KAAKC,IAAID,KAAKC,IAAIgE,EAAIC,GAAK,KAsQ5C,QAASsyF,IAAWx3F,GAChB,MAAOA,IAAS,KAAS,EA77LhC,GAEOwkB,IACA29D,GACAypB,GACAtN,GACA1lG,GACAugH,GACAvf,GACAsY,GACA+vB,GACA/rB,GACA3xF,GACAvnB,GACAsB,GACA4jI,GACAC,GACAC,GACAC,GACAtpD,GACAF,GACAypD,GACAvJ,GACAwJ,GACAC,GACA/rB,GACAgsB,GACAlJ,GACAmJ,GACAp9G,GACAq9G,GACA9iG,GACA+iG,GACAC,GACA39G,GACAy3F,GACAwc,GACAt7F,GACAilG,GACAC,GACAC,GACAhlI,GACAilI,GACA79G,GACAwgD,GACAhjE,GACAk2E,GACAoqD,GACAxpE,GACAypE,GACArjG,GACAsjG,GACA/uH,GACAgvH,GAmDAxL,GAuCAU,GAwCA+K,GAWA70H,GACA80H,GAaAC,GACAC,GAwCAC,GAkCAC,GACAC,GASAC,GAKAjL,GAOAkL,GAuCAC,GAoBAC,GACAC,GAyDA52C,GACAtlD,GACAqqD,GACA9B,GACAG,GACA7O,GACArM,GACAkc,GACAD,GACAj/D,GACAo/D,GACAjD,GACAsD,GACAx/E,GACAogF,GACAT,GACA+xC,GAwFAxvC,GAuCAklC,GA4LAuK,GA6GAC,GAeAC,GACAC,GA6BAC,GAsOAC,GAkGAC,GAkGAC,GACAC,GACAC,GA4JAC,GAoGAC,GAmJAC,GACApuB,GAqCAquB,GACAC,GAwIAC,GA8BAC,GA+EAC,GACAC,GACAC,GAkSAC,GAkpBAnJ,GACAF,GACAF,GACAD,GACAD,GACAD,GACAD,GACAD,GACA6J,GACArJ,GACAtB,GACAW,GACAL,GACA8D,GACAD,GACAD,GACAjC,GA4MA2I,GAaAC,GA0dA7F,GACA8F,GAUAnG,GACA19F,GACAy8F,G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QAAS,WACLrlH,KAAK+sM,WAAW/sM,KAAK+yM,OAEzBhE,YAAa,WACT,GAAIznM,GAAOtH,IACXsH,GAAKmzH,SAAWnzH,EAAK1O,OAAS0O,EAAK+0H,WAAa/0H,EAAK4iM,kBAEzD6C,WAAY,SAAUt8J,GAAV,GACuD7yC,GACtD9C,EADLwM,EAAOtH,KAAMgO,EAAU1G,GAAAA,EAAK2jM,aAAax6J,EAC7C,KAAS31C,EAAI,EAAGA,EAAIkT,EAAQzW,OAAQuD,IAChC8C,EAAQoV,SAAShF,EAAQhX,OAAO8D,GAAI,IACpCwM,EAAK0G,QAAQxF,KAAK5K,GAClB0J,EAAK+0H,YAAcz+H,CAEvB0J,GAAKurM,UAAYpiK,EAAOnpC,EAAK3M,YAEjCm4M,aAAc,SAAU9C,EAAeH,GACnC,IAAK,GAAI/0M,GAAI,EAAGA,EAAI+0M,EAAOt4M,OAAQuD,IAC/B,GAAIkF,KAAK6vM,EAAO/0M,IAAIhB,GAAGk2M,EAAcpyM,MAAOoyM,EAAcl9L,OACtD,MAAO+8L,GAAO/0M,EAGtBkF,MAAKuqM,sBAAsByF,EAAcpyM,MAAM5G,OAAOg5M,EAAcl9L,SAExEm4L,cACI,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,OACA,SAEJ8H,KAAM,MAEVtI,EAAUuI,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","file":"kendo.dataviz.min.js","sourcesContent":["/*!\n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n                                                                                                                                                                                                       \n\n*/\n(function (f, define) {\n    define('kendo.core', ['jquery'], f);\n}(function () {\n    var __meta__ = {\n        id: 'core',\n        name: 'Core',\n        category: 'framework',\n        description: 'The core of the Kendo framework.'\n    };\n    (function ($, window, undefined) {\n        var kendo = window.kendo = window.kendo || { cultures: {} }, extend = $.extend, each = $.each, isArray = $.isArray, proxy = $.proxy, noop = $.noop, math = Math, Template, JSON = window.JSON || {}, support = {}, percentRegExp = /%/, formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g, boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i, numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/, FUNCTION = 'function', STRING = 'string', NUMBER = 'number', OBJECT = 'object', NULL = 'null', BOOLEAN = 'boolean', UNDEFINED = 'undefined', getterCache = {}, setterCache = {}, slice = [].slice, noDepricateExtend = function () {\n                var src, copyIsArray, copy, name, options, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false;\n                if (typeof target === 'boolean') {\n                    deep = target;\n                    target = arguments[i] || {};\n                    i++;\n                }\n                if (typeof target !== 'object' && !jQuery.isFunction(target)) {\n                    target = {};\n                }\n                if (i === length) {\n                    target = this;\n                    i--;\n                }\n                for (; i < length; i++) {\n                    if ((options = arguments[i]) != null) {\n                        for (name in options) {\n                            if (name == 'filters' || name == 'concat' || name == ':') {\n                                continue;\n                            }\n                            src = target[name];\n                            copy = options[name];\n                            if (target === copy) {\n                                continue;\n                            }\n                            if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)))) {\n                                if (copyIsArray) {\n                                    copyIsArray = false;\n                                    clone = src && jQuery.isArray(src) ? src : [];\n                                } else {\n                                    clone = src && jQuery.isPlainObject(src) ? src : {};\n                                }\n                                target[name] = noDepricateExtend(deep, clone, copy);\n                            } else if (copy !== undefined) {\n                                target[name] = copy;\n                            }\n                        }\n                    }\n                }\n                return target;\n            };\n        kendo.version = '2019.2.619'.replace(/^\\s+|\\s+$/g, '');\n        function Class() {\n        }\n        Class.extend = function (proto) {\n            var base = function () {\n                }, member, that = this, subclass = proto && proto.init ? proto.init : function () {\n                    that.apply(this, arguments);\n                }, fn;\n            base.prototype = that.prototype;\n            fn = subclass.fn = subclass.prototype = new base();\n            for (member in proto) {\n                if (proto[member] != null && proto[member].constructor === Object) {\n                    fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n                } else {\n                    fn[member] = proto[member];\n                }\n            }\n            fn.constructor = subclass;\n            subclass.extend = that.extend;\n            return subclass;\n        };\n        Class.prototype._initOptions = function (options) {\n            this.options = deepExtend({}, this.options, options);\n        };\n        var isFunction = kendo.isFunction = function (fn) {\n            return typeof fn === 'function';\n        };\n        var preventDefault = function () {\n            this._defaultPrevented = true;\n        };\n        var isDefaultPrevented = function () {\n            return this._defaultPrevented === true;\n        };\n        var Observable = Class.extend({\n            init: function () {\n                this._events = {};\n            },\n            bind: function (eventName, handlers, one) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, original, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                if (handlers === undefined) {\n                    for (idx in eventName) {\n                        that.bind(idx, eventName[idx]);\n                    }\n                    return that;\n                }\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        if (one) {\n                            original = handler;\n                            handler = function () {\n                                that.unbind(eventName, handler);\n                                original.apply(that, arguments);\n                            };\n                            handler.original = original;\n                        }\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.push(handler);\n                    }\n                }\n                return that;\n            },\n            one: function (eventNames, handlers) {\n                return this.bind(eventNames, handlers, true);\n            },\n            first: function (eventName, handlers) {\n                var that = this, idx, eventNames = typeof eventName === STRING ? [eventName] : eventName, length, handler, handlersIsFunction = typeof handlers === FUNCTION, events;\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n                    if (handler) {\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.unshift(handler);\n                    }\n                }\n                return that;\n            },\n            trigger: function (eventName, e) {\n                var that = this, events = that._events[eventName], idx, length;\n                if (events) {\n                    e = e || {};\n                    e.sender = that;\n                    e._defaultPrevented = false;\n                    e.preventDefault = preventDefault;\n                    e.isDefaultPrevented = isDefaultPrevented;\n                    events = events.slice();\n                    for (idx = 0, length = events.length; idx < length; idx++) {\n                        events[idx].call(that, e);\n                    }\n                    return e._defaultPrevented === true;\n                }\n                return false;\n            },\n            unbind: function (eventName, handler) {\n                var that = this, events = that._events[eventName], idx;\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                return that;\n            }\n        });\n        function compilePart(part, stringPart) {\n            if (stringPart) {\n                return '\\'' + part.split('\\'').join('\\\\\\'').split('\\\\\"').join('\\\\\\\\\\\\\"').replace(/\\n/g, '\\\\n').replace(/\\r/g, '\\\\r').replace(/\\t/g, '\\\\t') + '\\'';\n            } else {\n                var first = part.charAt(0), rest = part.substring(1);\n                if (first === '=') {\n                    return '+(' + rest + ')+';\n                } else if (first === ':') {\n                    return '+$kendoHtmlEncode(' + rest + ')+';\n                } else {\n                    return ';' + part + ';$kendoOutput+=';\n                }\n            }\n        }\n        var argumentNameRegExp = /^\\w+/, encodeRegExp = /\\$\\{([^}]*)\\}/g, escapedCurlyRegExp = /\\\\\\}/g, curlyRegExp = /__CURLY__/g, escapedSharpRegExp = /\\\\#/g, sharpRegExp = /__SHARP__/g, zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n        Template = {\n            paramName: 'data',\n            useWithBlock: true,\n            render: function (template, data) {\n                var idx, length, html = '';\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n                return html;\n            },\n            compile: function (template, options) {\n                var settings = extend({}, this, options), paramName = settings.paramName, argumentName = paramName.match(argumentNameRegExp)[0], useWithBlock = settings.useWithBlock, functionBody = 'var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;', fn, parts, idx;\n                if (isFunction(template)) {\n                    return template;\n                }\n                functionBody += useWithBlock ? 'with(' + paramName + '){' : '';\n                functionBody += '$kendoOutput=';\n                parts = template.replace(escapedCurlyRegExp, '__CURLY__').replace(encodeRegExp, '#=$kendoHtmlEncode($1)#').replace(curlyRegExp, '}').replace(escapedSharpRegExp, '__SHARP__').split('#');\n                for (idx = 0; idx < parts.length; idx++) {\n                    functionBody += compilePart(parts[idx], idx % 2 === 0);\n                }\n                functionBody += useWithBlock ? ';}' : ';';\n                functionBody += 'return $kendoOutput;';\n                functionBody = functionBody.replace(sharpRegExp, '#');\n                try {\n                    fn = new Function(argumentName, functionBody);\n                    fn._slotCount = Math.floor(parts.length / 2);\n                    return fn;\n                } catch (e) {\n                    throw new Error(kendo.format('Invalid template:\\'{0}\\' Generated code:\\'{1}\\'', template, functionBody));\n                }\n            }\n        };\n        function pad(number, digits, end) {\n            number = number + '';\n            digits = digits || 2;\n            end = digits - number.length;\n            if (end) {\n                return zeros[digits].substring(0, end) + number;\n            }\n            return number;\n        }\n        (function () {\n            var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g, gap, indent, meta = {\n                    '\\b': '\\\\b',\n                    '\\t': '\\\\t',\n                    '\\n': '\\\\n',\n                    '\\f': '\\\\f',\n                    '\\r': '\\\\r',\n                    '\"': '\\\\\"',\n                    '\\\\': '\\\\\\\\'\n                }, rep, toString = {}.toString;\n            if (typeof Date.prototype.toJSON !== FUNCTION) {\n                Date.prototype.toJSON = function () {\n                    var that = this;\n                    return isFinite(that.valueOf()) ? pad(that.getUTCFullYear(), 4) + '-' + pad(that.getUTCMonth() + 1) + '-' + pad(that.getUTCDate()) + 'T' + pad(that.getUTCHours()) + ':' + pad(that.getUTCMinutes()) + ':' + pad(that.getUTCSeconds()) + 'Z' : null;\n                };\n                String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function () {\n                    return this.valueOf();\n                };\n            }\n            function quote(string) {\n                escapable.lastIndex = 0;\n                return escapable.test(string) ? '\"' + string.replace(escapable, function (a) {\n                    var c = meta[a];\n                    return typeof c === STRING ? c : '\\\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);\n                }) + '\"' : '\"' + string + '\"';\n            }\n            function str(key, holder) {\n                var i, k, v, length, mind = gap, partial, value = holder[key], type;\n                if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n                    value = value.toJSON(key);\n                }\n                if (typeof rep === FUNCTION) {\n                    value = rep.call(holder, key, value);\n                }\n                type = typeof value;\n                if (type === STRING) {\n                    return quote(value);\n                } else if (type === NUMBER) {\n                    return isFinite(value) ? String(value) : NULL;\n                } else if (type === BOOLEAN || type === NULL) {\n                    return String(value);\n                } else if (type === OBJECT) {\n                    if (!value) {\n                        return NULL;\n                    }\n                    gap += indent;\n                    partial = [];\n                    if (toString.apply(value) === '[object Array]') {\n                        length = value.length;\n                        for (i = 0; i < length; i++) {\n                            partial[i] = str(i, value) || NULL;\n                        }\n                        v = partial.length === 0 ? '[]' : gap ? '[\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + ']' : '[' + partial.join(',') + ']';\n                        gap = mind;\n                        return v;\n                    }\n                    if (rep && typeof rep === OBJECT) {\n                        length = rep.length;\n                        for (i = 0; i < length; i++) {\n                            if (typeof rep[i] === STRING) {\n                                k = rep[i];\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    } else {\n                        for (k in value) {\n                            if (Object.hasOwnProperty.call(value, k)) {\n                                v = str(k, value);\n                                if (v) {\n                                    partial.push(quote(k) + (gap ? ': ' : ':') + v);\n                                }\n                            }\n                        }\n                    }\n                    v = partial.length === 0 ? '{}' : gap ? '{\\n' + gap + partial.join(',\\n' + gap) + '\\n' + mind + '}' : '{' + partial.join(',') + '}';\n                    gap = mind;\n                    return v;\n                }\n            }\n            if (typeof JSON.stringify !== FUNCTION) {\n                JSON.stringify = function (value, replacer, space) {\n                    var i;\n                    gap = '';\n                    indent = '';\n                    if (typeof space === NUMBER) {\n                        for (i = 0; i < space; i += 1) {\n                            indent += ' ';\n                        }\n                    } else if (typeof space === STRING) {\n                        indent = space;\n                    }\n                    rep = replacer;\n                    if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n                        throw new Error('JSON.stringify');\n                    }\n                    return str('', { '': value });\n                };\n            }\n        }());\n        (function () {\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g, standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i, literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g, commaRegExp = /\\,/g, EMPTY = '', POINT = '.', COMMA = ',', SHARP = '#', ZERO = '0', PLACEHOLDER = '??', EN = 'en-US', objectToString = {}.toString;\n            kendo.cultures['en-US'] = {\n                name: EN,\n                numberFormat: {\n                    pattern: ['-n'],\n                    decimals: 2,\n                    ',': ',',\n                    '.': '.',\n                    groupSize: [3],\n                    percent: {\n                        pattern: [\n                            '-n %',\n                            'n %'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '%'\n                    },\n                    currency: {\n                        name: 'US Dollar',\n                        abbr: 'USD',\n                        pattern: [\n                            '($n)',\n                            '$n'\n                        ],\n                        decimals: 2,\n                        ',': ',',\n                        '.': '.',\n                        groupSize: [3],\n                        symbol: '$'\n                    }\n                },\n                calendars: {\n                    standard: {\n                        days: {\n                            names: [\n                                'Sunday',\n                                'Monday',\n                                'Tuesday',\n                                'Wednesday',\n                                'Thursday',\n                                'Friday',\n                                'Saturday'\n                            ],\n                            namesAbbr: [\n                                'Sun',\n                                'Mon',\n                                'Tue',\n                                'Wed',\n                                'Thu',\n                                'Fri',\n                                'Sat'\n                            ],\n                            namesShort: [\n                                'Su',\n                                'Mo',\n                                'Tu',\n                                'We',\n                                'Th',\n                                'Fr',\n                                'Sa'\n                            ]\n                        },\n                        months: {\n                            names: [\n                                'January',\n                                'February',\n                                'March',\n                                'April',\n                                'May',\n                                'June',\n                                'July',\n                                'August',\n                                'September',\n                                'October',\n                                'November',\n                                'December'\n                            ],\n                            namesAbbr: [\n                                'Jan',\n                                'Feb',\n                                'Mar',\n                                'Apr',\n                                'May',\n                                'Jun',\n                                'Jul',\n                                'Aug',\n                                'Sep',\n                                'Oct',\n                                'Nov',\n                                'Dec'\n                            ]\n                        },\n                        AM: [\n                            'AM',\n                            'am',\n                            'AM'\n                        ],\n                        PM: [\n                            'PM',\n                            'pm',\n                            'PM'\n                        ],\n                        patterns: {\n                            d: 'M/d/yyyy',\n                            D: 'dddd, MMMM dd, yyyy',\n                            F: 'dddd, MMMM dd, yyyy h:mm:ss tt',\n                            g: 'M/d/yyyy h:mm tt',\n                            G: 'M/d/yyyy h:mm:ss tt',\n                            m: 'MMMM dd',\n                            M: 'MMMM dd',\n                            s: 'yyyy\\'-\\'MM\\'-\\'ddTHH\\':\\'mm\\':\\'ss',\n                            t: 'h:mm tt',\n                            T: 'h:mm:ss tt',\n                            u: 'yyyy\\'-\\'MM\\'-\\'dd HH\\':\\'mm\\':\\'ss\\'Z\\'',\n                            y: 'MMMM, yyyy',\n                            Y: 'MMMM, yyyy'\n                        },\n                        '/': '/',\n                        ':': ':',\n                        firstDay: 0,\n                        twoDigitYearMax: 2029\n                    }\n                }\n            };\n            function findCulture(culture) {\n                if (culture) {\n                    if (culture.numberFormat) {\n                        return culture;\n                    }\n                    if (typeof culture === STRING) {\n                        var cultures = kendo.cultures;\n                        return cultures[culture] || cultures[culture.split('-')[0]] || null;\n                    }\n                    return null;\n                }\n                return null;\n            }\n            function getCulture(culture) {\n                if (culture) {\n                    culture = findCulture(culture);\n                }\n                return culture || kendo.cultures.current;\n            }\n            kendo.culture = function (cultureName) {\n                var cultures = kendo.cultures, culture;\n                if (cultureName !== undefined) {\n                    culture = findCulture(cultureName) || cultures[EN];\n                    culture.calendar = culture.calendars.standard;\n                    cultures.current = culture;\n                } else {\n                    return cultures.current;\n                }\n            };\n            kendo.findCulture = findCulture;\n            kendo.getCulture = getCulture;\n            kendo.culture(EN);\n            function formatDate(date, format, culture) {\n                culture = getCulture(culture);\n                var calendar = culture.calendars.standard, days = calendar.days, months = calendar.months;\n                format = calendar.patterns[format] || format;\n                return format.replace(dateFormatRegExp, function (match) {\n                    var minutes;\n                    var result;\n                    var sign;\n                    if (match === 'd') {\n                        result = date.getDate();\n                    } else if (match === 'dd') {\n                        result = pad(date.getDate());\n                    } else if (match === 'ddd') {\n                        result = days.namesAbbr[date.getDay()];\n                    } else if (match === 'dddd') {\n                        result = days.names[date.getDay()];\n                    } else if (match === 'M') {\n                        result = date.getMonth() + 1;\n                    } else if (match === 'MM') {\n                        result = pad(date.getMonth() + 1);\n                    } else if (match === 'MMM') {\n                        result = months.namesAbbr[date.getMonth()];\n                    } else if (match === 'MMMM') {\n                        result = months.names[date.getMonth()];\n                    } else if (match === 'yy') {\n                        result = pad(date.getFullYear() % 100);\n                    } else if (match === 'yyyy') {\n                        result = pad(date.getFullYear(), 4);\n                    } else if (match === 'h') {\n                        result = date.getHours() % 12 || 12;\n                    } else if (match === 'hh') {\n                        result = pad(date.getHours() % 12 || 12);\n                    } else if (match === 'H') {\n                        result = date.getHours();\n                    } else if (match === 'HH') {\n                        result = pad(date.getHours());\n                    } else if (match === 'm') {\n                        result = date.getMinutes();\n                    } else if (match === 'mm') {\n                        result = pad(date.getMinutes());\n                    } else if (match === 's') {\n                        result = date.getSeconds();\n                    } else if (match === 'ss') {\n                        result = pad(date.getSeconds());\n                    } else if (match === 'f') {\n                        result = math.floor(date.getMilliseconds() / 100);\n                    } else if (match === 'ff') {\n                        result = date.getMilliseconds();\n                        if (result > 99) {\n                            result = math.floor(result / 10);\n                        }\n                        result = pad(result);\n                    } else if (match === 'fff') {\n                        result = pad(date.getMilliseconds(), 3);\n                    } else if (match === 'tt') {\n                        result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n                    } else if (match === 'zzz') {\n                        minutes = date.getTimezoneOffset();\n                        sign = minutes < 0;\n                        result = math.abs(minutes / 60).toString().split('.')[0];\n                        minutes = math.abs(minutes) - result * 60;\n                        result = (sign ? '+' : '-') + pad(result);\n                        result += ':' + pad(minutes);\n                    } else if (match === 'zz' || match === 'z') {\n                        result = date.getTimezoneOffset() / 60;\n                        sign = result < 0;\n                        result = math.abs(result).toString().split('.')[0];\n                        result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    }\n                    return result !== undefined ? result : match.slice(1, match.length - 1);\n                });\n            }\n            function formatNumber(number, format, culture) {\n                culture = getCulture(culture);\n                var numberFormat = culture.numberFormat, decimal = numberFormat[POINT], precision = numberFormat.decimals, pattern = numberFormat.pattern[0], literals = [], symbol, isCurrency, isPercent, customPrecision, formatAndPrecision, negative = number < 0, integer, fraction, integerLength, fractionLength, replacement = EMPTY, value = EMPTY, idx, length, ch, hasGroup, hasNegativeFormat, decimalIndex, sharpIndex, zeroIndex, hasZero, hasSharp, percentIndex, currencyIndex, startZeroIndex, start = -1, end;\n                if (number === undefined) {\n                    return EMPTY;\n                }\n                if (!isFinite(number)) {\n                    return number;\n                }\n                if (!format) {\n                    return culture.name.length ? number.toLocaleString() : number.toString();\n                }\n                formatAndPrecision = standardFormatRegExp.exec(format);\n                if (formatAndPrecision) {\n                    format = formatAndPrecision[1].toLowerCase();\n                    isCurrency = format === 'c';\n                    isPercent = format === 'p';\n                    if (isCurrency || isPercent) {\n                        numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                        decimal = numberFormat[POINT];\n                        precision = numberFormat.decimals;\n                        symbol = numberFormat.symbol;\n                        pattern = numberFormat.pattern[negative ? 0 : 1];\n                    }\n                    customPrecision = formatAndPrecision[2];\n                    if (customPrecision) {\n                        precision = +customPrecision;\n                    }\n                    if (format === 'e') {\n                        var exp = customPrecision ? number.toExponential(precision) : number.toExponential();\n                        return exp.replace(POINT, numberFormat[POINT]);\n                    }\n                    if (isPercent) {\n                        number *= 100;\n                    }\n                    number = round(number, precision);\n                    negative = number < 0;\n                    number = number.split(POINT);\n                    integer = number[0];\n                    fraction = number[1];\n                    if (negative) {\n                        integer = integer.substring(1);\n                    }\n                    value = groupInteger(integer, 0, integer.length, numberFormat);\n                    if (fraction) {\n                        value += decimal + fraction;\n                    }\n                    if (format === 'n' && !negative) {\n                        return value;\n                    }\n                    number = EMPTY;\n                    for (idx = 0, length = pattern.length; idx < length; idx++) {\n                        ch = pattern.charAt(idx);\n                        if (ch === 'n') {\n                            number += value;\n                        } else if (ch === '$' || ch === '%') {\n                            number += symbol;\n                        } else {\n                            number += ch;\n                        }\n                    }\n                    return number;\n                }\n                if (format.indexOf('\\'') > -1 || format.indexOf('\"') > -1 || format.indexOf('\\\\') > -1) {\n                    format = format.replace(literalRegExp, function (match) {\n                        var quoteChar = match.charAt(0).replace('\\\\', ''), literal = match.slice(1).replace(quoteChar, '');\n                        literals.push(literal);\n                        return PLACEHOLDER;\n                    });\n                }\n                format = format.split(';');\n                if (negative && format[1]) {\n                    format = format[1];\n                    hasNegativeFormat = true;\n                } else if (number === 0 && format[2]) {\n                    format = format[2];\n                    if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n                        return format;\n                    }\n                } else {\n                    format = format[0];\n                }\n                percentIndex = format.indexOf('%');\n                currencyIndex = format.indexOf('$');\n                isPercent = percentIndex != -1;\n                isCurrency = currencyIndex != -1;\n                if (isPercent) {\n                    number *= 100;\n                }\n                if (isCurrency && format[currencyIndex - 1] === '\\\\') {\n                    format = format.split('\\\\').join('');\n                    isCurrency = false;\n                }\n                if (isCurrency || isPercent) {\n                    numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                    decimal = numberFormat[POINT];\n                    precision = numberFormat.decimals;\n                    symbol = numberFormat.symbol;\n                }\n                hasGroup = format.indexOf(COMMA) > -1;\n                if (hasGroup) {\n                    format = format.replace(commaRegExp, EMPTY);\n                }\n                decimalIndex = format.indexOf(POINT);\n                length = format.length;\n                if (decimalIndex != -1) {\n                    fraction = number.toString().split('e');\n                    if (fraction[1]) {\n                        fraction = round(number, Math.abs(fraction[1]));\n                    } else {\n                        fraction = fraction[0];\n                    }\n                    fraction = fraction.split(POINT)[1] || EMPTY;\n                    zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n                    sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n                    hasZero = zeroIndex > -1;\n                    hasSharp = sharpIndex > -1;\n                    idx = fraction.length;\n                    if (!hasZero && !hasSharp) {\n                        format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n                        length = format.length;\n                        decimalIndex = -1;\n                        idx = 0;\n                    }\n                    if (hasZero && zeroIndex > sharpIndex) {\n                        idx = zeroIndex;\n                    } else if (sharpIndex > zeroIndex) {\n                        if (hasSharp && idx > sharpIndex) {\n                            var rounded = round(number, sharpIndex, negative);\n                            while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n                                sharpIndex--;\n                                rounded = round(number, sharpIndex, negative);\n                            }\n                            idx = sharpIndex;\n                        } else if (hasZero && idx < zeroIndex) {\n                            idx = zeroIndex;\n                        }\n                    }\n                }\n                number = round(number, idx, negative);\n                sharpIndex = format.indexOf(SHARP);\n                startZeroIndex = zeroIndex = format.indexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    start = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    start = sharpIndex;\n                } else {\n                    start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n                }\n                sharpIndex = format.lastIndexOf(SHARP);\n                zeroIndex = format.lastIndexOf(ZERO);\n                if (sharpIndex == -1 && zeroIndex != -1) {\n                    end = zeroIndex;\n                } else if (sharpIndex != -1 && zeroIndex == -1) {\n                    end = sharpIndex;\n                } else {\n                    end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n                }\n                if (start == length) {\n                    end = start;\n                }\n                if (start != -1) {\n                    value = number.toString().split(POINT);\n                    integer = value[0];\n                    fraction = value[1] || EMPTY;\n                    integerLength = integer.length;\n                    fractionLength = fraction.length;\n                    if (negative && number * -1 >= 0) {\n                        negative = false;\n                    }\n                    number = format.substring(0, start);\n                    if (negative && !hasNegativeFormat) {\n                        number += '-';\n                    }\n                    for (idx = start; idx < length; idx++) {\n                        ch = format.charAt(idx);\n                        if (decimalIndex == -1) {\n                            if (end - idx < integerLength) {\n                                number += integer;\n                                break;\n                            }\n                        } else {\n                            if (zeroIndex != -1 && zeroIndex < idx) {\n                                replacement = EMPTY;\n                            }\n                            if (decimalIndex - idx <= integerLength && decimalIndex - idx > -1) {\n                                number += integer;\n                                idx = decimalIndex;\n                            }\n                            if (decimalIndex === idx) {\n                                number += (fraction ? decimal : EMPTY) + fraction;\n                                idx += end - decimalIndex + 1;\n                                continue;\n                            }\n                        }\n                        if (ch === ZERO) {\n                            number += ch;\n                            replacement = ch;\n                        } else if (ch === SHARP) {\n                            number += replacement;\n                        }\n                    }\n                    if (hasGroup) {\n                        number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, integerLength + start), numberFormat);\n                    }\n                    if (end >= start) {\n                        number += format.substring(end + 1);\n                    }\n                    if (isCurrency || isPercent) {\n                        value = EMPTY;\n                        for (idx = 0, length = number.length; idx < length; idx++) {\n                            ch = number.charAt(idx);\n                            value += ch === '$' || ch === '%' ? symbol : ch;\n                        }\n                        number = value;\n                    }\n                    length = literals.length;\n                    if (length) {\n                        for (idx = 0; idx < length; idx++) {\n                            number = number.replace(PLACEHOLDER, literals[idx]);\n                        }\n                    }\n                }\n                return number;\n            }\n            var groupInteger = function (number, start, end, numberFormat) {\n                var decimalIndex = number.indexOf(numberFormat[POINT]);\n                var groupSizes = numberFormat.groupSize.slice();\n                var groupSize = groupSizes.shift();\n                var integer, integerLength;\n                var idx, parts, value;\n                var newGroupSize;\n                end = decimalIndex !== -1 ? decimalIndex : end + 1;\n                integer = number.substring(start, end);\n                integerLength = integer.length;\n                if (integerLength >= groupSize) {\n                    idx = integerLength;\n                    parts = [];\n                    while (idx > -1) {\n                        value = integer.substring(idx - groupSize, idx);\n                        if (value) {\n                            parts.push(value);\n                        }\n                        idx -= groupSize;\n                        newGroupSize = groupSizes.shift();\n                        groupSize = newGroupSize !== undefined ? newGroupSize : groupSize;\n                        if (groupSize === 0) {\n                            if (idx > 0) {\n                                parts.push(integer.substring(0, idx));\n                            }\n                            break;\n                        }\n                    }\n                    integer = parts.reverse().join(numberFormat[COMMA]);\n                    number = number.substring(0, start) + integer + number.substring(end);\n                }\n                return number;\n            };\n            var round = function (value, precision, negative) {\n                precision = precision || 0;\n                value = value.toString().split('e');\n                value = Math.round(+(value[0] + 'e' + (value[1] ? +value[1] + precision : precision)));\n                if (negative) {\n                    value = -value;\n                }\n                value = value.toString().split('e');\n                value = +(value[0] + 'e' + (value[1] ? +value[1] - precision : -precision));\n                return value.toFixed(Math.min(precision, 20));\n            };\n            var toString = function (value, fmt, culture) {\n                if (fmt) {\n                    if (objectToString.call(value) === '[object Date]') {\n                        return formatDate(value, fmt, culture);\n                    } else if (typeof value === NUMBER) {\n                        return formatNumber(value, fmt, culture);\n                    }\n                }\n                return value !== undefined ? value : '';\n            };\n            kendo.format = function (fmt) {\n                var values = arguments;\n                return fmt.replace(formatRegExp, function (match, index, placeholderFormat) {\n                    var value = values[parseInt(index, 10) + 1];\n                    return toString(value, placeholderFormat ? placeholderFormat.substring(1) : '');\n                });\n            };\n            kendo._extractFormat = function (format) {\n                if (format.slice(0, 3) === '{0:') {\n                    format = format.slice(3, format.length - 1);\n                }\n                return format;\n            };\n            kendo._activeElement = function () {\n                try {\n                    return document.activeElement;\n                } catch (e) {\n                    return document.documentElement.activeElement;\n                }\n            };\n            kendo._round = round;\n            kendo._outerWidth = function (element, includeMargin) {\n                return $(element).outerWidth(includeMargin || false) || 0;\n            };\n            kendo._outerHeight = function (element, includeMargin) {\n                return $(element).outerHeight(includeMargin || false) || 0;\n            };\n            kendo.toString = toString;\n        }());\n        (function () {\n            var nonBreakingSpaceRegExp = /\\u00A0/g, exponentRegExp = /[eE][\\-+]?[0-9]+/, shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/, longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/, offsetRegExp = /[+-]\\d*/, FORMATS_SEQUENCE = [\n                    [],\n                    [\n                        'G',\n                        'g',\n                        'F'\n                    ],\n                    [\n                        'D',\n                        'd',\n                        'y',\n                        'm',\n                        'T',\n                        't'\n                    ]\n                ], STANDARD_FORMATS = [\n                    [\n                        'yyyy-MM-ddTHH:mm:ss.fffffffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fffffff',\n                        'yyyy-MM-ddTHH:mm:ss.fffzzz',\n                        'yyyy-MM-ddTHH:mm:ss.fff',\n                        'ddd MMM dd yyyy HH:mm:ss',\n                        'yyyy-MM-ddTHH:mm:sszzz',\n                        'yyyy-MM-ddTHH:mmzzz',\n                        'yyyy-MM-ddTHH:mmzz',\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-dd HH:mm:ss',\n                        'yyyy/MM/dd HH:mm:ss'\n                    ],\n                    [\n                        'yyyy-MM-ddTHH:mm',\n                        'yyyy-MM-dd HH:mm',\n                        'yyyy/MM/dd HH:mm'\n                    ],\n                    [\n                        'yyyy/MM/dd',\n                        'yyyy-MM-dd',\n                        'HH:mm:ss',\n                        'HH:mm'\n                    ]\n                ], numberRegExp = {\n                    2: /^\\d{1,2}/,\n                    3: /^\\d{1,3}/,\n                    4: /^\\d{4}/\n                }, objectToString = {}.toString;\n            function outOfRange(value, start, end) {\n                return !(value >= start && value <= end);\n            }\n            function designatorPredicate(designator) {\n                return designator.charAt(0);\n            }\n            function mapDesignators(designators) {\n                return $.map(designators, designatorPredicate);\n            }\n            function adjustDST(date, hours) {\n                if (!hours && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                }\n            }\n            function lowerArray(data) {\n                var idx = 0, length = data.length, array = [];\n                for (; idx < length; idx++) {\n                    array[idx] = (data[idx] + '').toLowerCase();\n                }\n                return array;\n            }\n            function lowerLocalInfo(localInfo) {\n                var newLocalInfo = {}, property;\n                for (property in localInfo) {\n                    newLocalInfo[property] = lowerArray(localInfo[property]);\n                }\n                return newLocalInfo;\n            }\n            function parseExact(value, format, culture, strict) {\n                if (!value) {\n                    return null;\n                }\n                var lookAhead = function (match) {\n                        var i = 0;\n                        while (format[idx] === match) {\n                            i++;\n                            idx++;\n                        }\n                        if (i > 0) {\n                            idx -= 1;\n                        }\n                        return i;\n                    }, getNumber = function (size) {\n                        var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'), match = value.substr(valueIdx, size).match(rg);\n                        if (match) {\n                            match = match[0];\n                            valueIdx += match.length;\n                            return parseInt(match, 10);\n                        }\n                        return null;\n                    }, getIndexByName = function (names, lower) {\n                        var i = 0, length = names.length, name, nameLength, matchLength = 0, matchIdx = 0, subValue;\n                        for (; i < length; i++) {\n                            name = names[i];\n                            nameLength = name.length;\n                            subValue = value.substr(valueIdx, nameLength);\n                            if (lower) {\n                                subValue = subValue.toLowerCase();\n                            }\n                            if (subValue == name && nameLength > matchLength) {\n                                matchLength = nameLength;\n                                matchIdx = i;\n                            }\n                        }\n                        if (matchLength) {\n                            valueIdx += matchLength;\n                            return matchIdx + 1;\n                        }\n                        return null;\n                    }, checkLiteral = function () {\n                        var result = false;\n                        if (value.charAt(valueIdx) === format[idx]) {\n                            valueIdx++;\n                            result = true;\n                        }\n                        return result;\n                    }, calendar = culture.calendars.standard, year = null, month = null, day = null, hours = null, minutes = null, seconds = null, milliseconds = null, idx = 0, valueIdx = 0, literal = false, date = new Date(), twoDigitYearMax = calendar.twoDigitYearMax || 2029, defaultYear = date.getFullYear(), ch, count, length, pattern, pmHour, UTC, matches, amDesignators, pmDesignators, hoursOffset, minutesOffset, hasTime, match;\n                if (!format) {\n                    format = 'd';\n                }\n                pattern = calendar.patterns[format];\n                if (pattern) {\n                    format = pattern;\n                }\n                format = format.split('');\n                length = format.length;\n                for (; idx < length; idx++) {\n                    ch = format[idx];\n                    if (literal) {\n                        if (ch === '\\'') {\n                            literal = false;\n                        } else {\n                            checkLiteral();\n                        }\n                    } else {\n                        if (ch === 'd') {\n                            count = lookAhead('d');\n                            if (!calendar._lowerDays) {\n                                calendar._lowerDays = lowerLocalInfo(calendar.days);\n                            }\n                            if (day !== null && count > 2) {\n                                continue;\n                            }\n                            day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (day === null || outOfRange(day, 1, 31)) {\n                                return null;\n                            }\n                        } else if (ch === 'M') {\n                            count = lookAhead('M');\n                            if (!calendar._lowerMonths) {\n                                calendar._lowerMonths = lowerLocalInfo(calendar.months);\n                            }\n                            month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n                            if (month === null || outOfRange(month, 1, 12)) {\n                                return null;\n                            }\n                            month -= 1;\n                        } else if (ch === 'y') {\n                            count = lookAhead('y');\n                            year = getNumber(count);\n                            if (year === null) {\n                                return null;\n                            }\n                            if (count == 2) {\n                                if (typeof twoDigitYearMax === 'string') {\n                                    twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n                                }\n                                year = defaultYear - defaultYear % 100 + year;\n                                if (year > twoDigitYearMax) {\n                                    year -= 100;\n                                }\n                            }\n                        } else if (ch === 'h') {\n                            lookAhead('h');\n                            hours = getNumber(2);\n                            if (hours == 12) {\n                                hours = 0;\n                            }\n                            if (hours === null || outOfRange(hours, 0, 11)) {\n                                return null;\n                            }\n                        } else if (ch === 'H') {\n                            lookAhead('H');\n                            hours = getNumber(2);\n                            if (hours === null || outOfRange(hours, 0, 23)) {\n                                return null;\n                            }\n                        } else if (ch === 'm') {\n                            lookAhead('m');\n                            minutes = getNumber(2);\n                            if (minutes === null || outOfRange(minutes, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 's') {\n                            lookAhead('s');\n                            seconds = getNumber(2);\n                            if (seconds === null || outOfRange(seconds, 0, 59)) {\n                                return null;\n                            }\n                        } else if (ch === 'f') {\n                            count = lookAhead('f');\n                            match = value.substr(valueIdx, count).match(numberRegExp[3]);\n                            milliseconds = getNumber(count);\n                            if (milliseconds !== null) {\n                                milliseconds = parseFloat('0.' + match[0], 10);\n                                milliseconds = kendo._round(milliseconds, 3);\n                                milliseconds *= 1000;\n                            }\n                            if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n                                return null;\n                            }\n                        } else if (ch === 't') {\n                            count = lookAhead('t');\n                            amDesignators = calendar.AM;\n                            pmDesignators = calendar.PM;\n                            if (count === 1) {\n                                amDesignators = mapDesignators(amDesignators);\n                                pmDesignators = mapDesignators(pmDesignators);\n                            }\n                            pmHour = getIndexByName(pmDesignators);\n                            if (!pmHour && !getIndexByName(amDesignators)) {\n                                return null;\n                            }\n                        } else if (ch === 'z') {\n                            UTC = true;\n                            count = lookAhead('z');\n                            if (value.substr(valueIdx, 1) === 'Z') {\n                                checkLiteral();\n                                continue;\n                            }\n                            matches = value.substr(valueIdx, 6).match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n                            if (!matches) {\n                                return null;\n                            }\n                            matches = matches[0].split(':');\n                            hoursOffset = matches[0];\n                            minutesOffset = matches[1];\n                            if (!minutesOffset && hoursOffset.length > 3) {\n                                valueIdx = hoursOffset.length - 2;\n                                minutesOffset = hoursOffset.substring(valueIdx);\n                                hoursOffset = hoursOffset.substring(0, valueIdx);\n                            }\n                            hoursOffset = parseInt(hoursOffset, 10);\n                            if (outOfRange(hoursOffset, -12, 13)) {\n                                return null;\n                            }\n                            if (count > 2) {\n                                minutesOffset = matches[0][0] + minutesOffset;\n                                minutesOffset = parseInt(minutesOffset, 10);\n                                if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n                                    return null;\n                                }\n                            }\n                        } else if (ch === '\\'') {\n                            literal = true;\n                            checkLiteral();\n                        } else if (!checkLiteral()) {\n                            return null;\n                        }\n                    }\n                }\n                if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n                    return null;\n                }\n                hasTime = hours !== null || minutes !== null || seconds || null;\n                if (year === null && month === null && day === null && hasTime) {\n                    year = defaultYear;\n                    month = date.getMonth();\n                    day = date.getDate();\n                } else {\n                    if (year === null) {\n                        year = defaultYear;\n                    }\n                    if (day === null) {\n                        day = 1;\n                    }\n                }\n                if (pmHour && hours < 12) {\n                    hours += 12;\n                }\n                if (UTC) {\n                    if (hoursOffset) {\n                        hours += -hoursOffset;\n                    }\n                    if (minutesOffset) {\n                        minutes += -minutesOffset;\n                    }\n                    value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n                } else {\n                    value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n                    adjustDST(value, hours);\n                }\n                if (year < 100) {\n                    value.setFullYear(year);\n                }\n                if (value.getDate() !== day && UTC === undefined) {\n                    return null;\n                }\n                return value;\n            }\n            function parseMicrosoftFormatOffset(offset) {\n                var sign = offset.substr(0, 1) === '-' ? -1 : 1;\n                offset = offset.substring(1);\n                offset = parseInt(offset.substr(0, 2), 10) * 60 + parseInt(offset.substring(2), 10);\n                return sign * offset;\n            }\n            function getDefaultFormats(culture) {\n                var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n                var calendar = culture.calendar || culture.calendars.standard;\n                var patterns = calendar.patterns;\n                var cultureFormats, formatIdx, idx;\n                var formats = [];\n                for (idx = 0; idx < length; idx++) {\n                    cultureFormats = FORMATS_SEQUENCE[idx];\n                    for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n                        formats.push(patterns[cultureFormats[formatIdx]]);\n                    }\n                    formats = formats.concat(STANDARD_FORMATS[idx]);\n                }\n                return formats;\n            }\n            function internalParseDate(value, formats, culture, strict) {\n                if (objectToString.call(value) === '[object Date]') {\n                    return value;\n                }\n                var idx = 0;\n                var date = null;\n                var length;\n                var tzoffset;\n                if (value && value.indexOf('/D') === 0) {\n                    date = dateRegExp.exec(value);\n                    if (date) {\n                        date = date[1];\n                        tzoffset = offsetRegExp.exec(date.substring(1));\n                        date = new Date(parseInt(date, 10));\n                        if (tzoffset) {\n                            tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n                            date = kendo.timezone.apply(date, 0);\n                            date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n                        }\n                        return date;\n                    }\n                }\n                culture = kendo.getCulture(culture);\n                if (!formats) {\n                    formats = getDefaultFormats(culture);\n                }\n                formats = isArray(formats) ? formats : [formats];\n                length = formats.length;\n                for (; idx < length; idx++) {\n                    date = parseExact(value, formats[idx], culture, strict);\n                    if (date) {\n                        return date;\n                    }\n                }\n                return date;\n            }\n            kendo.parseDate = function (value, formats, culture) {\n                return internalParseDate(value, formats, culture, false);\n            };\n            kendo.parseExactDate = function (value, formats, culture) {\n                return internalParseDate(value, formats, culture, true);\n            };\n            kendo.parseInt = function (value, culture) {\n                var result = kendo.parseFloat(value, culture);\n                if (result) {\n                    result = result | 0;\n                }\n                return result;\n            };\n            kendo.parseFloat = function (value, culture, format) {\n                if (!value && value !== 0) {\n                    return null;\n                }\n                if (typeof value === NUMBER) {\n                    return value;\n                }\n                value = value.toString();\n                culture = kendo.getCulture(culture);\n                var number = culture.numberFormat, percent = number.percent, currency = number.currency, symbol = currency.symbol, percentSymbol = percent.symbol, negative = value.indexOf('-'), parts, isPercent;\n                if (exponentRegExp.test(value)) {\n                    value = parseFloat(value.replace(number['.'], '.'));\n                    if (isNaN(value)) {\n                        value = null;\n                    }\n                    return value;\n                }\n                if (negative > 0) {\n                    return null;\n                } else {\n                    negative = negative > -1;\n                }\n                if (value.indexOf(symbol) > -1 || format && format.toLowerCase().indexOf('c') > -1) {\n                    number = currency;\n                    parts = number.pattern[0].replace('$', symbol).split('n');\n                    if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n                        value = value.replace(parts[0], '').replace(parts[1], '');\n                        negative = true;\n                    }\n                } else if (value.indexOf(percentSymbol) > -1) {\n                    isPercent = true;\n                    number = percent;\n                    symbol = percentSymbol;\n                }\n                value = value.replace('-', '').replace(symbol, '').replace(nonBreakingSpaceRegExp, ' ').split(number[','].replace(nonBreakingSpaceRegExp, ' ')).join('').replace(number['.'], '.');\n                value = parseFloat(value);\n                if (isNaN(value)) {\n                    value = null;\n                } else if (negative) {\n                    value *= -1;\n                }\n                if (value && isPercent) {\n                    value /= 100;\n                }\n                return value;\n            };\n        }());\n        function getShadows(element) {\n            var shadow = element.css(kendo.support.transitions.css + 'box-shadow') || element.css('box-shadow'), radius = shadow ? shadow.match(boxShadowRegExp) || [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ] : [\n                    0,\n                    0,\n                    0,\n                    0,\n                    0\n                ], blur = math.max(+radius[3], +(radius[4] || 0));\n            return {\n                left: -radius[1] + blur,\n                right: +radius[1] + blur,\n                bottom: +radius[2] + blur\n            };\n        }\n        function wrap(element, autosize) {\n            var browser = support.browser, percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, parent = element.parent(), windowOuterWidth = outerWidth(window);\n            parent.removeClass('k-animation-container-sm');\n            if (!parent.hasClass('k-animation-container')) {\n                var width = element[0].style.width, height = element[0].style.height, percentWidth = percentRegExp.test(width), percentHeight = percentRegExp.test(height), forceWidth = element.hasClass('k-tooltip') || element.is('.k-menu-horizontal.k-context-menu');\n                percentage = percentWidth || percentHeight;\n                if (!percentWidth && (!autosize || autosize && width || forceWidth)) {\n                    width = autosize ? outerWidth(element) + 1 : outerWidth(element);\n                }\n                if (!percentHeight && (!autosize || autosize && height) || element.is('.k-menu-horizontal.k-context-menu')) {\n                    height = outerHeight(element);\n                }\n                element.wrap($('<div/>').addClass('k-animation-container').css({\n                    width: width,\n                    height: height\n                }));\n                parent = element.parent();\n                if (percentage) {\n                    element.css({\n                        width: '100%',\n                        height: '100%',\n                        boxSizing: 'border-box',\n                        mozBoxSizing: 'border-box',\n                        webkitBoxSizing: 'border-box'\n                    });\n                }\n            } else {\n                wrapResize(element, autosize);\n            }\n            if (windowOuterWidth < outerWidth(parent)) {\n                parent.addClass('k-animation-container-sm');\n                wrapResize(element, autosize);\n            }\n            if (browser.msie && math.floor(browser.version) <= 7) {\n                element.css({ zoom: 1 });\n                element.children('.k-menu').width(element.width());\n            }\n            return parent;\n        }\n        function wrapResize(element, autosize) {\n            var percentage, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, wrapper = element.parent('.k-animation-container'), wrapperStyle = wrapper[0].style;\n            if (wrapper.is(':hidden')) {\n                wrapper.css({\n                    display: '',\n                    position: ''\n                });\n            }\n            percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n            if (!percentage) {\n                wrapper.css({\n                    width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n                    height: outerHeight(element),\n                    boxSizing: 'content-box',\n                    mozBoxSizing: 'content-box',\n                    webkitBoxSizing: 'content-box'\n                });\n            }\n        }\n        function deepExtend(destination) {\n            var i = 1, length = arguments.length;\n            for (i = 1; i < length; i++) {\n                deepExtendOne(destination, arguments[i]);\n            }\n            return destination;\n        }\n        function deepExtendOne(destination, source) {\n            var ObservableArray = kendo.data.ObservableArray, LazyObservableArray = kendo.data.LazyObservableArray, DataSource = kendo.data.DataSource, HierarchicalDataSource = kendo.data.HierarchicalDataSource, property, propValue, propType, propInit, destProp;\n            for (property in source) {\n                propValue = source[property];\n                propType = typeof propValue;\n                if (propType === OBJECT && propValue !== null) {\n                    propInit = propValue.constructor;\n                } else {\n                    propInit = null;\n                }\n                if (propInit && propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray && propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp) {\n                    if (propValue instanceof Date) {\n                        destination[property] = new Date(propValue.getTime());\n                    } else if (isFunction(propValue.clone)) {\n                        destination[property] = propValue.clone();\n                    } else {\n                        destProp = destination[property];\n                        if (typeof destProp === OBJECT) {\n                            destination[property] = destProp || {};\n                        } else {\n                            destination[property] = {};\n                        }\n                        deepExtendOne(destination[property], propValue);\n                    }\n                } else if (propType !== UNDEFINED) {\n                    destination[property] = propValue;\n                }\n            }\n            return destination;\n        }\n        function testRx(agent, rxs, dflt) {\n            for (var rx in rxs) {\n                if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n                    return rx;\n                }\n            }\n            return dflt !== undefined ? dflt : agent;\n        }\n        function toHyphens(str) {\n            return str.replace(/([a-z][A-Z])/g, function (g) {\n                return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n            });\n        }\n        function toCamelCase(str) {\n            return str.replace(/\\-(\\w)/g, function (strMatch, g1) {\n                return g1.toUpperCase();\n            });\n        }\n        function getComputedStyles(element, properties) {\n            var styles = {}, computedStyle;\n            if (document.defaultView && document.defaultView.getComputedStyle) {\n                computedStyle = document.defaultView.getComputedStyle(element, '');\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle.getPropertyValue(value);\n                    });\n                }\n            } else {\n                computedStyle = element.currentStyle;\n                if (properties) {\n                    $.each(properties, function (idx, value) {\n                        styles[value] = computedStyle[toCamelCase(value)];\n                    });\n                }\n            }\n            if (!kendo.size(styles)) {\n                styles = computedStyle;\n            }\n            return styles;\n        }\n        function isScrollable(element) {\n            if (element && element.className && typeof element.className === 'string' && element.className.indexOf('k-auto-scrollable') > -1) {\n                return true;\n            }\n            var overflow = getComputedStyles(element, ['overflow']).overflow;\n            return overflow == 'auto' || overflow == 'scroll';\n        }\n        function scrollLeft(element, value) {\n            var webkit = support.browser.webkit;\n            var mozila = support.browser.mozilla;\n            var el = element instanceof $ ? element[0] : element;\n            var isRtl;\n            if (!element) {\n                return;\n            }\n            isRtl = support.isRtl(element);\n            if (value !== undefined) {\n                if (isRtl && webkit) {\n                    el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n                } else if (isRtl && mozila) {\n                    el.scrollLeft = -value;\n                } else {\n                    el.scrollLeft = value;\n                }\n            } else {\n                if (isRtl && webkit) {\n                    return el.scrollWidth - el.clientWidth - el.scrollLeft;\n                } else {\n                    return Math.abs(el.scrollLeft);\n                }\n            }\n        }\n        (function () {\n            support._scrollbar = undefined;\n            support.scrollbar = function (refresh) {\n                if (!isNaN(support._scrollbar) && !refresh) {\n                    return support._scrollbar;\n                } else {\n                    var div = document.createElement('div'), result;\n                    div.style.cssText = 'overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block';\n                    div.innerHTML = '&nbsp;';\n                    document.body.appendChild(div);\n                    support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n                    document.body.removeChild(div);\n                    return result;\n                }\n            };\n            support.isRtl = function (element) {\n                return $(element).closest('.k-rtl').length > 0;\n            };\n            var table = document.createElement('table');\n            try {\n                table.innerHTML = '<tr><td></td></tr>';\n                support.tbodyInnerHtml = true;\n            } catch (e) {\n                support.tbodyInnerHtml = false;\n            }\n            support.touch = 'ontouchstart' in window;\n            var docStyle = document.documentElement.style;\n            var transitions = support.transitions = false, transforms = support.transforms = false, elementProto = 'HTMLElement' in window ? HTMLElement.prototype : [];\n            support.hasHW3D = 'WebKitCSSMatrix' in window && 'm11' in new window.WebKitCSSMatrix() || 'MozPerspective' in docStyle || 'msPerspective' in docStyle;\n            support.cssFlexbox = 'flexWrap' in docStyle || 'WebkitFlexWrap' in docStyle || 'msFlexWrap' in docStyle;\n            each([\n                'Moz',\n                'webkit',\n                'O',\n                'ms'\n            ], function () {\n                var prefix = this.toString(), hasTransitions = typeof table.style[prefix + 'Transition'] === STRING;\n                if (hasTransitions || typeof table.style[prefix + 'Transform'] === STRING) {\n                    var lowPrefix = prefix.toLowerCase();\n                    transforms = {\n                        css: lowPrefix != 'ms' ? '-' + lowPrefix + '-' : '',\n                        prefix: prefix,\n                        event: lowPrefix === 'o' || lowPrefix === 'webkit' ? lowPrefix : ''\n                    };\n                    if (hasTransitions) {\n                        transitions = transforms;\n                        transitions.event = transitions.event ? transitions.event + 'TransitionEnd' : 'transitionend';\n                    }\n                    return false;\n                }\n            });\n            table = null;\n            support.transforms = transforms;\n            support.transitions = transitions;\n            support.devicePixelRatio = window.devicePixelRatio === undefined ? 1 : window.devicePixelRatio;\n            try {\n                support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n                support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n            } catch (e) {\n                support.screenWidth = window.screen.availWidth;\n                support.screenHeight = window.screen.availHeight;\n            }\n            support.detectOS = function (ua) {\n                var os = false, minorVersion, match = [], notAndroidPhone = !/mobile safari/i.test(ua), agentRxs = {\n                        wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n                        iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n                        ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n                        meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n                        webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n                        tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n                        sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n                        ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n                    }, osRxs = {\n                        ios: /^i(phone|pad|pod)$/i,\n                        android: /^android|fire$/i,\n                        blackberry: /^blackberry|playbook/i,\n                        windows: /windows/,\n                        wp: /wp/,\n                        flat: /sailfish|ffos|tizen/i,\n                        meego: /meego/\n                    }, formFactorRxs = { tablet: /playbook|ipad|fire/i }, browserRxs = {\n                        omini: /Opera\\sMini/i,\n                        omobile: /Opera\\sMobi/i,\n                        firefox: /Firefox|Fennec/i,\n                        mobilesafari: /version\\/.*safari/i,\n                        ie: /MSIE|Windows\\sPhone/i,\n                        chrome: /chrome|crios/i,\n                        webkit: /webkit/i\n                    };\n                for (var agent in agentRxs) {\n                    if (agentRxs.hasOwnProperty(agent)) {\n                        match = ua.match(agentRxs[agent]);\n                        if (match) {\n                            if (agent == 'windows' && 'plugins' in navigator) {\n                                return false;\n                            }\n                            os = {};\n                            os.device = agent;\n                            os.tablet = testRx(agent, formFactorRxs, false);\n                            os.browser = testRx(ua, browserRxs, 'default');\n                            os.name = testRx(agent, osRxs);\n                            os[os.name] = true;\n                            os.majorVersion = match[2];\n                            os.minorVersion = (match[3] || '0').replace('_', '.');\n                            minorVersion = os.minorVersion.replace('.', '').substr(0, 2);\n                            os.flatVersion = os.majorVersion + minorVersion + new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join('0');\n                            os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED;\n                            os.appMode = window.navigator.standalone || /file|local|wmapp/.test(window.location.protocol) || os.cordova;\n                            if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n                                os.tablet = agent;\n                            }\n                            break;\n                        }\n                    }\n                }\n                return os;\n            };\n            var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n            support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n            support.hasNativeScrolling = false;\n            if (mobileOS.ios || mobileOS.android && mobileOS.majorVersion > 2 || mobileOS.wp) {\n                support.hasNativeScrolling = mobileOS;\n            }\n            support.delayedClick = function () {\n                if (support.touch) {\n                    if (mobileOS.ios) {\n                        return true;\n                    }\n                    if (mobileOS.android) {\n                        if (!support.browser.chrome) {\n                            return true;\n                        }\n                        if (support.browser.version < 32) {\n                            return false;\n                        }\n                        return !($('meta[name=viewport]').attr('content') || '').match(/user-scalable=no/i);\n                    }\n                }\n                return false;\n            };\n            support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n            support.detectBrowser = function (ua) {\n                var browser = false, match = [], browserRxs = {\n                        edge: /(edge)[ \\/]([\\w.]+)/i,\n                        webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n                        safari: /(webkit)[ \\/]([\\w.]+)/i,\n                        opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n                        msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n                        mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n                    };\n                for (var agent in browserRxs) {\n                    if (browserRxs.hasOwnProperty(agent)) {\n                        match = ua.match(browserRxs[agent]);\n                        if (match) {\n                            browser = {};\n                            browser[agent] = true;\n                            browser[match[1].toLowerCase().split(' ')[0].split('/')[0]] = true;\n                            browser.version = parseInt(document.documentMode || match[2], 10);\n                            break;\n                        }\n                    }\n                }\n                return browser;\n            };\n            support.browser = support.detectBrowser(navigator.userAgent);\n            support.detectClipboardAccess = function () {\n                var commands = {\n                    copy: document.queryCommandSupported ? document.queryCommandSupported('copy') : false,\n                    cut: document.queryCommandSupported ? document.queryCommandSupported('cut') : false,\n                    paste: document.queryCommandSupported ? document.queryCommandSupported('paste') : false\n                };\n                if (support.browser.chrome) {\n                    commands.paste = false;\n                    if (support.browser.version >= 43) {\n                        commands.copy = true;\n                        commands.cut = true;\n                    }\n                }\n                return commands;\n            };\n            support.clipboard = support.detectClipboardAccess();\n            support.zoomLevel = function () {\n                try {\n                    var browser = support.browser;\n                    var ie11WidthCorrection = 0;\n                    var docEl = document.documentElement;\n                    if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n                        ie11WidthCorrection = support.scrollbar();\n                    }\n                    return support.touch ? docEl.clientWidth / window.innerWidth : browser.msie && browser.version >= 10 ? ((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth : 1;\n                } catch (e) {\n                    return 1;\n                }\n            };\n            support.cssBorderSpacing = typeof docStyle.borderSpacing != 'undefined' && !(support.browser.msie && support.browser.version < 8);\n            (function (browser) {\n                var cssClass = '', docElement = $(document.documentElement), majorVersion = parseInt(browser.version, 10);\n                if (browser.msie) {\n                    cssClass = 'ie';\n                } else if (browser.mozilla) {\n                    cssClass = 'ff';\n                } else if (browser.safari) {\n                    cssClass = 'safari';\n                } else if (browser.webkit) {\n                    cssClass = 'webkit';\n                } else if (browser.opera) {\n                    cssClass = 'opera';\n                } else if (browser.edge) {\n                    cssClass = 'edge';\n                }\n                if (cssClass) {\n                    cssClass = 'k-' + cssClass + ' k-' + cssClass + majorVersion;\n                }\n                if (support.mobileOS) {\n                    cssClass += ' k-mobile';\n                }\n                if (!support.cssFlexbox) {\n                    cssClass += ' k-no-flexbox';\n                }\n                docElement.addClass(cssClass);\n            }(support.browser));\n            support.eventCapture = document.documentElement.addEventListener;\n            var input = document.createElement('input');\n            support.placeholder = 'placeholder' in input;\n            support.propertyChangeEvent = 'onpropertychange' in input;\n            support.input = function () {\n                var types = [\n                    'number',\n                    'date',\n                    'time',\n                    'month',\n                    'week',\n                    'datetime',\n                    'datetime-local'\n                ];\n                var length = types.length;\n                var value = 'test';\n                var result = {};\n                var idx = 0;\n                var type;\n                for (; idx < length; idx++) {\n                    type = types[idx];\n                    input.setAttribute('type', type);\n                    input.value = value;\n                    result[type.replace('-', '')] = input.type !== 'text' && input.value !== value;\n                }\n                return result;\n            }();\n            input.style.cssText = 'float:left;';\n            support.cssFloat = !!input.style.cssFloat;\n            input = null;\n            support.stableSort = function () {\n                var threshold = 513;\n                var sorted = [{\n                        index: 0,\n                        field: 'b'\n                    }];\n                for (var i = 1; i < threshold; i++) {\n                    sorted.push({\n                        index: i,\n                        field: 'a'\n                    });\n                }\n                sorted.sort(function (a, b) {\n                    return a.field > b.field ? 1 : a.field < b.field ? -1 : 0;\n                });\n                return sorted[0].index === 1;\n            }();\n            support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector || elementProto.msMatchesSelector || elementProto.oMatchesSelector || elementProto.matchesSelector || elementProto.matches || function (selector) {\n                var nodeList = document.querySelectorAll ? (this.parentNode || document).querySelectorAll(selector) || [] : $(selector), i = nodeList.length;\n                while (i--) {\n                    if (nodeList[i] == this) {\n                        return true;\n                    }\n                }\n                return false;\n            };\n            support.matchMedia = 'matchMedia' in window;\n            support.pushState = window.history && window.history.pushState;\n            var documentMode = document.documentMode;\n            support.hashChange = 'onhashchange' in window && !(support.browser.msie && (!documentMode || documentMode <= 8));\n            support.customElements = 'registerElement' in window.document;\n            var chrome = support.browser.chrome, mozilla = support.browser.mozilla;\n            support.msPointers = !chrome && window.MSPointerEvent;\n            support.pointers = !chrome && !mozilla && window.PointerEvent;\n            support.kineticScrollNeeded = mobileOS && (support.touch || support.msPointers || support.pointers);\n        }());\n        function size(obj) {\n            var result = 0, key;\n            for (key in obj) {\n                if (obj.hasOwnProperty(key) && key != 'toJSON') {\n                    result++;\n                }\n            }\n            return result;\n        }\n        function getOffset(element, type, positioned) {\n            if (!type) {\n                type = 'offset';\n            }\n            var offset = element[type]();\n            var result = {\n                top: offset.top,\n                right: offset.right,\n                bottom: offset.bottom,\n                left: offset.left\n            };\n            if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n                var sign = support.isRtl(element) ? 1 : -1;\n                result.top -= window.pageYOffset - document.documentElement.scrollTop;\n                result.left -= window.pageXOffset + sign * document.documentElement.scrollLeft;\n            }\n            return result;\n        }\n        var directions = {\n            left: { reverse: 'right' },\n            right: { reverse: 'left' },\n            down: { reverse: 'up' },\n            up: { reverse: 'down' },\n            top: { reverse: 'bottom' },\n            bottom: { reverse: 'top' },\n            'in': { reverse: 'out' },\n            out: { reverse: 'in' }\n        };\n        function parseEffects(input) {\n            var effects = {};\n            each(typeof input === 'string' ? input.split(' ') : input, function (idx) {\n                effects[idx] = this;\n            });\n            return effects;\n        }\n        function fx(element) {\n            return new kendo.effects.Element(element);\n        }\n        var effects = {};\n        $.extend(effects, {\n            enabled: true,\n            Element: function (element) {\n                this.element = $(element);\n            },\n            promise: function (element, options) {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n                element.dequeue();\n            },\n            disable: function () {\n                this.enabled = false;\n                this.promise = this.promiseShim;\n            },\n            enable: function () {\n                this.enabled = true;\n                this.promise = this.animatedPromise;\n            }\n        });\n        effects.promiseShim = effects.promise;\n        function prepareAnimationOptions(options, duration, reverse, complete) {\n            if (typeof options === STRING) {\n                if (isFunction(duration)) {\n                    complete = duration;\n                    duration = 400;\n                    reverse = false;\n                }\n                if (isFunction(reverse)) {\n                    complete = reverse;\n                    reverse = false;\n                }\n                if (typeof duration === BOOLEAN) {\n                    reverse = duration;\n                    duration = 400;\n                }\n                options = {\n                    effects: options,\n                    duration: duration,\n                    reverse: reverse,\n                    complete: complete\n                };\n            }\n            return extend({\n                effects: {},\n                duration: 400,\n                reverse: false,\n                init: noop,\n                teardown: noop,\n                hide: false\n            }, options, {\n                completeCallback: options.complete,\n                complete: noop\n            });\n        }\n        function animate(element, options, duration, reverse, complete) {\n            var idx = 0, length = element.length, instance;\n            for (; idx < length; idx++) {\n                instance = $(element[idx]);\n                instance.queue(function () {\n                    effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n                });\n            }\n            return element;\n        }\n        function toggleClass(element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        }\n        if (!('kendoAnimate' in $.fn)) {\n            extend($.fn, {\n                kendoStop: function (clearQueue, gotoEnd) {\n                    return this.stop(clearQueue, gotoEnd);\n                },\n                kendoAnimate: function (options, duration, reverse, complete) {\n                    return animate(this, options, duration, reverse, complete);\n                },\n                kendoAddClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, true);\n                },\n                kendoRemoveClass: function (classes, options) {\n                    return kendo.toggleClass(this, classes, options, false);\n                },\n                kendoToggleClass: function (classes, options, toggle) {\n                    return kendo.toggleClass(this, classes, options, toggle);\n                }\n            });\n        }\n        var ampRegExp = /&/g, ltRegExp = /</g, quoteRegExp = /\"/g, aposRegExp = /'/g, gtRegExp = />/g;\n        function htmlEncode(value) {\n            return ('' + value).replace(ampRegExp, '&amp;').replace(ltRegExp, '&lt;').replace(gtRegExp, '&gt;').replace(quoteRegExp, '&quot;').replace(aposRegExp, '&#39;');\n        }\n        var eventTarget = function (e) {\n            return e.target;\n        };\n        if (support.touch) {\n            eventTarget = function (e) {\n                var touches = 'originalEvent' in e ? e.originalEvent.changedTouches : 'changedTouches' in e ? e.changedTouches : null;\n                return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n            };\n            each([\n                'swipe',\n                'swipeLeft',\n                'swipeRight',\n                'swipeUp',\n                'swipeDown',\n                'doubleTap',\n                'tap'\n            ], function (m, value) {\n                $.fn[value] = function (callback) {\n                    return this.bind(value, callback);\n                };\n            });\n        }\n        if (support.touch) {\n            if (!support.mobileOS) {\n                support.mousedown = 'mousedown touchstart';\n                support.mouseup = 'mouseup touchend';\n                support.mousemove = 'mousemove touchmove';\n                support.mousecancel = 'mouseleave touchcancel';\n                support.click = 'click';\n                support.resize = 'resize';\n            } else {\n                support.mousedown = 'touchstart';\n                support.mouseup = 'touchend';\n                support.mousemove = 'touchmove';\n                support.mousecancel = 'touchcancel';\n                support.click = 'touchend';\n                support.resize = 'orientationchange';\n            }\n        } else if (support.pointers) {\n            support.mousemove = 'pointermove';\n            support.mousedown = 'pointerdown';\n            support.mouseup = 'pointerup';\n            support.mousecancel = 'pointercancel';\n            support.click = 'pointerup';\n            support.resize = 'orientationchange resize';\n        } else if (support.msPointers) {\n            support.mousemove = 'MSPointerMove';\n            support.mousedown = 'MSPointerDown';\n            support.mouseup = 'MSPointerUp';\n            support.mousecancel = 'MSPointerCancel';\n            support.click = 'MSPointerUp';\n            support.resize = 'orientationchange resize';\n        } else {\n            support.mousemove = 'mousemove';\n            support.mousedown = 'mousedown';\n            support.mouseup = 'mouseup';\n            support.mousecancel = 'mouseleave';\n            support.click = 'click';\n            support.resize = 'resize';\n        }\n        var wrapExpression = function (members, paramName) {\n                var result = paramName || 'd', index, idx, length, member, count = 1;\n                for (idx = 0, length = members.length; idx < length; idx++) {\n                    member = members[idx];\n                    if (member !== '') {\n                        index = member.indexOf('[');\n                        if (index !== 0) {\n                            if (index == -1) {\n                                member = '.' + member;\n                            } else {\n                                count++;\n                                member = '.' + member.substring(0, index) + ' || {})' + member.substring(index);\n                            }\n                        }\n                        count++;\n                        result += member + (idx < length - 1 ? ' || {})' : ')');\n                    }\n                }\n                return new Array(count).join('(') + result;\n            }, localUrlRe = /^([a-z]+:)?\\/\\//i;\n        extend(kendo, {\n            widgets: [],\n            _widgetRegisteredCallbacks: [],\n            ui: kendo.ui || {},\n            fx: kendo.fx || fx,\n            effects: kendo.effects || effects,\n            mobile: kendo.mobile || {},\n            data: kendo.data || {},\n            dataviz: kendo.dataviz || {},\n            drawing: kendo.drawing || {},\n            spreadsheet: { messages: {} },\n            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            support: kendo.support || support,\n            animate: kendo.animate || animate,\n            ns: '',\n            attr: function (value) {\n                return 'data-' + kendo.ns + value;\n            },\n            getShadows: getShadows,\n            wrap: wrap,\n            deepExtend: deepExtend,\n            getComputedStyles: getComputedStyles,\n            isScrollable: isScrollable,\n            scrollLeft: scrollLeft,\n            size: size,\n            toCamelCase: toCamelCase,\n            toHyphens: toHyphens,\n            getOffset: kendo.getOffset || getOffset,\n            parseEffects: kendo.parseEffects || parseEffects,\n            toggleClass: kendo.toggleClass || toggleClass,\n            directions: kendo.directions || directions,\n            Observable: Observable,\n            Class: Class,\n            Template: Template,\n            template: proxy(Template.compile, Template),\n            render: proxy(Template.render, Template),\n            stringify: proxy(JSON.stringify, JSON),\n            eventTarget: eventTarget,\n            htmlEncode: htmlEncode,\n            isLocalUrl: function (url) {\n                return url && !localUrlRe.test(url);\n            },\n            expr: function (expression, safe, paramName) {\n                expression = expression || '';\n                if (typeof safe == STRING) {\n                    paramName = safe;\n                    safe = false;\n                }\n                paramName = paramName || 'd';\n                if (expression && expression.charAt(0) !== '[') {\n                    expression = '.' + expression;\n                }\n                if (safe) {\n                    expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g, '\"$1_$DOT$_$2\"');\n                    expression = expression.replace(/'([^.]*)\\.([^']*)'/g, '\\'$1_$DOT$_$2\\'');\n                    expression = wrapExpression(expression.split('.'), paramName);\n                    expression = expression.replace(/_\\$DOT\\$_/g, '.');\n                } else {\n                    expression = paramName + expression;\n                }\n                return expression;\n            },\n            getter: function (expression, safe) {\n                var key = expression + safe;\n                return getterCache[key] = getterCache[key] || new Function('d', 'return ' + kendo.expr(expression, safe));\n            },\n            setter: function (expression) {\n                return setterCache[expression] = setterCache[expression] || new Function('d,value', kendo.expr(expression) + '=value');\n            },\n            accessor: function (expression) {\n                return {\n                    get: kendo.getter(expression),\n                    set: kendo.setter(expression)\n                };\n            },\n            guid: function () {\n                var id = '', i, random;\n                for (i = 0; i < 32; i++) {\n                    random = math.random() * 16 | 0;\n                    if (i == 8 || i == 12 || i == 16 || i == 20) {\n                        id += '-';\n                    }\n                    id += (i == 12 ? 4 : i == 16 ? random & 3 | 8 : random).toString(16);\n                }\n                return id;\n            },\n            roleSelector: function (role) {\n                return role.replace(/(\\S+)/g, '[' + kendo.attr('role') + '=$1],').slice(0, -1);\n            },\n            directiveSelector: function (directives) {\n                var selectors = directives.split(' ');\n                if (selectors) {\n                    for (var i = 0; i < selectors.length; i++) {\n                        if (selectors[i] != 'view') {\n                            selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, '$1-$2');\n                        }\n                    }\n                }\n                return selectors.join(' ').replace(/(\\S+)/g, 'kendo-mobile-$1,').slice(0, -1);\n            },\n            triggeredByInput: function (e) {\n                return /^(label|input|textarea|select)$/i.test(e.target.tagName);\n            },\n            onWidgetRegistered: function (callback) {\n                for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n                    callback(kendo.widgets[i]);\n                }\n                kendo._widgetRegisteredCallbacks.push(callback);\n            },\n            logToConsole: function (message, type) {\n                var console = window.console;\n                if (!kendo.suppressLog && typeof console != 'undefined' && console.log) {\n                    console[type || 'log'](message);\n                }\n            }\n        });\n        var Widget = Observable.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = kendo.jQuery(element).handler(that);\n                that.angular('init', options);\n                Observable.fn.init.call(that);\n                var dataSource = options ? options.dataSource : null;\n                if (dataSource) {\n                    options = extend({}, options, { dataSource: {} });\n                }\n                options = that.options = extend(true, {}, that.options, options);\n                if (dataSource) {\n                    options.dataSource = dataSource;\n                }\n                if (!that.element.attr(kendo.attr('role'))) {\n                    that.element.attr(kendo.attr('role'), (options.name || '').toLowerCase());\n                }\n                that.element.data('kendo' + options.prefix + options.name, that);\n                that.bind(that.events, options);\n            },\n            events: [],\n            options: { prefix: '' },\n            _hasBindingTarget: function () {\n                return !!this.element[0].kendoBindingTarget;\n            },\n            _tabindex: function (target) {\n                target = target || this.wrapper;\n                var element = this.element, TABINDEX = 'tabindex', tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n                element.removeAttr(TABINDEX);\n                target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n            },\n            setOptions: function (options) {\n                this._setEvents(options);\n                $.extend(this.options, options);\n            },\n            _setEvents: function (options) {\n                var that = this, idx = 0, length = that.events.length, e;\n                for (; idx < length; idx++) {\n                    e = that.events[idx];\n                    if (that.options[e] && options[e]) {\n                        that.unbind(e, that.options[e]);\n                    }\n                }\n                that.bind(that.events, options);\n            },\n            resize: function (force) {\n                var size = this.getSize(), currentSize = this._size;\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this._size = size;\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            size: function (size) {\n                if (!size) {\n                    return this.getSize();\n                } else {\n                    this.setSize(size);\n                }\n            },\n            setSize: $.noop,\n            _resize: $.noop,\n            destroy: function () {\n                var that = this;\n                that.element.removeData('kendo' + that.options.prefix + that.options.name);\n                that.element.removeData('handler');\n                that.unbind();\n            },\n            _destroy: function () {\n                this.destroy();\n            },\n            angular: function () {\n            },\n            _muteAngularRebind: function (callback) {\n                this._muteRebind = true;\n                callback.call(this);\n                this._muteRebind = false;\n            }\n        });\n        var DataBoundWidget = Widget.extend({\n            dataItems: function () {\n                return this.dataSource.flatView();\n            },\n            _angularItems: function (cmd) {\n                var that = this;\n                that.angular(cmd, function () {\n                    return {\n                        elements: that.items(),\n                        data: $.map(that.dataItems(), function (dataItem) {\n                            return { dataItem: dataItem };\n                        })\n                    };\n                });\n            }\n        });\n        kendo.dimensions = function (element, dimensions) {\n            var domElement = element[0];\n            if (dimensions) {\n                element.css(dimensions);\n            }\n            return {\n                width: domElement.offsetWidth,\n                height: domElement.offsetHeight\n            };\n        };\n        kendo.notify = noop;\n        var templateRegExp = /template$/i, jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/, jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/, dashRegExp = /([A-Z])/g;\n        function parseOption(element, option) {\n            var value;\n            if (option.indexOf('data') === 0) {\n                option = option.substring(4);\n                option = option.charAt(0).toLowerCase() + option.substring(1);\n            }\n            option = option.replace(dashRegExp, '-$1');\n            value = element.getAttribute('data-' + kendo.ns + option);\n            if (value === null) {\n                value = undefined;\n            } else if (value === 'null') {\n                value = null;\n            } else if (value === 'true') {\n                value = true;\n            } else if (value === 'false') {\n                value = false;\n            } else if (numberRegExp.test(value) && option != 'mask') {\n                value = parseFloat(value);\n            } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n                value = new Function('return (' + value + ')')();\n            }\n            return value;\n        }\n        function parseOptions(element, options, source) {\n            var result = {}, option, value, role = element.getAttribute('data-' + kendo.ns + 'role');\n            for (option in options) {\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    if (templateRegExp.test(option) && role != 'drawer') {\n                        if (typeof value === 'string') {\n                            if ($('#' + value).length) {\n                                value = kendo.template($('#' + value).html());\n                            } else if (source) {\n                                value = kendo.template(source[value]);\n                            }\n                        } else {\n                            value = element.getAttribute(option);\n                        }\n                    }\n                    result[option] = value;\n                }\n            }\n            return result;\n        }\n        kendo.initWidget = function (element, options, roles) {\n            var result, option, widget, idx, length, role, value, dataSource, fullPath, widgetKeyRegExp;\n            if (!roles) {\n                roles = kendo.ui.roles;\n            } else if (roles.roles) {\n                roles = roles.roles;\n            }\n            element = element.nodeType ? element : element[0];\n            role = element.getAttribute('data-' + kendo.ns + 'role');\n            if (!role) {\n                return;\n            }\n            fullPath = role.indexOf('.') === -1;\n            if (fullPath) {\n                widget = roles[role];\n            } else {\n                widget = kendo.getter(role)(window);\n            }\n            var data = $(element).data(), widgetKey = widget ? 'kendo' + widget.fn.options.prefix + widget.fn.options.name : '';\n            if (fullPath) {\n                widgetKeyRegExp = new RegExp('^kendo.*' + role + '$', 'i');\n            } else {\n                widgetKeyRegExp = new RegExp('^' + widgetKey + '$', 'i');\n            }\n            for (var key in data) {\n                if (key.match(widgetKeyRegExp)) {\n                    if (key === widgetKey) {\n                        result = data[key];\n                    } else {\n                        return data[key];\n                    }\n                }\n            }\n            if (!widget) {\n                return;\n            }\n            dataSource = parseOption(element, 'dataSource');\n            options = $.extend({}, parseOptions(element, widget.fn.options), options);\n            if (dataSource) {\n                if (typeof dataSource === STRING) {\n                    options.dataSource = kendo.getter(dataSource)(window);\n                } else {\n                    options.dataSource = dataSource;\n                }\n            }\n            for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n                option = widget.fn.events[idx];\n                value = parseOption(element, option);\n                if (value !== undefined) {\n                    options[option] = kendo.getter(value)(window);\n                }\n            }\n            if (!result) {\n                result = new widget(element, options);\n            } else if (!$.isEmptyObject(options)) {\n                result.setOptions(options);\n            }\n            return result;\n        };\n        kendo.rolesFromNamespaces = function (namespaces) {\n            var roles = [], idx, length;\n            if (!namespaces[0]) {\n                namespaces = [\n                    kendo.ui,\n                    kendo.dataviz.ui\n                ];\n            }\n            for (idx = 0, length = namespaces.length; idx < length; idx++) {\n                roles[idx] = namespaces[idx].roles;\n            }\n            return extend.apply(null, [{}].concat(roles.reverse()));\n        };\n        kendo.init = function (element) {\n            var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                kendo.initWidget(this, {}, roles);\n            });\n        };\n        kendo.destroy = function (element) {\n            $(element).find('[data-' + kendo.ns + 'role]').addBack().each(function () {\n                var data = $(this).data();\n                for (var key in data) {\n                    if (key.indexOf('kendo') === 0 && typeof data[key].destroy === FUNCTION) {\n                        data[key].destroy();\n                    }\n                }\n            });\n        };\n        function containmentComparer(a, b) {\n            return $.contains(a, b) ? -1 : 1;\n        }\n        function resizableWidget() {\n            var widget = $(this);\n            return $.inArray(widget.attr('data-' + kendo.ns + 'role'), [\n                'slider',\n                'rangeslider'\n            ]) > -1 || widget.is(':visible');\n        }\n        kendo.resize = function (element, force) {\n            var widgets = $(element).find('[data-' + kendo.ns + 'role]').addBack().filter(resizableWidget);\n            if (!widgets.length) {\n                return;\n            }\n            var widgetsArray = $.makeArray(widgets);\n            widgetsArray.sort(containmentComparer);\n            $.each(widgetsArray, function () {\n                var widget = kendo.widgetInstance($(this));\n                if (widget) {\n                    widget.resize(force);\n                }\n            });\n        };\n        kendo.parseOptions = parseOptions;\n        extend(kendo.ui, {\n            Widget: Widget,\n            DataBoundWidget: DataBoundWidget,\n            roles: {},\n            progress: function (container, toggle, options) {\n                var mask = container.find('.k-loading-mask'), support = kendo.support, browser = support.browser, isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n                options = $.extend({}, {\n                    width: '100%',\n                    height: '100%',\n                    top: container.scrollTop(),\n                    opacity: false\n                }, options);\n                cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n                if (toggle) {\n                    if (!mask.length) {\n                        isRtl = support.isRtl(container);\n                        leftRight = isRtl ? 'right' : 'left';\n                        containerScrollLeft = container.scrollLeft();\n                        webkitCorrection = browser.webkit ? !isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft : 0;\n                        mask = $(kendo.format('<div class=\\'{0}\\'><span class=\\'k-loading-text\\'>{1}</span><div class=\\'k-loading-image\\'/><div class=\\'k-loading-color\\'/></div>', cssClass, kendo.ui.progress.messages.loading)).width(options.width).height(options.height).css('top', options.top).css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection).prependTo(container);\n                    }\n                } else if (mask) {\n                    mask.remove();\n                }\n            },\n            plugin: function (widget, register, prefix) {\n                var name = widget.fn.options.name, getter;\n                register = register || kendo.ui;\n                prefix = prefix || '';\n                register[name] = widget;\n                register.roles[name.toLowerCase()] = widget;\n                getter = 'getKendo' + prefix + name;\n                name = 'kendo' + prefix + name;\n                var widgetEntry = {\n                    name: name,\n                    widget: widget,\n                    prefix: prefix || ''\n                };\n                kendo.widgets.push(widgetEntry);\n                for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n                    kendo._widgetRegisteredCallbacks[i](widgetEntry);\n                }\n                $.fn[name] = function (options) {\n                    var value = this, args;\n                    if (typeof options === STRING) {\n                        args = slice.call(arguments, 1);\n                        this.each(function () {\n                            var widget = $.data(this, name), method, result;\n                            if (!widget) {\n                                throw new Error(kendo.format('Cannot call method \\'{0}\\' of {1} before it is initialized', options, name));\n                            }\n                            method = widget[options];\n                            if (typeof method !== FUNCTION) {\n                                throw new Error(kendo.format('Cannot find method \\'{0}\\' of {1}', options, name));\n                            }\n                            result = method.apply(widget, args);\n                            if (result !== undefined) {\n                                value = result;\n                                return false;\n                            }\n                        });\n                    } else {\n                        this.each(function () {\n                            return new widget(this, options);\n                        });\n                    }\n                    return value;\n                };\n                $.fn[name].widget = widget;\n                $.fn[getter] = function () {\n                    return this.data(name);\n                };\n            }\n        });\n        kendo.ui.progress.messages = { loading: 'Loading...' };\n        var ContainerNullObject = {\n            bind: function () {\n                return this;\n            },\n            nullObject: true,\n            options: {}\n        };\n        var MobileWidget = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.autoApplyNS();\n                this.wrapper = this.element;\n                this.element.addClass('km-widget');\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.kendoDestroy();\n            },\n            options: { prefix: 'Mobile' },\n            events: [],\n            view: function () {\n                var viewElement = this.element.closest(kendo.roleSelector('view splitview modalview drawer'));\n                return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n            },\n            viewHasNativeScrolling: function () {\n                var view = this.view();\n                return view && view.options.useNativeScrolling;\n            },\n            container: function () {\n                var element = this.element.closest(kendo.roleSelector('view layout modalview drawer splitview'));\n                return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n            }\n        });\n        extend(kendo.mobile, {\n            init: function (element) {\n                kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n            },\n            appLevelNativeScrolling: function () {\n                return kendo.mobile.application && kendo.mobile.application.options && kendo.mobile.application.options.useNativeScrolling;\n            },\n            roles: {},\n            ui: {\n                Widget: MobileWidget,\n                DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n                roles: {},\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.mobile.ui, 'Mobile');\n                }\n            }\n        });\n        deepExtend(kendo.dataviz, {\n            init: function (element) {\n                kendo.init(element, kendo.dataviz.ui);\n            },\n            ui: {\n                roles: {},\n                themes: {},\n                views: [],\n                plugin: function (widget) {\n                    kendo.ui.plugin(widget, kendo.dataviz.ui);\n                }\n            },\n            roles: {}\n        });\n        kendo.touchScroller = function (elements, options) {\n            if (!options) {\n                options = {};\n            }\n            options.useNative = true;\n            return $(elements).map(function (idx, element) {\n                element = $(element);\n                if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data('kendoMobileScroller')) {\n                    element.kendoMobileScroller(options);\n                    return element.data('kendoMobileScroller');\n                } else {\n                    return false;\n                }\n            })[0];\n        };\n        kendo.preventDefault = function (e) {\n            e.preventDefault();\n        };\n        kendo.widgetInstance = function (element, suites) {\n            var role = element.data(kendo.ns + 'role'), widgets = [], i, length;\n            if (role) {\n                if (role === 'content') {\n                    role = 'scroller';\n                }\n                if (role === 'editortoolbar') {\n                    var editorToolbar = element.data('kendoEditorToolbar');\n                    if (editorToolbar) {\n                        return editorToolbar;\n                    }\n                }\n                if (role === 'view') {\n                    return element.data('kendoView');\n                }\n                if (suites) {\n                    if (suites[0]) {\n                        for (i = 0, length = suites.length; i < length; i++) {\n                            widgets.push(suites[i].roles[role]);\n                        }\n                    } else {\n                        widgets.push(suites.roles[role]);\n                    }\n                } else {\n                    widgets = [\n                        kendo.ui.roles[role],\n                        kendo.dataviz.ui.roles[role],\n                        kendo.mobile.ui.roles[role]\n                    ];\n                }\n                if (role.indexOf('.') >= 0) {\n                    widgets = [kendo.getter(role)(window)];\n                }\n                for (i = 0, length = widgets.length; i < length; i++) {\n                    var widget = widgets[i];\n                    if (widget) {\n                        var instance = element.data('kendo' + widget.fn.options.prefix + widget.fn.options.name);\n                        if (instance) {\n                            return instance;\n                        }\n                    }\n                }\n            }\n        };\n        kendo.onResize = function (callback) {\n            var handler = callback;\n            if (support.mobileOS.android) {\n                handler = function () {\n                    setTimeout(callback, 600);\n                };\n            }\n            $(window).on(support.resize, handler);\n            return handler;\n        };\n        kendo.unbindResize = function (callback) {\n            $(window).off(support.resize, callback);\n        };\n        kendo.attrValue = function (element, key) {\n            return element.data(kendo.ns + key);\n        };\n        kendo.days = {\n            Sunday: 0,\n            Monday: 1,\n            Tuesday: 2,\n            Wednesday: 3,\n            Thursday: 4,\n            Friday: 5,\n            Saturday: 6\n        };\n        function focusable(element, isTabIndexNotNaN) {\n            var nodeName = element.nodeName.toLowerCase();\n            return (/input|select|textarea|button|object/.test(nodeName) ? !element.disabled : 'a' === nodeName ? element.href || isTabIndexNotNaN : isTabIndexNotNaN) && visible(element);\n        }\n        function visible(element) {\n            return $.expr.pseudos.visible(element) && !$(element).parents().addBack().filter(function () {\n                return $.css(this, 'visibility') === 'hidden';\n            }).length;\n        }\n        $.extend($.expr.pseudos, {\n            kendoFocusable: function (element) {\n                var idx = $.attr(element, 'tabindex');\n                return focusable(element, !isNaN(idx) && idx > -1);\n            }\n        });\n        var MOUSE_EVENTS = [\n            'mousedown',\n            'mousemove',\n            'mouseenter',\n            'mouseleave',\n            'mouseover',\n            'mouseout',\n            'mouseup',\n            'click'\n        ];\n        var EXCLUDE_BUST_CLICK_SELECTOR = 'label, input, [data-rel=external]';\n        var MouseEventNormalizer = {\n            setupMouseMute: function () {\n                var idx = 0, length = MOUSE_EVENTS.length, element = document.documentElement;\n                if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n                    return;\n                }\n                MouseEventNormalizer.mouseTrap = true;\n                MouseEventNormalizer.bustClick = false;\n                MouseEventNormalizer.captureMouse = false;\n                var handler = function (e) {\n                    if (MouseEventNormalizer.captureMouse) {\n                        if (e.type === 'click') {\n                            if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n                                e.preventDefault();\n                                e.stopPropagation();\n                            }\n                        } else {\n                            e.stopPropagation();\n                        }\n                    }\n                };\n                for (; idx < length; idx++) {\n                    element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n                }\n            },\n            muteMouse: function (e) {\n                MouseEventNormalizer.captureMouse = true;\n                if (e.data.bustClick) {\n                    MouseEventNormalizer.bustClick = true;\n                }\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n            },\n            unMuteMouse: function () {\n                clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n                MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function () {\n                    MouseEventNormalizer.captureMouse = false;\n                    MouseEventNormalizer.bustClick = false;\n                }, 400);\n            }\n        };\n        var eventMap = {\n            down: 'touchstart mousedown',\n            move: 'mousemove touchmove',\n            up: 'mouseup touchend touchcancel',\n            cancel: 'mouseleave touchcancel'\n        };\n        if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n            eventMap = {\n                down: 'touchstart',\n                move: 'touchmove',\n                up: 'touchend touchcancel',\n                cancel: 'touchcancel'\n            };\n        } else if (support.pointers) {\n            eventMap = {\n                down: 'pointerdown',\n                move: 'pointermove',\n                up: 'pointerup',\n                cancel: 'pointercancel pointerleave'\n            };\n        } else if (support.msPointers) {\n            eventMap = {\n                down: 'MSPointerDown',\n                move: 'MSPointerMove',\n                up: 'MSPointerUp',\n                cancel: 'MSPointerCancel MSPointerLeave'\n            };\n        }\n        if (support.msPointers && !('onmspointerenter' in window)) {\n            $.each({\n                MSPointerEnter: 'MSPointerOver',\n                MSPointerLeave: 'MSPointerOut'\n            }, function (orig, fix) {\n                $.event.special[orig] = {\n                    delegateType: fix,\n                    bindType: fix,\n                    handle: function (event) {\n                        var ret, target = this, related = event.relatedTarget, handleObj = event.handleObj;\n                        if (!related || related !== target && !$.contains(target, related)) {\n                            event.type = handleObj.origType;\n                            ret = handleObj.handler.apply(this, arguments);\n                            event.type = fix;\n                        }\n                        return ret;\n                    }\n                };\n            });\n        }\n        var getEventMap = function (e) {\n                return eventMap[e] || e;\n            }, eventRegEx = /([^ ]+)/g;\n        kendo.applyEventMap = function (events, ns) {\n            events = events.replace(eventRegEx, getEventMap);\n            if (ns) {\n                events = events.replace(eventRegEx, '$1.' + ns);\n            }\n            return events;\n        };\n        var on = $.fn.on;\n        function kendoJQuery(selector, context) {\n            return new kendoJQuery.fn.init(selector, context);\n        }\n        noDepricateExtend(true, kendoJQuery, $);\n        kendoJQuery.fn = kendoJQuery.prototype = new $();\n        kendoJQuery.fn.constructor = kendoJQuery;\n        kendoJQuery.fn.init = function (selector, context) {\n            if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n                context = kendoJQuery(context);\n            }\n            return $.fn.init.call(this, selector, context, rootjQuery);\n        };\n        kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n        var rootjQuery = kendoJQuery(document);\n        extend(kendoJQuery.fn, {\n            handler: function (handler) {\n                this.data('handler', handler);\n                return this;\n            },\n            autoApplyNS: function (ns) {\n                this.data('kendoNS', ns || kendo.guid());\n                return this;\n            },\n            on: function () {\n                var that = this, ns = that.data('kendoNS');\n                if (arguments.length === 1) {\n                    return on.call(that, arguments[0]);\n                }\n                var context = that, args = slice.call(arguments);\n                if (typeof args[args.length - 1] === UNDEFINED) {\n                    args.pop();\n                }\n                var callback = args[args.length - 1], events = kendo.applyEventMap(args[0], ns);\n                if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n                    MouseEventNormalizer.setupMouseMute();\n                    var selector = args.length === 2 ? null : args[1], bustClick = events.indexOf('click') > -1 && events.indexOf('touchend') > -1;\n                    on.call(this, {\n                        touchstart: MouseEventNormalizer.muteMouse,\n                        touchend: MouseEventNormalizer.unMuteMouse\n                    }, selector, { bustClick: bustClick });\n                }\n                if (typeof callback === STRING) {\n                    context = that.data('handler');\n                    callback = context[callback];\n                    args[args.length - 1] = function (e) {\n                        callback.call(context, e);\n                    };\n                }\n                args[0] = events;\n                on.apply(that, args);\n                return that;\n            },\n            kendoDestroy: function (ns) {\n                ns = ns || this.data('kendoNS');\n                if (ns) {\n                    this.off('.' + ns);\n                }\n                return this;\n            }\n        });\n        kendo.jQuery = kendoJQuery;\n        kendo.eventMap = eventMap;\n        kendo.timezone = function () {\n            var months = {\n                Jan: 0,\n                Feb: 1,\n                Mar: 2,\n                Apr: 3,\n                May: 4,\n                Jun: 5,\n                Jul: 6,\n                Aug: 7,\n                Sep: 8,\n                Oct: 9,\n                Nov: 10,\n                Dec: 11\n            };\n            var days = {\n                Sun: 0,\n                Mon: 1,\n                Tue: 2,\n                Wed: 3,\n                Thu: 4,\n                Fri: 5,\n                Sat: 6\n            };\n            function ruleToDate(year, rule) {\n                var date;\n                var targetDay;\n                var ourDay;\n                var month = rule[3];\n                var on = rule[4];\n                var time = rule[5];\n                var cache = rule[8];\n                if (!cache) {\n                    rule[8] = cache = {};\n                }\n                if (cache[year]) {\n                    return cache[year];\n                }\n                if (!isNaN(on)) {\n                    date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n                } else if (on.indexOf('last') === 0) {\n                    date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n                    targetDay = days[on.substr(4, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                } else if (on.indexOf('>=') >= 0) {\n                    date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n                }\n                return cache[year] = date;\n            }\n            function findRule(utcTime, rules, zone) {\n                rules = rules[zone];\n                if (!rules) {\n                    var time = zone.split(':');\n                    var offset = 0;\n                    if (time.length > 1) {\n                        offset = time[0] * 60 + Number(time[1]);\n                    }\n                    return [\n                        -1000000,\n                        'max',\n                        '-',\n                        'Jan',\n                        1,\n                        [\n                            0,\n                            0,\n                            0\n                        ],\n                        offset,\n                        '-'\n                    ];\n                }\n                var year = new Date(utcTime).getUTCFullYear();\n                rules = jQuery.grep(rules, function (rule) {\n                    var from = rule[0];\n                    var to = rule[1];\n                    return from <= year && (to >= year || from == year && to == 'only' || to == 'max');\n                });\n                rules.push(utcTime);\n                rules.sort(function (a, b) {\n                    if (typeof a != 'number') {\n                        a = Number(ruleToDate(year, a));\n                    }\n                    if (typeof b != 'number') {\n                        b = Number(ruleToDate(year, b));\n                    }\n                    return a - b;\n                });\n                var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n                return isNaN(rule) ? rule : null;\n            }\n            function findZone(utcTime, zones, timezone) {\n                var zoneRules = zones[timezone];\n                if (typeof zoneRules === 'string') {\n                    zoneRules = zones[zoneRules];\n                }\n                if (!zoneRules) {\n                    throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n                }\n                for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n                    var until = zoneRules[idx][3];\n                    if (until && utcTime > until) {\n                        break;\n                    }\n                }\n                var zone = zoneRules[idx + 1];\n                if (!zone) {\n                    throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + '.');\n                }\n                return zone;\n            }\n            function zoneAndRule(utcTime, zones, rules, timezone) {\n                if (typeof utcTime != NUMBER) {\n                    utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(), utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(), utcTime.getSeconds(), utcTime.getMilliseconds());\n                }\n                var zone = findZone(utcTime, zones, timezone);\n                return {\n                    zone: zone,\n                    rule: findRule(utcTime, rules, zone[1])\n                };\n            }\n            function offset(utcTime, timezone) {\n                if (timezone == 'Etc/UTC' || timezone == 'Etc/GMT') {\n                    return 0;\n                }\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n            }\n            function abbr(utcTime, timezone) {\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n                var base = zone[2];\n                if (base.indexOf('/') >= 0) {\n                    return base.split('/')[rule && +rule[6] ? 1 : 0];\n                } else if (base.indexOf('%s') >= 0) {\n                    return base.replace('%s', !rule || rule[7] == '-' ? '' : rule[7]);\n                }\n                return base;\n            }\n            function convert(date, fromOffset, toOffset) {\n                var tempToOffset = toOffset;\n                var diff;\n                if (typeof fromOffset == STRING) {\n                    fromOffset = this.offset(date, fromOffset);\n                }\n                if (typeof toOffset == STRING) {\n                    toOffset = this.offset(date, toOffset);\n                }\n                var fromLocalOffset = date.getTimezoneOffset();\n                date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n                var toLocalOffset = date.getTimezoneOffset();\n                if (typeof tempToOffset == STRING) {\n                    tempToOffset = this.offset(date, tempToOffset);\n                }\n                diff = toLocalOffset - fromLocalOffset + (toOffset - tempToOffset);\n                return new Date(date.getTime() + diff * 60000);\n            }\n            function apply(date, timezone) {\n                return this.convert(date, date.getTimezoneOffset(), timezone);\n            }\n            function remove(date, timezone) {\n                return this.convert(date, timezone, date.getTimezoneOffset());\n            }\n            function toLocalDate(time) {\n                return this.apply(new Date(time), 'Etc/UTC');\n            }\n            return {\n                zones: {},\n                rules: {},\n                offset: offset,\n                convert: convert,\n                apply: apply,\n                remove: remove,\n                abbr: abbr,\n                toLocalDate: toLocalDate\n            };\n        }();\n        kendo.date = function () {\n            var MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000;\n            function adjustDST(date, hours) {\n                if (hours === 0 && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                    return true;\n                }\n                return false;\n            }\n            function setDayOfWeek(date, day, dir) {\n                var hours = date.getHours();\n                dir = dir || 1;\n                day = (day - date.getDay() + 7 * dir) % 7;\n                date.setDate(date.getDate() + day);\n                adjustDST(date, hours);\n            }\n            function dayOfWeek(date, day, dir) {\n                date = new Date(date);\n                setDayOfWeek(date, day, dir);\n                return date;\n            }\n            function firstDayOfMonth(date) {\n                return new Date(date.getFullYear(), date.getMonth(), 1);\n            }\n            function lastDayOfMonth(date) {\n                var last = new Date(date.getFullYear(), date.getMonth() + 1, 0), first = firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                if (timeOffset) {\n                    last.setHours(first.getHours() + timeOffset / 60);\n                }\n                return last;\n            }\n            function moveDateToWeekStart(date, weekStartDay) {\n                if (weekStartDay !== 1) {\n                    return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n                }\n                return addDays(date, 4 - (date.getDay() || 7));\n            }\n            function calcWeekInYear(date, weekStartDay) {\n                var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n                var newDate = moveDateToWeekStart(date, weekStartDay);\n                var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n                var days = Math.floor(diffInMS / MS_PER_DAY);\n                return 1 + Math.floor(days / 7);\n            }\n            function weekInYear(date, weekStartDay) {\n                if (weekStartDay === undefined) {\n                    weekStartDay = kendo.culture().calendar.firstDay;\n                }\n                var prevWeekDate = addDays(date, -7);\n                var nextWeekDate = addDays(date, 7);\n                var weekNumber = calcWeekInYear(date, weekStartDay);\n                if (weekNumber === 0) {\n                    return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n                }\n                if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n                    return 1;\n                }\n                return weekNumber;\n            }\n            function getDate(date) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n                adjustDST(date, 0);\n                return date;\n            }\n            function toUtcTime(date) {\n                return Date.UTC(date.getFullYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n            }\n            function getMilliseconds(date) {\n                return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n            }\n            function isInTimeRange(value, min, max) {\n                var msMin = getMilliseconds(min), msMax = getMilliseconds(max), msValue;\n                if (!value || msMin == msMax) {\n                    return true;\n                }\n                if (min >= max) {\n                    max += MS_PER_DAY;\n                }\n                msValue = getMilliseconds(value);\n                if (msMin > msValue) {\n                    msValue += MS_PER_DAY;\n                }\n                if (msMax < msMin) {\n                    msMax += MS_PER_DAY;\n                }\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function isInDateRange(value, min, max) {\n                var msMin = min.getTime(), msMax = max.getTime(), msValue;\n                if (msMin >= msMax) {\n                    msMax += MS_PER_DAY;\n                }\n                msValue = value.getTime();\n                return msValue >= msMin && msValue <= msMax;\n            }\n            function addDays(date, offset) {\n                var hours = date.getHours();\n                date = new Date(date);\n                setTime(date, offset * MS_PER_DAY);\n                adjustDST(date, hours);\n                return date;\n            }\n            function setTime(date, milliseconds, ignoreDST) {\n                var offset = date.getTimezoneOffset();\n                var difference;\n                date.setTime(date.getTime() + milliseconds);\n                if (!ignoreDST) {\n                    difference = date.getTimezoneOffset() - offset;\n                    date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n                }\n            }\n            function setHours(date, time) {\n                date = new Date(kendo.date.getDate(date).getTime() + kendo.date.getMilliseconds(time));\n                adjustDST(date, time.getHours());\n                return date;\n            }\n            function today() {\n                return getDate(new Date());\n            }\n            function isToday(date) {\n                return getDate(date).getTime() == today().getTime();\n            }\n            function toInvariantTime(date) {\n                var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n                if (date) {\n                    staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                }\n                return staticDate;\n            }\n            return {\n                adjustDST: adjustDST,\n                dayOfWeek: dayOfWeek,\n                setDayOfWeek: setDayOfWeek,\n                getDate: getDate,\n                isInDateRange: isInDateRange,\n                isInTimeRange: isInTimeRange,\n                isToday: isToday,\n                nextDay: function (date) {\n                    return addDays(date, 1);\n                },\n                previousDay: function (date) {\n                    return addDays(date, -1);\n                },\n                toUtcTime: toUtcTime,\n                MS_PER_DAY: MS_PER_DAY,\n                MS_PER_HOUR: 60 * MS_PER_MINUTE,\n                MS_PER_MINUTE: MS_PER_MINUTE,\n                setTime: setTime,\n                setHours: setHours,\n                addDays: addDays,\n                today: today,\n                toInvariantTime: toInvariantTime,\n                firstDayOfMonth: firstDayOfMonth,\n                lastDayOfMonth: lastDayOfMonth,\n                weekInYear: weekInYear,\n                getMilliseconds: getMilliseconds\n            };\n        }();\n        kendo.stripWhitespace = function (element) {\n            if (document.createNodeIterator) {\n                var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function (node) {\n                    return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n                }, false);\n                while (iterator.nextNode()) {\n                    if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n                        iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n                    }\n                }\n            } else {\n                for (var i = 0; i < element.childNodes.length; i++) {\n                    var child = element.childNodes[i];\n                    if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n                        element.removeChild(child);\n                        i--;\n                    }\n                    if (child.nodeType == 1) {\n                        kendo.stripWhitespace(child);\n                    }\n                }\n            }\n        };\n        var animationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (callback) {\n            setTimeout(callback, 1000 / 60);\n        };\n        kendo.animationFrame = function (callback) {\n            animationFrame.call(window, callback);\n        };\n        var animationQueue = [];\n        kendo.queueAnimation = function (callback) {\n            animationQueue[animationQueue.length] = callback;\n            if (animationQueue.length === 1) {\n                kendo.runNextAnimation();\n            }\n        };\n        kendo.runNextAnimation = function () {\n            kendo.animationFrame(function () {\n                if (animationQueue[0]) {\n                    animationQueue.shift()();\n                    if (animationQueue[0]) {\n                        kendo.runNextAnimation();\n                    }\n                }\n            });\n        };\n        kendo.parseQueryStringParams = function (url) {\n            var queryString = url.split('?')[1] || '', params = {}, paramParts = queryString.split(/&|=/), length = paramParts.length, idx = 0;\n            for (; idx < length; idx += 2) {\n                if (paramParts[idx] !== '') {\n                    params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n                }\n            }\n            return params;\n        };\n        kendo.elementUnderCursor = function (e) {\n            if (typeof e.x.client != 'undefined') {\n                return document.elementFromPoint(e.x.client, e.y.client);\n            }\n        };\n        kendo.wheelDeltaY = function (jQueryEvent) {\n            var e = jQueryEvent.originalEvent, deltaY = e.wheelDeltaY, delta;\n            if (e.wheelDelta) {\n                if (deltaY === undefined || deltaY) {\n                    delta = e.wheelDelta;\n                }\n            } else if (e.detail && e.axis === e.VERTICAL_AXIS) {\n                delta = -e.detail * 10;\n            }\n            return delta;\n        };\n        kendo.throttle = function (fn, delay) {\n            var timeout;\n            var lastExecTime = 0;\n            if (!delay || delay <= 0) {\n                return fn;\n            }\n            var throttled = function () {\n                var that = this;\n                var elapsed = +new Date() - lastExecTime;\n                var args = arguments;\n                function exec() {\n                    fn.apply(that, args);\n                    lastExecTime = +new Date();\n                }\n                if (!lastExecTime) {\n                    return exec();\n                }\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n                if (elapsed > delay) {\n                    exec();\n                } else {\n                    timeout = setTimeout(exec, delay - elapsed);\n                }\n            };\n            throttled.cancel = function () {\n                clearTimeout(timeout);\n            };\n            return throttled;\n        };\n        kendo.caret = function (element, start, end) {\n            var rangeElement;\n            var isPosition = start !== undefined;\n            if (end === undefined) {\n                end = start;\n            }\n            if (element[0]) {\n                element = element[0];\n            }\n            if (isPosition && element.disabled) {\n                return;\n            }\n            try {\n                if (element.selectionStart !== undefined) {\n                    if (isPosition) {\n                        element.focus();\n                        var mobile = support.mobileOS;\n                        if (mobile.wp || mobile.android) {\n                            setTimeout(function () {\n                                element.setSelectionRange(start, end);\n                            }, 0);\n                        } else {\n                            element.setSelectionRange(start, end);\n                        }\n                    } else {\n                        start = [\n                            element.selectionStart,\n                            element.selectionEnd\n                        ];\n                    }\n                } else if (document.selection) {\n                    if ($(element).is(':visible')) {\n                        element.focus();\n                    }\n                    rangeElement = element.createTextRange();\n                    if (isPosition) {\n                        rangeElement.collapse(true);\n                        rangeElement.moveStart('character', start);\n                        rangeElement.moveEnd('character', end - start);\n                        rangeElement.select();\n                    } else {\n                        var rangeDuplicated = rangeElement.duplicate(), selectionStart, selectionEnd;\n                        rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n                        rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n                        selectionStart = rangeDuplicated.text.length;\n                        selectionEnd = selectionStart + rangeElement.text.length;\n                        start = [\n                            selectionStart,\n                            selectionEnd\n                        ];\n                    }\n                }\n            } catch (e) {\n                start = [];\n            }\n            return start;\n        };\n        kendo.compileMobileDirective = function (element, scope) {\n            var angular = window.angular;\n            element.attr('data-' + kendo.ns + 'role', element[0].tagName.toLowerCase().replace('kendo-mobile-', '').replace('-', ''));\n            angular.element(element).injector().invoke([\n                '$compile',\n                function ($compile) {\n                    $compile(element)(scope);\n                    if (!/^\\$(digest|apply)$/.test(scope.$$phase)) {\n                        scope.$digest();\n                    }\n                }\n            ]);\n            return kendo.widgetInstance(element, kendo.mobile.ui);\n        };\n        kendo.antiForgeryTokens = function () {\n            var tokens = {}, csrf_token = $('meta[name=csrf-token],meta[name=_csrf]').attr('content'), csrf_param = $('meta[name=csrf-param],meta[name=_csrf_header]').attr('content');\n            $('input[name^=\\'__RequestVerificationToken\\']').each(function () {\n                tokens[this.name] = this.value;\n            });\n            if (csrf_param !== undefined && csrf_token !== undefined) {\n                tokens[csrf_param] = csrf_token;\n            }\n            return tokens;\n        };\n        kendo.cycleForm = function (form) {\n            var firstElement = form.find('input, .k-widget').first();\n            var lastElement = form.find('button, .k-button').last();\n            function focus(el) {\n                var widget = kendo.widgetInstance(el);\n                if (widget && widget.focus) {\n                    widget.focus();\n                } else {\n                    el.focus();\n                }\n            }\n            lastElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n                    e.preventDefault();\n                    focus(firstElement);\n                }\n            });\n            firstElement.on('keydown', function (e) {\n                if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n                    e.preventDefault();\n                    focus(lastElement);\n                }\n            });\n        };\n        kendo.focusElement = function (element) {\n            var scrollTopPositions = [];\n            var scrollableParents = element.parentsUntil('body').filter(function (index, element) {\n                var computedStyle = kendo.getComputedStyles(element, ['overflow']);\n                return computedStyle.overflow !== 'visible';\n            }).add(window);\n            scrollableParents.each(function (index, parent) {\n                scrollTopPositions[index] = $(parent).scrollTop();\n            });\n            try {\n                element[0].setActive();\n            } catch (e) {\n                element[0].focus();\n            }\n            scrollableParents.each(function (index, parent) {\n                $(parent).scrollTop(scrollTopPositions[index]);\n            });\n        };\n        kendo.matchesMedia = function (mediaQuery) {\n            var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n            return support.matchMedia && window.matchMedia(media).matches;\n        };\n        kendo._bootstrapToMedia = function (bootstrapMedia) {\n            return {\n                'xs': '(max-width: 576px)',\n                'sm': '(min-width: 576px)',\n                'md': '(min-width: 768px)',\n                'lg': '(min-width: 992px)',\n                'xl': '(min-width: 1200px)'\n            }[bootstrapMedia];\n        };\n        (function () {\n            function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n                var form = $('<form>').attr({\n                    action: proxyURL,\n                    method: 'POST',\n                    target: proxyTarget\n                });\n                var data = kendo.antiForgeryTokens();\n                data.fileName = fileName;\n                var parts = dataURI.split(';base64,');\n                data.contentType = parts[0].replace('data:', '');\n                data.base64 = parts[1];\n                for (var name in data) {\n                    if (data.hasOwnProperty(name)) {\n                        $('<input>').attr({\n                            value: data[name],\n                            name: name,\n                            type: 'hidden'\n                        }).appendTo(form);\n                    }\n                }\n                form.appendTo('body').submit().remove();\n            }\n            var fileSaver = document.createElement('a');\n            var downloadAttribute = 'download' in fileSaver && !kendo.support.browser.edge;\n            function saveAsBlob(dataURI, fileName) {\n                var blob = dataURI;\n                if (typeof dataURI == 'string') {\n                    var parts = dataURI.split(';base64,');\n                    var contentType = parts[0];\n                    var base64 = atob(parts[1]);\n                    var array = new Uint8Array(base64.length);\n                    for (var idx = 0; idx < base64.length; idx++) {\n                        array[idx] = base64.charCodeAt(idx);\n                    }\n                    blob = new Blob([array.buffer], { type: contentType });\n                }\n                navigator.msSaveBlob(blob, fileName);\n            }\n            function saveAsDataURI(dataURI, fileName) {\n                if (window.Blob && dataURI instanceof Blob) {\n                    dataURI = URL.createObjectURL(dataURI);\n                }\n                fileSaver.download = fileName;\n                fileSaver.href = dataURI;\n                var e = document.createEvent('MouseEvents');\n                e.initMouseEvent('click', true, false, window, 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n                fileSaver.dispatchEvent(e);\n                setTimeout(function () {\n                    URL.revokeObjectURL(dataURI);\n                });\n            }\n            kendo.saveAs = function (options) {\n                var save = postToProxy;\n                if (!options.forceProxy) {\n                    if (downloadAttribute) {\n                        save = saveAsDataURI;\n                    } else if (navigator.msSaveBlob) {\n                        save = saveAsBlob;\n                    }\n                }\n                save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n            };\n        }());\n        kendo.proxyModelSetters = function proxyModelSetters(data) {\n            var observable = {};\n            Object.keys(data || {}).forEach(function (property) {\n                Object.defineProperty(observable, property, {\n                    get: function () {\n                        return data[property];\n                    },\n                    set: function (value) {\n                        data[property] = value;\n                        data.dirty = true;\n                    }\n                });\n            });\n            return observable;\n        };\n    }(jQuery, window));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.fx', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'fx',\n        name: 'Effects',\n        category: 'framework',\n        description: 'Required for animation effects in all Kendo UI widgets.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, fx = kendo.effects, each = $.each, extend = $.extend, proxy = $.proxy, support = kendo.support, browser = support.browser, transforms = support.transforms, transitions = support.transitions, scaleProperties = {\n                scale: 0,\n                scalex: 0,\n                scaley: 0,\n                scale3d: 0\n            }, translateProperties = {\n                translate: 0,\n                translatex: 0,\n                translatey: 0,\n                translate3d: 0\n            }, hasZoom = typeof document.documentElement.style.zoom !== 'undefined' && !transforms, matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i, cssParamsRegExp = /^(-?[\\d\\.\\-]+)?[\\w\\s]*,?\\s*(-?[\\d\\.\\-]+)?[\\w\\s]*/i, translateXRegExp = /translatex?$/i, oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/, singleEffectRegExp = /(zoom|fade|expand)/, unitRegExp = /[xy]$/i, transformProps = [\n                'perspective',\n                'rotate',\n                'rotatex',\n                'rotatey',\n                'rotatez',\n                'rotate3d',\n                'scale',\n                'scalex',\n                'scaley',\n                'scalez',\n                'scale3d',\n                'skew',\n                'skewx',\n                'skewy',\n                'translate',\n                'translatex',\n                'translatey',\n                'translatez',\n                'translate3d',\n                'matrix',\n                'matrix3d'\n            ], transform2d = [\n                'rotate',\n                'scale',\n                'scalex',\n                'scaley',\n                'skew',\n                'skewx',\n                'skewy',\n                'translate',\n                'translatex',\n                'translatey',\n                'matrix'\n            ], transform2units = {\n                'rotate': 'deg',\n                scale: '',\n                skew: 'px',\n                translate: 'px'\n            }, cssPrefix = transforms.css, round = Math.round, BLANK = '', PX = 'px', NONE = 'none', AUTO = 'auto', WIDTH = 'width', HEIGHT = 'height', HIDDEN = 'hidden', ORIGIN = 'origin', ABORT_ID = 'abortId', OVERFLOW = 'overflow', TRANSLATE = 'translate', POSITION = 'position', COMPLETE_CALLBACK = 'completeCallback', TRANSITION = cssPrefix + 'transition', TRANSFORM = cssPrefix + 'transform', BACKFACE = cssPrefix + 'backface-visibility', PERSPECTIVE = cssPrefix + 'perspective', DEFAULT_PERSPECTIVE = '1500px', TRANSFORM_PERSPECTIVE = 'perspective(' + DEFAULT_PERSPECTIVE + ')', directions = {\n                left: {\n                    reverse: 'right',\n                    property: 'left',\n                    transition: 'translatex',\n                    vertical: false,\n                    modifier: -1\n                },\n                right: {\n                    reverse: 'left',\n                    property: 'left',\n                    transition: 'translatex',\n                    vertical: false,\n                    modifier: 1\n                },\n                down: {\n                    reverse: 'up',\n                    property: 'top',\n                    transition: 'translatey',\n                    vertical: true,\n                    modifier: 1\n                },\n                up: {\n                    reverse: 'down',\n                    property: 'top',\n                    transition: 'translatey',\n                    vertical: true,\n                    modifier: -1\n                },\n                top: { reverse: 'bottom' },\n                bottom: { reverse: 'top' },\n                'in': {\n                    reverse: 'out',\n                    modifier: -1\n                },\n                out: {\n                    reverse: 'in',\n                    modifier: 1\n                },\n                vertical: { reverse: 'vertical' },\n                horizontal: { reverse: 'horizontal' }\n            };\n        kendo.directions = directions;\n        extend($.fn, {\n            kendoStop: function (clearQueue, gotoEnd) {\n                if (transitions) {\n                    return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\n                } else {\n                    return this.stop(clearQueue, gotoEnd);\n                }\n            }\n        });\n        if (transforms && !transitions) {\n            each(transform2d, function (idx, value) {\n                $.fn[value] = function (val) {\n                    if (typeof val == 'undefined') {\n                        return animationProperty(this, value);\n                    } else {\n                        var that = $(this)[0], transformValue = value + '(' + val + transform2units[value.replace(unitRegExp, '')] + ')';\n                        if (that.style.cssText.indexOf(TRANSFORM) == -1) {\n                            $(this).css(TRANSFORM, transformValue);\n                        } else {\n                            that.style.cssText = that.style.cssText.replace(new RegExp(value + '\\\\(.*?\\\\)', 'i'), transformValue);\n                        }\n                    }\n                    return this;\n                };\n                $.fx.step[value] = function (fx) {\n                    $(fx.elem)[value](fx.now);\n                };\n            });\n            var curProxy = $.fx.prototype.cur;\n            $.fx.prototype.cur = function () {\n                if (transform2d.indexOf(this.prop) != -1) {\n                    return parseFloat($(this.elem)[this.prop]());\n                }\n                return curProxy.apply(this, arguments);\n            };\n        }\n        kendo.toggleClass = function (element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(' ');\n                if (transitions) {\n                    options = extend({\n                        exclusive: 'all',\n                        duration: 400,\n                        ease: 'ease-out'\n                    }, options);\n                    element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease);\n                    setTimeout(function () {\n                        element.css(TRANSITION, '').css(HEIGHT);\n                    }, options.duration);\n                }\n                each(classes, function (idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n            return element;\n        };\n        kendo.parseEffects = function (input, mirror) {\n            var effects = {};\n            if (typeof input === 'string') {\n                each(input.split(' '), function (idx, value) {\n                    var redirectedEffect = !singleEffectRegExp.test(value), resolved = value.replace(oldEffectsRegExp, function (match, $1, $2) {\n                            return $1 + ':' + $2.toLowerCase();\n                        }), effect = resolved.split(':'), direction = effect[1], effectBody = {};\n                    if (effect.length > 1) {\n                        effectBody.direction = mirror && redirectedEffect ? directions[direction].reverse : direction;\n                    }\n                    effects[effect[0]] = effectBody;\n                });\n            } else {\n                each(input, function (idx) {\n                    var direction = this.direction;\n                    if (direction && mirror && !singleEffectRegExp.test(idx)) {\n                        this.direction = directions[direction].reverse;\n                    }\n                    effects[idx] = this;\n                });\n            }\n            return effects;\n        };\n        function parseInteger(value) {\n            return parseInt(value, 10);\n        }\n        function parseCSS(element, property) {\n            return parseInteger(element.css(property));\n        }\n        function keys(obj) {\n            var acc = [];\n            for (var propertyName in obj) {\n                acc.push(propertyName);\n            }\n            return acc;\n        }\n        function strip3DTransforms(properties) {\n            for (var key in properties) {\n                if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\n                    delete properties[key];\n                }\n            }\n            return properties;\n        }\n        function normalizeCSS(element, properties) {\n            var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\n            for (key in properties) {\n                lowerKey = key.toLowerCase();\n                isTransformed = transforms && transformProps.indexOf(lowerKey) != -1;\n                if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\n                    delete properties[key];\n                } else {\n                    value = properties[key];\n                    if (isTransformed) {\n                        transformation.push(key + '(' + value + ')');\n                    } else {\n                        cssValues[key] = value;\n                    }\n                }\n            }\n            if (transformation.length) {\n                cssValues[TRANSFORM] = transformation.join(' ');\n            }\n            return cssValues;\n        }\n        if (transitions) {\n            extend(fx, {\n                transition: function (element, properties, options) {\n                    var css, delay = 0, oldKeys = element.data('keys') || [], timeoutID;\n                    options = extend({\n                        duration: 200,\n                        ease: 'ease-out',\n                        complete: null,\n                        exclusive: 'all'\n                    }, options);\n                    var stopTransitionCalled = false;\n                    var stopTransition = function () {\n                        if (!stopTransitionCalled) {\n                            stopTransitionCalled = true;\n                            if (timeoutID) {\n                                clearTimeout(timeoutID);\n                                timeoutID = null;\n                            }\n                            element.removeData(ABORT_ID).dequeue().css(TRANSITION, '').css(TRANSITION);\n                            options.complete.call(element);\n                        }\n                    };\n                    options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\n                    css = normalizeCSS(element, properties);\n                    $.merge(oldKeys, keys(css));\n                    if ($.hasOwnProperty('uniqueSort')) {\n                        element.data('keys', $.uniqueSort(oldKeys)).height();\n                    } else {\n                        element.data('keys', $.unique(oldKeys)).height();\n                    }\n                    element.css(TRANSITION, options.exclusive + ' ' + options.duration + 'ms ' + options.ease).css(TRANSITION);\n                    element.css(css).css(TRANSFORM);\n                    if (transitions.event) {\n                        element.one(transitions.event, stopTransition);\n                        if (options.duration !== 0) {\n                            delay = 500;\n                        }\n                    }\n                    timeoutID = setTimeout(stopTransition, options.duration + delay);\n                    element.data(ABORT_ID, timeoutID);\n                    element.data(COMPLETE_CALLBACK, stopTransition);\n                },\n                stopQueue: function (element, clearQueue, gotoEnd) {\n                    var cssValues, taskKeys = element.data('keys'), retainPosition = !gotoEnd && taskKeys, completeCallback = element.data(COMPLETE_CALLBACK);\n                    if (retainPosition) {\n                        cssValues = kendo.getComputedStyles(element[0], taskKeys);\n                    }\n                    if (completeCallback) {\n                        completeCallback();\n                    }\n                    if (retainPosition) {\n                        element.css(cssValues);\n                    }\n                    return element.removeData('keys').stop(clearQueue);\n                }\n            });\n        }\n        function animationProperty(element, property) {\n            if (transforms) {\n                var transform = element.css(TRANSFORM);\n                if (transform == NONE) {\n                    return property == 'scale' ? 1 : 0;\n                }\n                var match = transform.match(new RegExp(property + '\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)')), computed = 0;\n                if (match) {\n                    computed = parseInteger(match[1]);\n                } else {\n                    match = transform.match(matrix3dRegExp) || [\n                        0,\n                        0,\n                        0,\n                        0,\n                        0\n                    ];\n                    property = property.toLowerCase();\n                    if (translateXRegExp.test(property)) {\n                        computed = parseFloat(match[3] / match[2]);\n                    } else if (property == 'translatey') {\n                        computed = parseFloat(match[4] / match[2]);\n                    } else if (property == 'scale') {\n                        computed = parseFloat(match[2]);\n                    } else if (property == 'rotate') {\n                        computed = parseFloat(Math.atan2(match[2], match[1]));\n                    }\n                }\n                return computed;\n            } else {\n                return parseFloat(element.css(property));\n            }\n        }\n        var EffectSet = kendo.Class.extend({\n            init: function (element, options) {\n                var that = this;\n                that.element = element;\n                that.effects = [];\n                that.options = options;\n                that.restore = [];\n            },\n            run: function (effects) {\n                var that = this, effect, idx, jdx, length = effects.length, element = that.element, options = that.options, deferred = $.Deferred(), start = {}, end = {}, target, children, childrenLength;\n                that.effects = effects;\n                deferred.done($.proxy(that, 'complete'));\n                element.data('animating', true);\n                for (idx = 0; idx < length; idx++) {\n                    effect = effects[idx];\n                    effect.setReverse(options.reverse);\n                    effect.setOptions(options);\n                    that.addRestoreProperties(effect.restore);\n                    effect.prepare(start, end);\n                    children = effect.children();\n                    for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx++) {\n                        children[jdx].duration(options.duration).run();\n                    }\n                }\n                for (var effectName in options.effects) {\n                    extend(end, options.effects[effectName].properties);\n                }\n                if (!element.is(':visible')) {\n                    extend(start, { display: element.data('olddisplay') || 'block' });\n                }\n                if (transforms && !options.reset) {\n                    target = element.data('targetTransform');\n                    if (target) {\n                        start = extend(target, start);\n                    }\n                }\n                start = normalizeCSS(element, start);\n                if (transforms && !transitions) {\n                    start = strip3DTransforms(start);\n                }\n                element.css(start).css(TRANSFORM);\n                for (idx = 0; idx < length; idx++) {\n                    effects[idx].setup();\n                }\n                if (options.init) {\n                    options.init();\n                }\n                element.data('targetTransform', end);\n                fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\n                return deferred.promise();\n            },\n            stop: function () {\n                $(this.element).kendoStop(true, true);\n            },\n            addRestoreProperties: function (restore) {\n                var element = this.element, value, i = 0, length = restore.length;\n                for (; i < length; i++) {\n                    value = restore[i];\n                    this.restore.push(value);\n                    if (!element.data(value)) {\n                        element.data(value, element.css(value));\n                    }\n                }\n            },\n            restoreCallback: function () {\n                var element = this.element;\n                for (var i = 0, length = this.restore.length; i < length; i++) {\n                    var value = this.restore[i];\n                    element.css(value, element.data(value));\n                }\n            },\n            complete: function () {\n                var that = this, idx = 0, element = that.element, options = that.options, effects = that.effects, length = effects.length;\n                element.removeData('animating').dequeue();\n                if (options.hide) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                this.restoreCallback();\n                if (hasZoom && !transforms) {\n                    setTimeout($.proxy(this, 'restoreCallback'), 0);\n                }\n                for (; idx < length; idx++) {\n                    effects[idx].teardown();\n                }\n                if (options.completeCallback) {\n                    options.completeCallback(element);\n                }\n            }\n        });\n        fx.promise = function (element, options) {\n            var effects = [], effectClass, effectSet = new EffectSet(element, options), parsedEffects = kendo.parseEffects(options.effects), effect;\n            options.effects = parsedEffects;\n            for (var effectName in parsedEffects) {\n                effectClass = fx[capitalize(effectName)];\n                if (effectClass) {\n                    effect = new effectClass(element, parsedEffects[effectName].direction);\n                    effects.push(effect);\n                }\n            }\n            if (effects[0]) {\n                effectSet.run(effects);\n            } else {\n                if (!element.is(':visible')) {\n                    element.css({ display: element.data('olddisplay') || 'block' }).css('display');\n                }\n                if (options.init) {\n                    options.init();\n                }\n                element.dequeue();\n                effectSet.complete();\n            }\n        };\n        extend(fx, {\n            animate: function (elements, properties, options) {\n                var useTransition = options.transition !== false;\n                delete options.transition;\n                if (transitions && 'transition' in fx && useTransition) {\n                    fx.transition(elements, properties, options);\n                } else {\n                    if (transforms) {\n                        elements.animate(strip3DTransforms(properties), {\n                            queue: false,\n                            show: false,\n                            hide: false,\n                            duration: options.duration,\n                            complete: options.complete\n                        });\n                    } else {\n                        elements.each(function () {\n                            var element = $(this), multiple = {};\n                            each(transformProps, function (idx, value) {\n                                var params, currentValue = properties ? properties[value] + ' ' : null;\n                                if (currentValue) {\n                                    var single = properties;\n                                    if (value in scaleProperties && properties[value] !== undefined) {\n                                        params = currentValue.match(cssParamsRegExp);\n                                        if (transforms) {\n                                            extend(single, { scale: +params[0] });\n                                        }\n                                    } else {\n                                        if (value in translateProperties && properties[value] !== undefined) {\n                                            var position = element.css(POSITION), isFixed = position == 'absolute' || position == 'fixed';\n                                            if (!element.data(TRANSLATE)) {\n                                                if (isFixed) {\n                                                    element.data(TRANSLATE, {\n                                                        top: parseCSS(element, 'top') || 0,\n                                                        left: parseCSS(element, 'left') || 0,\n                                                        bottom: parseCSS(element, 'bottom'),\n                                                        right: parseCSS(element, 'right')\n                                                    });\n                                                } else {\n                                                    element.data(TRANSLATE, {\n                                                        top: parseCSS(element, 'marginTop') || 0,\n                                                        left: parseCSS(element, 'marginLeft') || 0\n                                                    });\n                                                }\n                                            }\n                                            var originalPosition = element.data(TRANSLATE);\n                                            params = currentValue.match(cssParamsRegExp);\n                                            if (params) {\n                                                var dX = value == TRANSLATE + 'y' ? +null : +params[1], dY = value == TRANSLATE + 'y' ? +params[1] : +params[2];\n                                                if (isFixed) {\n                                                    if (!isNaN(originalPosition.right)) {\n                                                        if (!isNaN(dX)) {\n                                                            extend(single, { right: originalPosition.right - dX });\n                                                        }\n                                                    } else {\n                                                        if (!isNaN(dX)) {\n                                                            extend(single, { left: originalPosition.left + dX });\n                                                        }\n                                                    }\n                                                    if (!isNaN(originalPosition.bottom)) {\n                                                        if (!isNaN(dY)) {\n                                                            extend(single, { bottom: originalPosition.bottom - dY });\n                                                        }\n                                                    } else {\n                                                        if (!isNaN(dY)) {\n                                                            extend(single, { top: originalPosition.top + dY });\n                                                        }\n                                                    }\n                                                } else {\n                                                    if (!isNaN(dX)) {\n                                                        extend(single, { marginLeft: originalPosition.left + dX });\n                                                    }\n                                                    if (!isNaN(dY)) {\n                                                        extend(single, { marginTop: originalPosition.top + dY });\n                                                    }\n                                                }\n                                            }\n                                        }\n                                    }\n                                    if (!transforms && value != 'scale' && value in single) {\n                                        delete single[value];\n                                    }\n                                    if (single) {\n                                        extend(multiple, single);\n                                    }\n                                }\n                            });\n                            if (browser.msie) {\n                                delete multiple.scale;\n                            }\n                            element.animate(multiple, {\n                                queue: false,\n                                show: false,\n                                hide: false,\n                                duration: options.duration,\n                                complete: options.complete\n                            });\n                        });\n                    }\n                }\n            }\n        });\n        fx.animatedPromise = fx.promise;\n        var Effect = kendo.Class.extend({\n            init: function (element, direction) {\n                var that = this;\n                that.element = element;\n                that._direction = direction;\n                that.options = {};\n                that._additionalEffects = [];\n                if (!that.restore) {\n                    that.restore = [];\n                }\n            },\n            reverse: function () {\n                this._reverse = true;\n                return this.run();\n            },\n            play: function () {\n                this._reverse = false;\n                return this.run();\n            },\n            add: function (additional) {\n                this._additionalEffects.push(additional);\n                return this;\n            },\n            direction: function (value) {\n                this._direction = value;\n                return this;\n            },\n            duration: function (duration) {\n                this._duration = duration;\n                return this;\n            },\n            compositeRun: function () {\n                var that = this, effectSet = new EffectSet(that.element, {\n                        reverse: that._reverse,\n                        duration: that._duration\n                    }), effects = that._additionalEffects.concat([that]);\n                return effectSet.run(effects);\n            },\n            run: function () {\n                if (this._additionalEffects && this._additionalEffects[0]) {\n                    return this.compositeRun();\n                }\n                var that = this, element = that.element, idx = 0, restore = that.restore, length = restore.length, value, deferred = $.Deferred(), start = {}, end = {}, target, children = that.children(), childrenLength = children.length;\n                deferred.done($.proxy(that, '_complete'));\n                element.data('animating', true);\n                for (idx = 0; idx < length; idx++) {\n                    value = restore[idx];\n                    if (!element.data(value)) {\n                        element.data(value, element.css(value));\n                    }\n                }\n                for (idx = 0; idx < childrenLength; idx++) {\n                    children[idx].duration(that._duration).run();\n                }\n                that.prepare(start, end);\n                if (!element.is(':visible')) {\n                    extend(start, { display: element.data('olddisplay') || 'block' });\n                }\n                if (transforms) {\n                    target = element.data('targetTransform');\n                    if (target) {\n                        start = extend(target, start);\n                    }\n                }\n                start = normalizeCSS(element, start);\n                if (transforms && !transitions) {\n                    start = strip3DTransforms(start);\n                }\n                element.css(start).css(TRANSFORM);\n                that.setup();\n                element.data('targetTransform', end);\n                fx.animate(element, end, {\n                    duration: that._duration,\n                    complete: deferred.resolve\n                });\n                return deferred.promise();\n            },\n            stop: function () {\n                var idx = 0, children = this.children(), childrenLength = children.length;\n                for (idx = 0; idx < childrenLength; idx++) {\n                    children[idx].stop();\n                }\n                $(this.element).kendoStop(true, true);\n                return this;\n            },\n            restoreCallback: function () {\n                var element = this.element;\n                for (var i = 0, length = this.restore.length; i < length; i++) {\n                    var value = this.restore[i];\n                    element.css(value, element.data(value));\n                }\n            },\n            _complete: function () {\n                var that = this, element = that.element;\n                element.removeData('animating').dequeue();\n                that.restoreCallback();\n                if (that.shouldHide()) {\n                    element.data('olddisplay', element.css('display')).hide();\n                }\n                if (hasZoom && !transforms) {\n                    setTimeout($.proxy(that, 'restoreCallback'), 0);\n                }\n                that.teardown();\n            },\n            setOptions: function (options) {\n                extend(true, this.options, options);\n            },\n            children: function () {\n                return [];\n            },\n            shouldHide: $.noop,\n            setup: $.noop,\n            prepare: $.noop,\n            teardown: $.noop,\n            directions: [],\n            setReverse: function (reverse) {\n                this._reverse = reverse;\n                return this;\n            }\n        });\n        function capitalize(word) {\n            return word.charAt(0).toUpperCase() + word.substring(1);\n        }\n        function createEffect(name, definition) {\n            var effectClass = Effect.extend(definition), directions = effectClass.prototype.directions;\n            fx[capitalize(name)] = effectClass;\n            fx.Element.prototype[name] = function (direction, opt1, opt2, opt3) {\n                return new effectClass(this.element, direction, opt1, opt2, opt3);\n            };\n            each(directions, function (idx, theDirection) {\n                fx.Element.prototype[name + capitalize(theDirection)] = function (opt1, opt2, opt3) {\n                    return new effectClass(this.element, theDirection, opt1, opt2, opt3);\n                };\n            });\n        }\n        var FOUR_DIRECTIONS = [\n                'left',\n                'right',\n                'up',\n                'down'\n            ], IN_OUT = [\n                'in',\n                'out'\n            ];\n        createEffect('slideIn', {\n            directions: FOUR_DIRECTIONS,\n            divisor: function (value) {\n                this.options.divisor = value;\n                return this;\n            },\n            prepare: function (start, end) {\n                var that = this, tmp, element = that.element, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, direction = directions[that._direction], offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)), startValue = offset / (that.options && that.options.divisor || 1) + PX, endValue = '0px';\n                if (that._reverse) {\n                    tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                if (transforms) {\n                    start[direction.transition] = startValue;\n                    end[direction.transition] = endValue;\n                } else {\n                    start[direction.property] = startValue;\n                    end[direction.property] = endValue;\n                }\n            }\n        });\n        createEffect('tile', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, previous) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = { previous: previous };\n            },\n            previousDivisor: function (value) {\n                this.options.previousDivisor = value;\n                return this;\n            },\n            children: function () {\n                var that = this, reverse = that._reverse, previous = that.options.previous, divisor = that.options.previousDivisor || 1, dir = that._direction;\n                var children = [kendo.fx(that.element).slideIn(dir).setReverse(reverse)];\n                if (previous) {\n                    children.push(kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse));\n                }\n                return children;\n            }\n        });\n        function createToggleEffect(name, property, defaultStart, defaultEnd) {\n            createEffect(name, {\n                directions: IN_OUT,\n                startValue: function (value) {\n                    this._startValue = value;\n                    return this;\n                },\n                endValue: function (value) {\n                    this._endValue = value;\n                    return this;\n                },\n                shouldHide: function () {\n                    return this._shouldHide;\n                },\n                prepare: function (start, end) {\n                    var that = this, startValue, endValue, out = this._direction === 'out', startDataValue = that.element.data(property), startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\n                    if (startDataValueIsSet) {\n                        startValue = startDataValue;\n                    } else if (typeof this._startValue !== 'undefined') {\n                        startValue = this._startValue;\n                    } else {\n                        startValue = out ? defaultStart : defaultEnd;\n                    }\n                    if (typeof this._endValue !== 'undefined') {\n                        endValue = this._endValue;\n                    } else {\n                        endValue = out ? defaultEnd : defaultStart;\n                    }\n                    if (this._reverse) {\n                        start[property] = endValue;\n                        end[property] = startValue;\n                    } else {\n                        start[property] = startValue;\n                        end[property] = endValue;\n                    }\n                    that._shouldHide = end[property] === defaultEnd;\n                }\n            });\n        }\n        createToggleEffect('fade', 'opacity', 1, 0);\n        createToggleEffect('zoom', 'scale', 1, 0.01);\n        createEffect('slideMargin', {\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, origin = element.data(ORIGIN), offset = options.offset, margin, reverse = that._reverse;\n                if (!reverse && origin === null) {\n                    element.data(ORIGIN, parseFloat(element.css('margin-' + options.axis)));\n                }\n                margin = element.data(ORIGIN) || 0;\n                end['margin-' + options.axis] = !reverse ? margin + offset : margin;\n            }\n        });\n        createEffect('slideTo', {\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, offset = options.offset.split(','), reverse = that._reverse;\n                if (transforms) {\n                    end.translatex = !reverse ? offset[0] : 0;\n                    end.translatey = !reverse ? offset[1] : 0;\n                } else {\n                    end.left = !reverse ? offset[0] : 0;\n                    end.top = !reverse ? offset[1] : 0;\n                }\n                element.css('left');\n            }\n        });\n        createEffect('expand', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            restore: [OVERFLOW],\n            prepare: function (start, end) {\n                var that = this, element = that.element, options = that.options, reverse = that._reverse, property = that._direction === 'vertical' ? HEIGHT : WIDTH, setLength = element[0].style[property], oldLength = element.data(property), length = parseFloat(oldLength || setLength), realLength = round(element.css(property, AUTO)[property]());\n                start.overflow = HIDDEN;\n                length = options && options.reset ? realLength || length : length || realLength;\n                end[property] = (reverse ? 0 : length) + PX;\n                start[property] = (reverse ? length : 0) + PX;\n                if (oldLength === undefined) {\n                    element.data(property, setLength);\n                }\n            },\n            shouldHide: function () {\n                return this._reverse;\n            },\n            teardown: function () {\n                var that = this, element = that.element, property = that._direction === 'vertical' ? HEIGHT : WIDTH, length = element.data(property);\n                if (length == AUTO || length === BLANK) {\n                    setTimeout(function () {\n                        element.css(property, AUTO).css(property);\n                    }, 0);\n                }\n            }\n        });\n        var TRANSFER_START_STATE = {\n            position: 'absolute',\n            marginLeft: 0,\n            marginTop: 0,\n            scale: 1\n        };\n        createEffect('transfer', {\n            init: function (element, target) {\n                this.element = element;\n                this.options = { target: target };\n                this.restore = [];\n            },\n            setup: function () {\n                this.element.appendTo(document.body);\n            },\n            prepare: function (start, end) {\n                var that = this, element = that.element, outerBox = fx.box(element), innerBox = fx.box(that.options.target), currentScale = animationProperty(element, 'scale'), scale = fx.fillScale(innerBox, outerBox), transformOrigin = fx.transformOrigin(innerBox, outerBox);\n                extend(start, TRANSFER_START_STATE);\n                end.scale = 1;\n                element.css(TRANSFORM, 'scale(1)').css(TRANSFORM);\n                element.css(TRANSFORM, 'scale(' + currentScale + ')');\n                start.top = outerBox.top;\n                start.left = outerBox.left;\n                start.transformOrigin = transformOrigin.x + PX + ' ' + transformOrigin.y + PX;\n                if (that._reverse) {\n                    start.scale = scale;\n                } else {\n                    end.scale = scale;\n                }\n            }\n        });\n        var CLIPS = {\n            top: 'rect(auto auto $size auto)',\n            bottom: 'rect($size auto auto auto)',\n            left: 'rect(auto $size auto auto)',\n            right: 'rect(auto auto auto $size)'\n        };\n        var ROTATIONS = {\n            top: {\n                start: 'rotatex(0deg)',\n                end: 'rotatex(180deg)'\n            },\n            bottom: {\n                start: 'rotatex(-180deg)',\n                end: 'rotatex(0deg)'\n            },\n            left: {\n                start: 'rotatey(0deg)',\n                end: 'rotatey(-180deg)'\n            },\n            right: {\n                start: 'rotatey(180deg)',\n                end: 'rotatey(0deg)'\n            }\n        };\n        function clipInHalf(container, direction) {\n            var vertical = kendo.directions[direction].vertical, size = container[vertical ? HEIGHT : WIDTH]() / 2 + 'px';\n            return CLIPS[direction].replace('$size', size);\n        }\n        createEffect('turningPage', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, container) {\n                Effect.prototype.init.call(this, element, direction);\n                this._container = container;\n            },\n            prepare: function (start, end) {\n                var that = this, reverse = that._reverse, direction = reverse ? directions[that._direction].reverse : that._direction, rotation = ROTATIONS[direction];\n                start.zIndex = 1;\n                if (that._clipInHalf) {\n                    start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\n                }\n                start[BACKFACE] = HIDDEN;\n                end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\n                start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\n            },\n            setup: function () {\n                this._container.append(this.element);\n            },\n            face: function (value) {\n                this._face = value;\n                return this;\n            },\n            shouldHide: function () {\n                var that = this, reverse = that._reverse, face = that._face;\n                return reverse && !face || !reverse && face;\n            },\n            clipInHalf: function (value) {\n                this._clipInHalf = value;\n                return this;\n            },\n            temporary: function () {\n                this.element.addClass('temp-page');\n                return this;\n            }\n        });\n        createEffect('staticPage', {\n            directions: FOUR_DIRECTIONS,\n            init: function (element, direction, container) {\n                Effect.prototype.init.call(this, element, direction);\n                this._container = container;\n            },\n            restore: ['clip'],\n            prepare: function (start, end) {\n                var that = this, direction = that._reverse ? directions[that._direction].reverse : that._direction;\n                start.clip = clipInHalf(that._container, direction);\n                start.opacity = 0.999;\n                end.opacity = 1;\n            },\n            shouldHide: function () {\n                var that = this, reverse = that._reverse, face = that._face;\n                return reverse && !face || !reverse && face;\n            },\n            face: function (value) {\n                this._face = value;\n                return this;\n            }\n        });\n        createEffect('pageturn', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            init: function (element, direction, face, back) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = {};\n                this.options.face = face;\n                this.options.back = back;\n            },\n            children: function () {\n                var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, faceClone = options.face.clone(true).removeAttr('id'), backClone = options.back.clone(true).removeAttr('id'), element = that.element;\n                if (reverse) {\n                    temp = direction;\n                    direction = reverseDirection;\n                    reverseDirection = temp;\n                }\n                return [\n                    kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\n                    kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\n                    kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\n                    kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\n                ];\n            },\n            prepare: function (start, end) {\n                start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n                start.transformStyle = 'preserve-3d';\n                start.opacity = 0.999;\n                end.opacity = 1;\n            },\n            teardown: function () {\n                this.element.find('.temp-page').remove();\n            }\n        });\n        createEffect('flip', {\n            directions: [\n                'horizontal',\n                'vertical'\n            ],\n            init: function (element, direction, face, back) {\n                Effect.prototype.init.call(this, element, direction);\n                this.options = {};\n                this.options.face = face;\n                this.options.back = back;\n            },\n            children: function () {\n                var that = this, options = that.options, direction = that._direction === 'horizontal' ? 'left' : 'top', reverseDirection = kendo.directions[direction].reverse, reverse = that._reverse, temp, element = that.element;\n                if (reverse) {\n                    temp = direction;\n                    direction = reverseDirection;\n                    reverseDirection = temp;\n                }\n                return [\n                    kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\n                    kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\n                ];\n            },\n            prepare: function (start) {\n                start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n                start.transformStyle = 'preserve-3d';\n            }\n        });\n        var RESTORE_OVERFLOW = !support.mobileOS.android;\n        var IGNORE_TRANSITION_EVENT_SELECTOR = '.km-touch-scrollbar, .km-actionsheet-wrapper';\n        createEffect('replace', {\n            _before: $.noop,\n            _after: $.noop,\n            init: function (element, previous, transitionClass) {\n                Effect.prototype.init.call(this, element);\n                this._previous = $(previous);\n                this._transitionClass = transitionClass;\n            },\n            duration: function () {\n                throw new Error('The replace effect does not support duration setting; the effect duration may be customized through the transition class rule');\n            },\n            beforeTransition: function (callback) {\n                this._before = callback;\n                return this;\n            },\n            afterTransition: function (callback) {\n                this._after = callback;\n                return this;\n            },\n            _both: function () {\n                return $().add(this._element).add(this._previous);\n            },\n            _containerClass: function () {\n                var direction = this._direction, containerClass = 'k-fx k-fx-start k-fx-' + this._transitionClass;\n                if (direction) {\n                    containerClass += ' k-fx-' + direction;\n                }\n                if (this._reverse) {\n                    containerClass += ' k-fx-reverse';\n                }\n                return containerClass;\n            },\n            complete: function (e) {\n                if (!this.deferred || e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR)) {\n                    return;\n                }\n                var container = this.container;\n                container.removeClass('k-fx-end').removeClass(this._containerClass()).off(transitions.event, this.completeProxy);\n                this._previous.hide().removeClass('k-fx-current');\n                this.element.removeClass('k-fx-next');\n                if (RESTORE_OVERFLOW) {\n                    container.css(OVERFLOW, '');\n                }\n                if (!this.isAbsolute) {\n                    this._both().css(POSITION, '');\n                }\n                this.deferred.resolve();\n                delete this.deferred;\n            },\n            run: function () {\n                if (this._additionalEffects && this._additionalEffects[0]) {\n                    return this.compositeRun();\n                }\n                var that = this, element = that.element, previous = that._previous, container = element.parents().filter(previous.parents()).first(), both = that._both(), deferred = $.Deferred(), originalPosition = element.css(POSITION), originalOverflow;\n                if (!container.length) {\n                    container = element.parent();\n                }\n                this.container = container;\n                this.deferred = deferred;\n                this.isAbsolute = originalPosition == 'absolute';\n                if (!this.isAbsolute) {\n                    both.css(POSITION, 'absolute');\n                }\n                if (RESTORE_OVERFLOW) {\n                    originalOverflow = container.css(OVERFLOW);\n                    container.css(OVERFLOW, 'hidden');\n                }\n                if (!transitions) {\n                    this.complete();\n                } else {\n                    element.addClass('k-fx-hidden');\n                    container.addClass(this._containerClass());\n                    this.completeProxy = $.proxy(this, 'complete');\n                    container.on(transitions.event, this.completeProxy);\n                    kendo.animationFrame(function () {\n                        element.removeClass('k-fx-hidden').addClass('k-fx-next');\n                        previous.css('display', '').addClass('k-fx-current');\n                        that._before(previous, element);\n                        kendo.animationFrame(function () {\n                            container.removeClass('k-fx-start').addClass('k-fx-end');\n                            that._after(previous, element);\n                        });\n                    });\n                }\n                return deferred.promise();\n            },\n            stop: function () {\n                this.complete();\n            }\n        });\n        var Animation = kendo.Class.extend({\n            init: function () {\n                var that = this;\n                that._tickProxy = proxy(that._tick, that);\n                that._started = false;\n            },\n            tick: $.noop,\n            done: $.noop,\n            onEnd: $.noop,\n            onCancel: $.noop,\n            start: function () {\n                if (!this.enabled()) {\n                    return;\n                }\n                if (!this.done()) {\n                    this._started = true;\n                    kendo.animationFrame(this._tickProxy);\n                } else {\n                    this.onEnd();\n                }\n            },\n            enabled: function () {\n                return true;\n            },\n            cancel: function () {\n                this._started = false;\n                this.onCancel();\n            },\n            _tick: function () {\n                var that = this;\n                if (!that._started) {\n                    return;\n                }\n                that.tick();\n                if (!that.done()) {\n                    kendo.animationFrame(that._tickProxy);\n                } else {\n                    that._started = false;\n                    that.onEnd();\n                }\n            }\n        });\n        var Transition = Animation.extend({\n            init: function (options) {\n                var that = this;\n                extend(that, options);\n                Animation.fn.init.call(that);\n            },\n            done: function () {\n                return this.timePassed() >= this.duration;\n            },\n            timePassed: function () {\n                return Math.min(this.duration, new Date() - this.startDate);\n            },\n            moveTo: function (options) {\n                var that = this, movable = that.movable;\n                that.initial = movable[that.axis];\n                that.delta = options.location - that.initial;\n                that.duration = typeof options.duration == 'number' ? options.duration : 300;\n                that.tick = that._easeProxy(options.ease);\n                that.startDate = new Date();\n                that.start();\n            },\n            _easeProxy: function (ease) {\n                var that = this;\n                return function () {\n                    that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\n                };\n            }\n        });\n        extend(Transition, {\n            easeOutExpo: function (t, b, c, d) {\n                return t == d ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n            },\n            easeOutBack: function (t, b, c, d, s) {\n                s = 1.70158;\n                return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n            }\n        });\n        fx.Animation = Animation;\n        fx.Transition = Transition;\n        fx.createEffect = createEffect;\n        fx.box = function (element) {\n            element = $(element);\n            var result = element.offset();\n            result.width = kendo._outerWidth(element);\n            result.height = kendo._outerHeight(element);\n            return result;\n        };\n        fx.transformOrigin = function (inner, outer) {\n            var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width), y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\n            return {\n                x: isNaN(x) ? 0 : x,\n                y: isNaN(y) ? 0 : y\n            };\n        };\n        fx.fillScale = function (inner, outer) {\n            return Math.min(inner.width / outer.width, inner.height / outer.height);\n        };\n        fx.fitScale = function (inner, outer) {\n            return Math.max(inner.width / outer.width, inner.height / outer.height);\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.router', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'router',\n        name: 'Router',\n        category: 'framework',\n        description: 'The Router class is responsible for tracking the application state and navigating between the application states.',\n        depends: ['core'],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, CHANGE = 'change', BACK = 'back', SAME = 'same', support = kendo.support, location = window.location, history = window.history, CHECK_URL_INTERVAL = 50, BROKEN_BACK_NAV = kendo.support.browser.msie, hashStrip = /^#*/, document = window.document;\n        function absoluteURL(path, pathPrefix) {\n            if (!pathPrefix) {\n                return path;\n            }\n            if (path + '/' === pathPrefix) {\n                path = pathPrefix;\n            }\n            var regEx = new RegExp('^' + pathPrefix, 'i');\n            if (!regEx.test(path)) {\n                path = pathPrefix + '/' + path;\n            }\n            return location.protocol + '//' + (location.host + '/' + path).replace(/\\/\\/+/g, '/');\n        }\n        function hashDelimiter(bang) {\n            return bang ? '#!' : '#';\n        }\n        function locationHash(hashDelimiter) {\n            var href = location.href;\n            if (hashDelimiter === '#!' && href.indexOf('#') > -1 && href.indexOf('#!') < 0) {\n                return null;\n            }\n            return href.split(hashDelimiter)[1] || '';\n        }\n        function stripRoot(root, url) {\n            if (url.indexOf(root) === 0) {\n                return url.substr(root.length).replace(/\\/\\//g, '/');\n            } else {\n                return url;\n            }\n        }\n        var HistoryAdapter = kendo.Class.extend({\n            back: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.back();\n                    });\n                } else {\n                    history.back();\n                }\n            },\n            forward: function () {\n                if (BROKEN_BACK_NAV) {\n                    setTimeout(function () {\n                        history.forward();\n                    });\n                } else {\n                    history.forward();\n                }\n            },\n            length: function () {\n                return history.length;\n            },\n            replaceLocation: function (url) {\n                location.replace(url);\n            }\n        });\n        var PushStateAdapter = HistoryAdapter.extend({\n            init: function (root) {\n                this.root = root;\n            },\n            navigate: function (to) {\n                history.pushState({}, document.title, absoluteURL(to, this.root));\n            },\n            replace: function (to) {\n                history.replaceState({}, document.title, absoluteURL(to, this.root));\n            },\n            normalize: function (url) {\n                return stripRoot(this.root, url);\n            },\n            current: function () {\n                var current = location.pathname;\n                if (location.search) {\n                    current += location.search;\n                }\n                return stripRoot(this.root, current);\n            },\n            change: function (callback) {\n                $(window).bind('popstate.kendo', callback);\n            },\n            stop: function () {\n                $(window).unbind('popstate.kendo');\n            },\n            normalizeCurrent: function (options) {\n                var fixedUrl, root = options.root, pathname = location.pathname, hash = locationHash(hashDelimiter(options.hashBang));\n                if (root === pathname + '/') {\n                    fixedUrl = root;\n                }\n                if (root === pathname && hash) {\n                    fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n                }\n                if (fixedUrl) {\n                    history.pushState({}, document.title, fixedUrl);\n                }\n            }\n        });\n        function fixHash(url) {\n            return url.replace(/^(#)?/, '#');\n        }\n        function fixBang(url) {\n            return url.replace(/^(#(!)?)?/, '#!');\n        }\n        var HashAdapter = HistoryAdapter.extend({\n            init: function (bang) {\n                this._id = kendo.guid();\n                this.prefix = hashDelimiter(bang);\n                this.fix = bang ? fixBang : fixHash;\n            },\n            navigate: function (to) {\n                location.hash = this.fix(to);\n            },\n            replace: function (to) {\n                this.replaceLocation(this.fix(to));\n            },\n            normalize: function (url) {\n                if (url.indexOf(this.prefix) < 0) {\n                    return url;\n                } else {\n                    return url.split(this.prefix)[1];\n                }\n            },\n            change: function (callback) {\n                if (support.hashChange) {\n                    $(window).on('hashchange.' + this._id, callback);\n                } else {\n                    this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n                }\n            },\n            stop: function () {\n                $(window).off('hashchange.' + this._id);\n                clearInterval(this._interval);\n            },\n            current: function () {\n                return locationHash(this.prefix);\n            },\n            normalizeCurrent: function (options) {\n                var pathname = location.pathname, root = options.root;\n                if (options.pushState && root !== pathname) {\n                    this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n                    return true;\n                }\n                return false;\n            }\n        });\n        var History = kendo.Observable.extend({\n            start: function (options) {\n                options = options || {};\n                this.bind([\n                    CHANGE,\n                    BACK,\n                    SAME\n                ], options);\n                if (this._started) {\n                    return;\n                }\n                this._started = true;\n                options.root = options.root || '/';\n                var adapter = this.createAdapter(options), current;\n                if (adapter.normalizeCurrent(options)) {\n                    return;\n                }\n                current = adapter.current();\n                $.extend(this, {\n                    adapter: adapter,\n                    root: options.root,\n                    historyLength: adapter.length(),\n                    current: current,\n                    locations: [current]\n                });\n                adapter.change($.proxy(this, '_checkUrl'));\n            },\n            createAdapter: function (options) {\n                return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n            },\n            stop: function () {\n                if (!this._started) {\n                    return;\n                }\n                this.adapter.stop();\n                this.unbind(CHANGE);\n                this._started = false;\n            },\n            change: function (callback) {\n                this.bind(CHANGE, callback);\n            },\n            replace: function (to, silent) {\n                this._navigate(to, silent, function (adapter) {\n                    adapter.replace(to);\n                    this.locations[this.locations.length - 1] = this.current;\n                });\n            },\n            navigate: function (to, silent) {\n                if (to === '#:back') {\n                    this.backCalled = true;\n                    this.adapter.back();\n                    return;\n                }\n                this._navigate(to, silent, function (adapter) {\n                    adapter.navigate(to);\n                    this.locations.push(this.current);\n                });\n            },\n            _navigate: function (to, silent, callback) {\n                var adapter = this.adapter;\n                to = adapter.normalize(to);\n                if (this.current === to || this.current === decodeURIComponent(to)) {\n                    this.trigger(SAME);\n                    return;\n                }\n                if (!silent) {\n                    if (this.trigger(CHANGE, {\n                            url: to,\n                            decode: false\n                        })) {\n                        return;\n                    }\n                }\n                this.current = to;\n                callback.call(this, adapter);\n                this.historyLength = adapter.length();\n            },\n            _checkUrl: function () {\n                var adapter = this.adapter, current = adapter.current(), newLength = adapter.length(), navigatingInExisting = this.historyLength === newLength, back = current === this.locations[this.locations.length - 2] && navigatingInExisting, backCalled = this.backCalled, prev = this.current;\n                if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n                    return true;\n                }\n                this.historyLength = newLength;\n                this.backCalled = false;\n                this.current = current;\n                if (back && this.trigger('back', {\n                        url: prev,\n                        to: current\n                    })) {\n                    adapter.forward();\n                    this.current = prev;\n                    return;\n                }\n                if (this.trigger(CHANGE, {\n                        url: current,\n                        backButtonPressed: !backCalled\n                    })) {\n                    if (back) {\n                        adapter.forward();\n                    } else {\n                        adapter.back();\n                        this.historyLength--;\n                    }\n                    this.current = prev;\n                    return;\n                }\n                if (back) {\n                    this.locations.pop();\n                } else {\n                    this.locations.push(current);\n                }\n            }\n        });\n        kendo.History = History;\n        kendo.History.HistoryAdapter = HistoryAdapter;\n        kendo.History.HashAdapter = HashAdapter;\n        kendo.History.PushStateAdapter = PushStateAdapter;\n        kendo.absoluteURL = absoluteURL;\n        kendo.history = new History();\n    }(window.kendo.jQuery));\n    (function () {\n        var kendo = window.kendo, history = kendo.history, Observable = kendo.Observable, INIT = 'init', ROUTE_MISSING = 'routeMissing', CHANGE = 'change', BACK = 'back', SAME = 'same', optionalParam = /\\((.*?)\\)/g, namedParam = /(\\(\\?)?:\\w+/g, splatParam = /\\*\\w+/g, escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n        function namedParamReplace(match, optional) {\n            return optional ? match : '([^/]+)';\n        }\n        function routeToRegExp(route, ignoreCase) {\n            return new RegExp('^' + route.replace(escapeRegExp, '\\\\$&').replace(optionalParam, '(?:$1)?').replace(namedParam, namedParamReplace).replace(splatParam, '(.*?)') + '$', ignoreCase ? 'i' : '');\n        }\n        function stripUrl(url) {\n            return url.replace(/(\\?.*)|(#.*)/g, '');\n        }\n        var Route = kendo.Class.extend({\n            init: function (route, callback, ignoreCase) {\n                if (!(route instanceof RegExp)) {\n                    route = routeToRegExp(route, ignoreCase);\n                }\n                this.route = route;\n                this._callback = callback;\n            },\n            callback: function (url, back, decode) {\n                var params, idx = 0, length, queryStringParams = kendo.parseQueryStringParams(url);\n                queryStringParams._back = back;\n                url = stripUrl(url);\n                params = this.route.exec(url).slice(1);\n                length = params.length;\n                if (decode) {\n                    for (; idx < length; idx++) {\n                        if (typeof params[idx] !== 'undefined') {\n                            params[idx] = decodeURIComponent(params[idx]);\n                        }\n                    }\n                }\n                params.push(queryStringParams);\n                this._callback.apply(null, params);\n            },\n            worksWith: function (url, back, decode) {\n                if (this.route.test(stripUrl(url))) {\n                    this.callback(url, back, decode);\n                    return true;\n                } else {\n                    return false;\n                }\n            }\n        });\n        var Router = Observable.extend({\n            init: function (options) {\n                if (!options) {\n                    options = {};\n                }\n                Observable.fn.init.call(this);\n                this.routes = [];\n                this.pushState = options.pushState;\n                this.hashBang = options.hashBang;\n                this.root = options.root;\n                this.ignoreCase = options.ignoreCase !== false;\n                this.bind([\n                    INIT,\n                    ROUTE_MISSING,\n                    CHANGE,\n                    SAME,\n                    BACK\n                ], options);\n            },\n            destroy: function () {\n                history.unbind(CHANGE, this._urlChangedProxy);\n                history.unbind(SAME, this._sameProxy);\n                history.unbind(BACK, this._backProxy);\n                this.unbind();\n            },\n            start: function () {\n                var that = this, sameProxy = function () {\n                        that._same();\n                    }, backProxy = function (e) {\n                        that._back(e);\n                    }, urlChangedProxy = function (e) {\n                        that._urlChanged(e);\n                    };\n                history.start({\n                    same: sameProxy,\n                    change: urlChangedProxy,\n                    back: backProxy,\n                    pushState: that.pushState,\n                    hashBang: that.hashBang,\n                    root: that.root\n                });\n                var initEventObject = {\n                    url: history.current || '/',\n                    preventDefault: $.noop\n                };\n                if (!that.trigger(INIT, initEventObject)) {\n                    that._urlChanged(initEventObject);\n                }\n                this._urlChangedProxy = urlChangedProxy;\n                this._backProxy = backProxy;\n            },\n            route: function (route, callback) {\n                this.routes.push(new Route(route, callback, this.ignoreCase));\n            },\n            navigate: function (url, silent) {\n                kendo.history.navigate(url, silent);\n            },\n            replace: function (url, silent) {\n                kendo.history.replace(url, silent);\n            },\n            _back: function (e) {\n                if (this.trigger(BACK, {\n                        url: e.url,\n                        to: e.to\n                    })) {\n                    e.preventDefault();\n                }\n            },\n            _same: function () {\n                this.trigger(SAME);\n            },\n            _urlChanged: function (e) {\n                var url = e.url;\n                var decode = !!e.decode;\n                var back = e.backButtonPressed;\n                if (!url) {\n                    url = '/';\n                }\n                if (this.trigger(CHANGE, {\n                        url: e.url,\n                        params: kendo.parseQueryStringParams(e.url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                    return;\n                }\n                var idx = 0, routes = this.routes, route, length = routes.length;\n                for (; idx < length; idx++) {\n                    route = routes[idx];\n                    if (route.worksWith(url, back, decode)) {\n                        return;\n                    }\n                }\n                if (this.trigger(ROUTE_MISSING, {\n                        url: url,\n                        params: kendo.parseQueryStringParams(url),\n                        backButtonPressed: back\n                    })) {\n                    e.preventDefault();\n                }\n            }\n        });\n        kendo.Router = Router;\n    }());\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.odata', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.odata',\n        name: 'OData',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, NEWLINE = '\\r\\n', DOUBLELINE = '\\r\\n\\r\\n', isFunction = kendo.isFunction, odataFilters = {\n                eq: 'eq',\n                neq: 'ne',\n                gt: 'gt',\n                gte: 'ge',\n                lt: 'lt',\n                lte: 'le',\n                contains: 'substringof',\n                doesnotcontain: 'substringof',\n                endswith: 'endswith',\n                startswith: 'startswith',\n                isnull: 'eq',\n                isnotnull: 'ne',\n                isnullorempty: 'eq',\n                isnotnullorempty: 'ne',\n                isempty: 'eq',\n                isnotempty: 'ne'\n            }, odataFiltersVersionFour = extend({}, odataFilters, { contains: 'contains' }), mappers = {\n                pageSize: $.noop,\n                page: $.noop,\n                filter: function (params, filter, useVersionFour) {\n                    if (filter) {\n                        filter = toOdataFilter(filter, useVersionFour);\n                        if (filter) {\n                            params.$filter = filter;\n                        }\n                    }\n                },\n                sort: function (params, orderby) {\n                    var expr = $.map(orderby, function (value) {\n                        var order = value.field.replace(/\\./g, '/');\n                        if (value.dir === 'desc') {\n                            order += ' desc';\n                        }\n                        return order;\n                    }).join(',');\n                    if (expr) {\n                        params.$orderby = expr;\n                    }\n                },\n                skip: function (params, skip) {\n                    if (skip) {\n                        params.$skip = skip;\n                    }\n                },\n                take: function (params, take) {\n                    if (take) {\n                        params.$top = take;\n                    }\n                }\n            }, defaultDataType = { read: { dataType: 'jsonp' } };\n        function toOdataFilter(filter, useOdataFour) {\n            var result = [], logic = filter.logic || 'and', idx, length, field, type, format, operator, value, ignoreCase, filters = filter.filters;\n            for (idx = 0, length = filters.length; idx < length; idx++) {\n                filter = filters[idx];\n                field = filter.field;\n                value = filter.value;\n                operator = filter.operator;\n                if (filter.filters) {\n                    filter = toOdataFilter(filter, useOdataFour);\n                } else {\n                    ignoreCase = filter.ignoreCase;\n                    field = field.replace(/\\./g, '/');\n                    filter = odataFilters[operator];\n                    if (useOdataFour) {\n                        filter = odataFiltersVersionFour[operator];\n                    }\n                    if (operator === 'isnullorempty') {\n                        filter = kendo.format('{0} {1} null or {0} {1} \\'\\'', field, filter);\n                    } else if (operator === 'isnotnullorempty') {\n                        filter = kendo.format('{0} {1} null and {0} {1} \\'\\'', field, filter);\n                    } else if (operator === 'isnull' || operator === 'isnotnull') {\n                        filter = kendo.format('{0} {1} null', field, filter);\n                    } else if (operator === 'isempty' || operator === 'isnotempty') {\n                        filter = kendo.format('{0} {1} \\'\\'', field, filter);\n                    } else if (filter && value !== undefined) {\n                        type = $.type(value);\n                        if (type === 'string') {\n                            format = '\\'{1}\\'';\n                            value = value.replace(/'/g, '\\'\\'');\n                            if (ignoreCase === true) {\n                                field = 'tolower(' + field + ')';\n                            }\n                        } else if (type === 'date') {\n                            if (useOdataFour) {\n                                format = '{1:yyyy-MM-ddTHH:mm:ss+00:00}';\n                                value = kendo.timezone.apply(value, 'Etc/UTC');\n                            } else {\n                                format = 'datetime\\'{1:yyyy-MM-ddTHH:mm:ss}\\'';\n                            }\n                        } else {\n                            format = '{1}';\n                        }\n                        if (filter.length > 3) {\n                            if (filter !== 'substringof') {\n                                format = '{0}({2},' + format + ')';\n                            } else {\n                                format = '{0}(' + format + ',{2})';\n                                if (operator === 'doesnotcontain') {\n                                    if (useOdataFour) {\n                                        format = '{0}({2},\\'{1}\\') eq -1';\n                                        filter = 'indexof';\n                                    } else {\n                                        format += ' eq false';\n                                    }\n                                }\n                            }\n                        } else {\n                            format = '{2} {0} ' + format;\n                        }\n                        filter = kendo.format(format, filter, value, field);\n                    }\n                }\n                result.push(filter);\n            }\n            filter = result.join(' ' + logic + ' ');\n            if (result.length > 1) {\n                filter = '(' + filter + ')';\n            }\n            return filter;\n        }\n        function stripMetadata(obj) {\n            for (var name in obj) {\n                if (name.indexOf('@odata') === 0) {\n                    delete obj[name];\n                }\n            }\n        }\n        function hex16() {\n            return Math.floor((1 + Math.random()) * 65536).toString(16).substr(1);\n        }\n        function createBoundary(prefix) {\n            return prefix + hex16() + '-' + hex16() + '-' + hex16();\n        }\n        function createDelimeter(boundary, close) {\n            var result = NEWLINE + '--' + boundary;\n            if (close) {\n                result += '--';\n            }\n            return result;\n        }\n        function createCommand(transport, item, httpVerb, command) {\n            var transportUrl = transport.options[command].url;\n            var commandPrefix = kendo.format('{0} ', httpVerb);\n            if (isFunction(transportUrl)) {\n                return commandPrefix + transportUrl(item);\n            } else {\n                return commandPrefix + transportUrl;\n            }\n        }\n        function getOperationHeader(changeset, changeId) {\n            var header = '';\n            header += createDelimeter(changeset, false);\n            header += NEWLINE + 'Content-Type: application/http';\n            header += NEWLINE + 'Content-Transfer-Encoding: binary';\n            header += NEWLINE + 'Content-ID: ' + changeId;\n            return header;\n        }\n        function getOperationContent(item) {\n            var content = '';\n            content += NEWLINE + 'Content-Type: application/json;odata=minimalmetadata';\n            content += NEWLINE + 'Prefer: return=representation';\n            content += DOUBLELINE + kendo.stringify(item);\n            return content;\n        }\n        function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n            var requestBody = '';\n            for (var i = 0; i < collection.length; i++) {\n                requestBody += getOperationHeader(changeset, changeId);\n                requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n                if (!skipContent) {\n                    requestBody += getOperationContent(collection[i]);\n                }\n                requestBody += NEWLINE;\n                changeId++;\n            }\n            return requestBody;\n        }\n        function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n            var requestBody = '';\n            requestBody += getBoundary(boundary, changeset);\n            requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n            requestBody += createDelimeter(changeset, true);\n            requestBody += NEWLINE;\n            return requestBody;\n        }\n        function getBoundary(boundary, changeset) {\n            var requestBody = '';\n            requestBody += '--' + boundary + NEWLINE;\n            requestBody += 'Content-Type: multipart/mixed; boundary=' + changeset + NEWLINE;\n            return requestBody;\n        }\n        function createBatchRequest(transport, colections) {\n            var options = {};\n            var boundary = createBoundary('sf_batch_');\n            var requestBody = '';\n            var changeId = 0;\n            var batchURL = transport.options.batch.url;\n            var changeset = createBoundary('sf_changeset_');\n            options.type = transport.options.batch.type;\n            options.url = isFunction(batchURL) ? batchURL() : batchURL;\n            options.headers = { 'Content-Type': 'multipart/mixed; boundary=' + boundary };\n            if (colections.updated.length) {\n                requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, 'update', false);\n                changeId += colections.updated.length;\n                changeset = createBoundary('sf_changeset_');\n            }\n            if (colections.destroyed.length) {\n                requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, 'destroy', true);\n                changeId += colections.destroyed.length;\n                changeset = createBoundary('sf_changeset_');\n            }\n            if (colections.created.length) {\n                requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, 'create', false);\n            }\n            requestBody += createDelimeter(boundary, true);\n            options.data = requestBody;\n            return options;\n        }\n        function parseBatchResponse(responseText) {\n            var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n            var markerIndex = 0;\n            var collections = [];\n            var changeBody;\n            var status;\n            var code;\n            var marker;\n            var jsonModel;\n            collections.push({\n                models: [],\n                passed: true\n            });\n            for (var i = 0; i < responseMarkers.length; i++) {\n                marker = responseMarkers[i];\n                if (marker.lastIndexOf('--', marker.length - 1)) {\n                    if (i < responseMarkers.length - 1) {\n                        collections.push({\n                            models: [],\n                            passed: true\n                        });\n                    }\n                    continue;\n                }\n                if (!markerIndex) {\n                    markerIndex = responseText.indexOf(marker);\n                } else {\n                    markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n                }\n                changeBody = responseText.substring(markerIndex, responseText.indexOf('--', markerIndex + 1));\n                status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n                code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n                if (code >= 200 && code <= 299) {\n                    jsonModel = changeBody.match(/\\{.*\\}/gm);\n                    if (jsonModel) {\n                        collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n                    }\n                } else {\n                    collections[collections.length - 1].passed = false;\n                }\n            }\n            return collections;\n        }\n        extend(true, kendo.data, {\n            schemas: {\n                odata: {\n                    type: 'json',\n                    data: function (data) {\n                        return data.d.results || [data.d];\n                    },\n                    total: 'd.__count'\n                }\n            },\n            transports: {\n                odata: {\n                    read: {\n                        cache: true,\n                        dataType: 'jsonp',\n                        jsonp: '$callback'\n                    },\n                    update: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json',\n                        type: 'PUT'\n                    },\n                    create: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json',\n                        type: 'POST'\n                    },\n                    destroy: {\n                        cache: true,\n                        dataType: 'json',\n                        type: 'DELETE'\n                    },\n                    parameterMap: function (options, type, useVersionFour) {\n                        var params, value, option, dataType;\n                        options = options || {};\n                        type = type || 'read';\n                        dataType = (this.options || defaultDataType)[type];\n                        dataType = dataType ? dataType.dataType : 'json';\n                        if (type === 'read') {\n                            params = { $inlinecount: 'allpages' };\n                            if (dataType != 'json') {\n                                params.$format = 'json';\n                            }\n                            for (option in options) {\n                                if (mappers[option]) {\n                                    mappers[option](params, options[option], useVersionFour);\n                                } else {\n                                    params[option] = options[option];\n                                }\n                            }\n                        } else {\n                            if (dataType !== 'json') {\n                                throw new Error('Only json dataType can be used for ' + type + ' operation.');\n                            }\n                            if (type !== 'destroy') {\n                                for (option in options) {\n                                    value = options[option];\n                                    if (typeof value === 'number') {\n                                        options[option] = value + '';\n                                    }\n                                }\n                                params = kendo.stringify(options);\n                            }\n                        }\n                        return params;\n                    }\n                }\n            }\n        });\n        extend(true, kendo.data, {\n            schemas: {\n                'odata-v4': {\n                    type: 'json',\n                    data: function (data) {\n                        if ($.isArray(data)) {\n                            for (var i = 0; i < data.length; i++) {\n                                stripMetadata(data[i]);\n                            }\n                            return data;\n                        } else {\n                            data = $.extend({}, data);\n                            stripMetadata(data);\n                            if (data.value) {\n                                return data.value;\n                            }\n                            return [data];\n                        }\n                    },\n                    total: function (data) {\n                        return data['@odata.count'];\n                    }\n                }\n            },\n            transports: {\n                'odata-v4': {\n                    batch: { type: 'POST' },\n                    read: {\n                        cache: true,\n                        dataType: 'json'\n                    },\n                    update: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json;IEEE754Compatible=true',\n                        type: 'PUT'\n                    },\n                    create: {\n                        cache: true,\n                        dataType: 'json',\n                        contentType: 'application/json;IEEE754Compatible=true',\n                        type: 'POST'\n                    },\n                    destroy: {\n                        cache: true,\n                        dataType: 'json',\n                        type: 'DELETE'\n                    },\n                    parameterMap: function (options, type) {\n                        var result = kendo.data.transports.odata.parameterMap(options, type, true);\n                        if (type == 'read') {\n                            result.$count = true;\n                            delete result.$inlinecount;\n                        }\n                        return result;\n                    },\n                    submit: function (e) {\n                        var that = this;\n                        var options = createBatchRequest(that, e.data);\n                        var collections = e.data;\n                        if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n                            return;\n                        }\n                        $.ajax(extend(true, {}, {\n                            success: function (response) {\n                                var responses = parseBatchResponse(response);\n                                var index = 0;\n                                var current;\n                                if (collections.updated.length) {\n                                    current = responses[index];\n                                    if (current.passed) {\n                                        e.success(current.models.length ? current.models : [], 'update');\n                                    }\n                                    index++;\n                                }\n                                if (collections.destroyed.length) {\n                                    current = responses[index];\n                                    if (current.passed) {\n                                        e.success([], 'destroy');\n                                    }\n                                    index++;\n                                }\n                                if (collections.created.length) {\n                                    current = responses[index];\n                                    if (current.passed) {\n                                        e.success(current.models, 'create');\n                                    }\n                                }\n                            },\n                            error: function (response, status, error) {\n                                e.error(response, status, error);\n                            }\n                        }, options));\n                    }\n                }\n            }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.xml', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.xml',\n        name: 'XML',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, isArray = $.isArray, isPlainObject = $.isPlainObject, map = $.map, each = $.each, extend = $.extend, getter = kendo.getter, Class = kendo.Class;\n        var XmlDataReader = Class.extend({\n            init: function (options) {\n                var that = this, total = options.total, model = options.model, parse = options.parse, errors = options.errors, serialize = options.serialize, data = options.data;\n                if (model) {\n                    if (isPlainObject(model)) {\n                        var base = options.modelBase || kendo.data.Model;\n                        if (model.fields) {\n                            each(model.fields, function (field, value) {\n                                if (isPlainObject(value) && value.field) {\n                                    if (!$.isFunction(value.field)) {\n                                        value = extend(value, { field: that.getter(value.field) });\n                                    }\n                                } else {\n                                    value = { field: that.getter(value) };\n                                }\n                                model.fields[field] = value;\n                            });\n                        }\n                        var id = model.id;\n                        if (id) {\n                            var idField = {};\n                            idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\n                            model.fields = extend(idField, model.fields);\n                            model.id = that.xpathToMember(id);\n                        }\n                        model = base.define(model);\n                    }\n                    that.model = model;\n                }\n                if (total) {\n                    if (typeof total == 'string') {\n                        total = that.getter(total);\n                        that.total = function (data) {\n                            return parseInt(total(data), 10);\n                        };\n                    } else if (typeof total == 'function') {\n                        that.total = total;\n                    }\n                }\n                if (errors) {\n                    if (typeof errors == 'string') {\n                        errors = that.getter(errors);\n                        that.errors = function (data) {\n                            return errors(data) || null;\n                        };\n                    } else if (typeof errors == 'function') {\n                        that.errors = errors;\n                    }\n                }\n                if (data) {\n                    if (typeof data == 'string') {\n                        data = that.xpathToMember(data);\n                        that.data = function (value) {\n                            var result = that.evaluate(value, data), modelInstance;\n                            result = isArray(result) ? result : [result];\n                            if (that.model && model.fields) {\n                                modelInstance = new that.model();\n                                return map(result, function (value) {\n                                    if (value) {\n                                        var record = {}, field;\n                                        for (field in model.fields) {\n                                            record[field] = modelInstance._parse(field, model.fields[field].field(value));\n                                        }\n                                        return record;\n                                    }\n                                });\n                            }\n                            return result;\n                        };\n                    } else if (typeof data == 'function') {\n                        that.data = data;\n                    }\n                }\n                if (typeof parse == 'function') {\n                    var xmlParse = that.parse;\n                    that.parse = function (data) {\n                        var xml = parse.call(that, data);\n                        return xmlParse.call(that, xml);\n                    };\n                }\n                if (typeof serialize == 'function') {\n                    that.serialize = serialize;\n                }\n            },\n            total: function (result) {\n                return this.data(result).length;\n            },\n            errors: function (data) {\n                return data ? data.errors : null;\n            },\n            serialize: function (data) {\n                return data;\n            },\n            parseDOM: function (element) {\n                var result = {}, parsedNode, node, nodeType, nodeName, member, attribute, attributes = element.attributes, attributeCount = attributes.length, idx;\n                for (idx = 0; idx < attributeCount; idx++) {\n                    attribute = attributes[idx];\n                    result['@' + attribute.nodeName] = attribute.nodeValue;\n                }\n                for (node = element.firstChild; node; node = node.nextSibling) {\n                    nodeType = node.nodeType;\n                    if (nodeType === 3 || nodeType === 4) {\n                        result['#text'] = node.nodeValue;\n                    } else if (nodeType === 1) {\n                        parsedNode = this.parseDOM(node);\n                        nodeName = node.nodeName;\n                        member = result[nodeName];\n                        if (isArray(member)) {\n                            member.push(parsedNode);\n                        } else if (member !== undefined) {\n                            member = [\n                                member,\n                                parsedNode\n                            ];\n                        } else {\n                            member = parsedNode;\n                        }\n                        result[nodeName] = member;\n                    }\n                }\n                return result;\n            },\n            evaluate: function (value, expression) {\n                var members = expression.split('.'), member, result, length, intermediateResult, idx;\n                while (member = members.shift()) {\n                    value = value[member];\n                    if (isArray(value)) {\n                        result = [];\n                        expression = members.join('.');\n                        for (idx = 0, length = value.length; idx < length; idx++) {\n                            intermediateResult = this.evaluate(value[idx], expression);\n                            intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\n                            result.push.apply(result, intermediateResult);\n                        }\n                        return result;\n                    }\n                }\n                return value;\n            },\n            parse: function (xml) {\n                var documentElement, tree, result = {};\n                documentElement = xml.documentElement || $.parseXML(xml).documentElement;\n                tree = this.parseDOM(documentElement);\n                result[documentElement.nodeName] = tree;\n                return result;\n            },\n            xpathToMember: function (member, raw) {\n                if (!member) {\n                    return '';\n                }\n                member = member.replace(/^\\//, '').replace(/\\//g, '.');\n                if (member.indexOf('@') >= 0) {\n                    return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\n                }\n                if (member.indexOf('text()') >= 0) {\n                    return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\n                }\n                return member;\n            },\n            getter: function (member) {\n                return getter(this.xpathToMember(member), true);\n            }\n        });\n        $.extend(true, kendo.data, {\n            XmlDataReader: XmlDataReader,\n            readers: { xml: XmlDataReader }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data', [\n        'kendo.core',\n        'kendo.data.odata',\n        'kendo.data.xml'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'data',\n        name: 'Data source',\n        category: 'framework',\n        description: 'Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.',\n        depends: ['core'],\n        features: [\n            {\n                id: 'data-odata',\n                name: 'OData',\n                description: 'Support for accessing Open Data Protocol (OData) services.',\n                depends: ['data.odata']\n            },\n            {\n                id: 'data-signalr',\n                name: 'SignalR',\n                description: 'Support for binding to SignalR hubs.',\n                depends: ['data.signalr']\n            },\n            {\n                id: 'data-XML',\n                name: 'XML',\n                description: 'Support for binding to XML.',\n                depends: ['data.xml']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var extend = $.extend, proxy = $.proxy, isPlainObject = $.isPlainObject, isEmptyObject = $.isEmptyObject, isArray = $.isArray, grep = $.grep, ajax = $.ajax, map, each = $.each, noop = $.noop, kendo = window.kendo, isFunction = kendo.isFunction, Observable = kendo.Observable, Class = kendo.Class, STRING = 'string', FUNCTION = 'function', ASCENDING = 'asc', CREATE = 'create', READ = 'read', UPDATE = 'update', DESTROY = 'destroy', CHANGE = 'change', SYNC = 'sync', GET = 'get', ERROR = 'error', REQUESTSTART = 'requestStart', PROGRESS = 'progress', REQUESTEND = 'requestEnd', crud = [\n                CREATE,\n                READ,\n                UPDATE,\n                DESTROY\n            ], identity = function (o) {\n                return o;\n            }, getter = kendo.getter, stringify = kendo.stringify, math = Math, push = [].push, join = [].join, pop = [].pop, splice = [].splice, shift = [].shift, slice = [].slice, unshift = [].unshift, toString = {}.toString, stableSort = kendo.support.stableSort, dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\n        var ObservableArray = Observable.extend({\n            init: function (array, type) {\n                var that = this;\n                that.type = type || ObservableObject;\n                Observable.fn.init.call(that);\n                that.length = array.length;\n                that.wrapAll(array, that);\n            },\n            at: function (index) {\n                return this[index];\n            },\n            toJSON: function () {\n                var idx, length = this.length, value, json = new Array(length);\n                for (idx = 0; idx < length; idx++) {\n                    value = this[idx];\n                    if (value instanceof ObservableObject) {\n                        value = value.toJSON();\n                    }\n                    json[idx] = value;\n                }\n                return json;\n            },\n            parent: noop,\n            wrapAll: function (source, target) {\n                var that = this, idx, length, parent = function () {\n                        return that;\n                    };\n                target = target || [];\n                for (idx = 0, length = source.length; idx < length; idx++) {\n                    target[idx] = that.wrap(source[idx], parent);\n                }\n                return target;\n            },\n            wrap: function (object, parent) {\n                var that = this, observable;\n                if (object !== null && toString.call(object) === '[object Object]') {\n                    observable = object instanceof that.type || object instanceof Model;\n                    if (!observable) {\n                        object = object instanceof ObservableObject ? object.toJSON() : object;\n                        object = new that.type(object);\n                    }\n                    object.parent = parent;\n                    object.bind(CHANGE, function (e) {\n                        that.trigger(CHANGE, {\n                            field: e.field,\n                            node: e.node,\n                            index: e.index,\n                            items: e.items || [this],\n                            action: e.node ? e.action || 'itemloaded' : 'itemchange'\n                        });\n                    });\n                }\n                return object;\n            },\n            push: function () {\n                var index = this.length, items = this.wrapAll(arguments), result;\n                result = push.apply(this, items);\n                this.trigger(CHANGE, {\n                    action: 'add',\n                    index: index,\n                    items: items\n                });\n                return result;\n            },\n            slice: slice,\n            sort: [].sort,\n            join: join,\n            pop: function () {\n                var length = this.length, result = pop.apply(this);\n                if (length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: length - 1,\n                        items: [result]\n                    });\n                }\n                return result;\n            },\n            splice: function (index, howMany, item) {\n                var items = this.wrapAll(slice.call(arguments, 2)), result, i, len;\n                result = splice.apply(this, [\n                    index,\n                    howMany\n                ].concat(items));\n                if (result.length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: index,\n                        items: result\n                    });\n                    for (i = 0, len = result.length; i < len; i++) {\n                        if (result[i] && result[i].children) {\n                            result[i].unbind(CHANGE);\n                        }\n                    }\n                }\n                if (item) {\n                    this.trigger(CHANGE, {\n                        action: 'add',\n                        index: index,\n                        items: items\n                    });\n                }\n                return result;\n            },\n            shift: function () {\n                var length = this.length, result = shift.apply(this);\n                if (length) {\n                    this.trigger(CHANGE, {\n                        action: 'remove',\n                        index: 0,\n                        items: [result]\n                    });\n                }\n                return result;\n            },\n            unshift: function () {\n                var items = this.wrapAll(arguments), result;\n                result = unshift.apply(this, items);\n                this.trigger(CHANGE, {\n                    action: 'add',\n                    index: 0,\n                    items: items\n                });\n                return result;\n            },\n            indexOf: function (item) {\n                var that = this, idx, length;\n                for (idx = 0, length = that.length; idx < length; idx++) {\n                    if (that[idx] === item) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            forEach: function (callback, thisArg) {\n                var idx = 0;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    callback.call(context, this[idx], idx, this);\n                }\n            },\n            map: function (callback, thisArg) {\n                var idx = 0;\n                var result = [];\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    result[idx] = callback.call(context, this[idx], idx, this);\n                }\n                return result;\n            },\n            reduce: function (callback) {\n                var idx = 0, result, length = this.length;\n                if (arguments.length == 2) {\n                    result = arguments[1];\n                } else if (idx < length) {\n                    result = this[idx++];\n                }\n                for (; idx < length; idx++) {\n                    result = callback(result, this[idx], idx, this);\n                }\n                return result;\n            },\n            reduceRight: function (callback) {\n                var idx = this.length - 1, result;\n                if (arguments.length == 2) {\n                    result = arguments[1];\n                } else if (idx > 0) {\n                    result = this[idx--];\n                }\n                for (; idx >= 0; idx--) {\n                    result = callback(result, this[idx], idx, this);\n                }\n                return result;\n            },\n            filter: function (callback, thisArg) {\n                var idx = 0;\n                var result = [];\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback.call(context, item, idx, this)) {\n                        result[result.length] = item;\n                    }\n                }\n                return result;\n            },\n            find: function (callback, thisArg) {\n                var idx = 0;\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback.call(context, item, idx, this)) {\n                        return item;\n                    }\n                }\n            },\n            every: function (callback, thisArg) {\n                var idx = 0;\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (!callback.call(context, item, idx, this)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            some: function (callback, thisArg) {\n                var idx = 0;\n                var item;\n                var length = this.length;\n                var context = thisArg || window;\n                for (; idx < length; idx++) {\n                    item = this[idx];\n                    if (callback.call(context, item, idx, this)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            remove: function (item) {\n                var idx = this.indexOf(item);\n                if (idx !== -1) {\n                    this.splice(idx, 1);\n                }\n            },\n            empty: function () {\n                this.splice(0, this.length);\n            }\n        });\n        if (typeof Symbol !== 'undefined' && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n            ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n        }\n        var LazyObservableArray = ObservableArray.extend({\n            init: function (data, type, events) {\n                Observable.fn.init.call(this);\n                this.type = type || ObservableObject;\n                if (events) {\n                    this._events = events;\n                }\n                for (var idx = 0; idx < data.length; idx++) {\n                    this[idx] = data[idx];\n                }\n                this.length = idx;\n                this._parent = proxy(function () {\n                    return this;\n                }, this);\n            },\n            at: function (index) {\n                var item = this[index];\n                if (!(item instanceof this.type)) {\n                    item = this[index] = this.wrap(item, this._parent);\n                } else {\n                    item.parent = this._parent;\n                }\n                return item;\n            }\n        });\n        function eventHandler(context, type, field, prefix) {\n            return function (e) {\n                var event = {}, key;\n                for (key in e) {\n                    event[key] = e[key];\n                }\n                if (prefix) {\n                    event.field = field + '.' + e.field;\n                } else {\n                    event.field = field;\n                }\n                if (type == CHANGE && context._notifyChange) {\n                    context._notifyChange(event);\n                }\n                context.trigger(type, event);\n            };\n        }\n        var ObservableObject = Observable.extend({\n            init: function (value) {\n                var that = this, member, field, parent = function () {\n                        return that;\n                    };\n                Observable.fn.init.call(this);\n                this._handlers = {};\n                for (field in value) {\n                    member = value[field];\n                    if (typeof member === 'object' && member && !member.getTime && field.charAt(0) != '_') {\n                        member = that.wrap(member, field, parent);\n                    }\n                    that[field] = member;\n                }\n                that.uid = kendo.guid();\n            },\n            shouldSerialize: function (field) {\n                return this.hasOwnProperty(field) && field !== '_handlers' && field !== '_events' && typeof this[field] !== FUNCTION && field !== 'uid';\n            },\n            forEach: function (f) {\n                for (var i in this) {\n                    if (this.shouldSerialize(i)) {\n                        f(this[i], i);\n                    }\n                }\n            },\n            toJSON: function () {\n                var result = {}, value, field;\n                for (field in this) {\n                    if (this.shouldSerialize(field)) {\n                        value = this[field];\n                        if (value instanceof ObservableObject || value instanceof ObservableArray) {\n                            value = value.toJSON();\n                        }\n                        result[field] = value;\n                    }\n                }\n                return result;\n            },\n            get: function (field) {\n                var that = this, result;\n                that.trigger(GET, { field: field });\n                if (field === 'this') {\n                    result = that;\n                } else {\n                    result = kendo.getter(field, true)(that);\n                }\n                return result;\n            },\n            _set: function (field, value) {\n                var that = this;\n                var composite = field.indexOf('.') >= 0;\n                if (composite) {\n                    var paths = field.split('.'), path = '';\n                    while (paths.length > 1) {\n                        path += paths.shift();\n                        var obj = kendo.getter(path, true)(that);\n                        if (obj instanceof ObservableObject) {\n                            obj.set(paths.join('.'), value);\n                            return composite;\n                        }\n                        path += '.';\n                    }\n                }\n                kendo.setter(field)(that, value);\n                return composite;\n            },\n            set: function (field, value) {\n                var that = this, isSetPrevented = false, composite = field.indexOf('.') >= 0, current = kendo.getter(field, true)(that);\n                if (current !== value) {\n                    if (current instanceof Observable && this._handlers[field]) {\n                        if (this._handlers[field].get) {\n                            current.unbind(GET, this._handlers[field].get);\n                        }\n                        current.unbind(CHANGE, this._handlers[field].change);\n                    }\n                    isSetPrevented = that.trigger('set', {\n                        field: field,\n                        value: value\n                    });\n                    if (!isSetPrevented) {\n                        if (!composite) {\n                            value = that.wrap(value, field, function () {\n                                return that;\n                            });\n                        }\n                        if (!that._set(field, value) || field.indexOf('(') >= 0 || field.indexOf('[') >= 0) {\n                            that.trigger(CHANGE, { field: field });\n                        }\n                    }\n                }\n                return isSetPrevented;\n            },\n            parent: noop,\n            wrap: function (object, field, parent) {\n                var that = this;\n                var get;\n                var change;\n                var type = toString.call(object);\n                if (object != null && (type === '[object Object]' || type === '[object Array]')) {\n                    var isObservableArray = object instanceof ObservableArray;\n                    var isDataSource = object instanceof DataSource;\n                    if (type === '[object Object]' && !isDataSource && !isObservableArray) {\n                        if (!(object instanceof ObservableObject)) {\n                            object = new ObservableObject(object);\n                        }\n                        get = eventHandler(that, GET, field, true);\n                        object.bind(GET, get);\n                        change = eventHandler(that, CHANGE, field, true);\n                        object.bind(CHANGE, change);\n                        that._handlers[field] = {\n                            get: get,\n                            change: change\n                        };\n                    } else if (type === '[object Array]' || isObservableArray || isDataSource) {\n                        if (!isObservableArray && !isDataSource) {\n                            object = new ObservableArray(object);\n                        }\n                        change = eventHandler(that, CHANGE, field, false);\n                        object.bind(CHANGE, change);\n                        that._handlers[field] = { change: change };\n                    }\n                    object.parent = parent;\n                }\n                return object;\n            }\n        });\n        function equal(x, y) {\n            if (x === y) {\n                return true;\n            }\n            var xtype = $.type(x), ytype = $.type(y), field;\n            if (xtype !== ytype) {\n                return false;\n            }\n            if (xtype === 'date') {\n                return x.getTime() === y.getTime();\n            }\n            if (xtype !== 'object' && xtype !== 'array') {\n                return false;\n            }\n            for (field in x) {\n                if (!equal(x[field], y[field])) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        var parsers = {\n            'number': function (value) {\n                if (typeof value === STRING && value.toLowerCase() === 'null') {\n                    return null;\n                }\n                return kendo.parseFloat(value);\n            },\n            'date': function (value) {\n                if (typeof value === STRING && value.toLowerCase() === 'null') {\n                    return null;\n                }\n                return kendo.parseDate(value);\n            },\n            'boolean': function (value) {\n                if (typeof value === STRING) {\n                    if (value.toLowerCase() === 'null') {\n                        return null;\n                    } else {\n                        return value.toLowerCase() === 'true';\n                    }\n                }\n                return value != null ? !!value : value;\n            },\n            'string': function (value) {\n                if (typeof value === STRING && value.toLowerCase() === 'null') {\n                    return null;\n                }\n                return value != null ? value + '' : value;\n            },\n            'default': function (value) {\n                return value;\n            }\n        };\n        var defaultValues = {\n            'string': '',\n            'number': 0,\n            'date': new Date(),\n            'boolean': false,\n            'default': ''\n        };\n        function getFieldByName(obj, name) {\n            var field, fieldName;\n            for (fieldName in obj) {\n                field = obj[fieldName];\n                if (isPlainObject(field) && field.field && field.field === name) {\n                    return field;\n                } else if (field === name) {\n                    return field;\n                }\n            }\n            return null;\n        }\n        var Model = ObservableObject.extend({\n            init: function (data) {\n                var that = this;\n                if (!data || $.isEmptyObject(data)) {\n                    data = $.extend({}, that.defaults, data);\n                    if (that._initializers) {\n                        for (var idx = 0; idx < that._initializers.length; idx++) {\n                            var name = that._initializers[idx];\n                            data[name] = that.defaults[name]();\n                        }\n                    }\n                }\n                ObservableObject.fn.init.call(that, data);\n                that.dirty = false;\n                that.dirtyFields = {};\n                if (that.idField) {\n                    that.id = that.get(that.idField);\n                    if (that.id === undefined) {\n                        that.id = that._defaultId;\n                    }\n                }\n            },\n            shouldSerialize: function (field) {\n                return ObservableObject.fn.shouldSerialize.call(this, field) && field !== 'uid' && !(this.idField !== 'id' && field === 'id') && field !== 'dirty' && field !== 'dirtyFields' && field !== '_accessors';\n            },\n            _parse: function (field, value) {\n                var that = this, fieldName = field, fields = that.fields || {}, parse;\n                field = fields[field];\n                if (!field) {\n                    field = getFieldByName(fields, fieldName);\n                }\n                if (field) {\n                    parse = field.parse;\n                    if (!parse && field.type) {\n                        parse = parsers[field.type.toLowerCase()];\n                    }\n                }\n                return parse ? parse(value) : value;\n            },\n            _notifyChange: function (e) {\n                var action = e.action;\n                if (action == 'add' || action == 'remove') {\n                    this.dirty = true;\n                    this.dirtyFields[e.field] = true;\n                }\n            },\n            editable: function (field) {\n                field = (this.fields || {})[field];\n                return field ? field.editable !== false : true;\n            },\n            set: function (field, value, initiator) {\n                var that = this;\n                var dirty = that.dirty;\n                if (that.editable(field)) {\n                    value = that._parse(field, value);\n                    if (!equal(value, that.get(field))) {\n                        that.dirty = true;\n                        that.dirtyFields[field] = true;\n                        if (ObservableObject.fn.set.call(that, field, value, initiator) && !dirty) {\n                            that.dirty = dirty;\n                            if (!that.dirty) {\n                                that.dirtyFields[field] = false;\n                            }\n                        }\n                    } else {\n                        that.trigger('equalSet', {\n                            field: field,\n                            value: value\n                        });\n                    }\n                }\n            },\n            accept: function (data) {\n                var that = this, parent = function () {\n                        return that;\n                    }, field;\n                for (field in data) {\n                    var value = data[field];\n                    if (field.charAt(0) != '_') {\n                        value = that.wrap(data[field], field, parent);\n                    }\n                    that._set(field, value);\n                }\n                if (that.idField) {\n                    that.id = that.get(that.idField);\n                }\n                that.dirty = false;\n                that.dirtyFields = {};\n            },\n            isNew: function () {\n                return this.id === this._defaultId;\n            }\n        });\n        Model.define = function (base, options) {\n            if (options === undefined) {\n                options = base;\n                base = Model;\n            }\n            var model, proto = extend({ defaults: {} }, options), name, field, type, value, idx, length, fields = {}, originalName, id = proto.id, functionFields = [];\n            if (id) {\n                proto.idField = id;\n            }\n            if (proto.id) {\n                delete proto.id;\n            }\n            if (id) {\n                proto.defaults[id] = proto._defaultId = '';\n            }\n            if (toString.call(proto.fields) === '[object Array]') {\n                for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n                    field = proto.fields[idx];\n                    if (typeof field === STRING) {\n                        fields[field] = {};\n                    } else if (field.field) {\n                        fields[field.field] = field;\n                    }\n                }\n                proto.fields = fields;\n            }\n            for (name in proto.fields) {\n                field = proto.fields[name];\n                type = field.type || 'default';\n                value = null;\n                originalName = name;\n                name = typeof field.field === STRING ? field.field : name;\n                if (!field.nullable) {\n                    value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined ? field.defaultValue : defaultValues[type.toLowerCase()];\n                    if (typeof value === 'function') {\n                        functionFields.push(name);\n                    }\n                }\n                if (options.id === name) {\n                    proto._defaultId = value;\n                }\n                proto.defaults[originalName !== name ? originalName : name] = value;\n                field.parse = field.parse || parsers[type];\n            }\n            if (functionFields.length > 0) {\n                proto._initializers = functionFields;\n            }\n            model = base.extend(proto);\n            model.define = function (options) {\n                return Model.define(model, options);\n            };\n            if (proto.fields) {\n                model.fields = proto.fields;\n                model.idField = proto.idField;\n            }\n            return model;\n        };\n        var Comparer = {\n            selector: function (field) {\n                return isFunction(field) ? field : getter(field);\n            },\n            compare: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    a = selector(a);\n                    b = selector(b);\n                    if (a == null && b == null) {\n                        return 0;\n                    }\n                    if (a == null) {\n                        return -1;\n                    }\n                    if (b == null) {\n                        return 1;\n                    }\n                    if (a.localeCompare) {\n                        return a.localeCompare(b);\n                    }\n                    return a > b ? 1 : a < b ? -1 : 0;\n                };\n            },\n            create: function (sort) {\n                var compare = sort.compare || this.compare(sort.field);\n                if (sort.dir == 'desc') {\n                    return function (a, b) {\n                        return compare(b, a, true);\n                    };\n                }\n                return compare;\n            },\n            combine: function (comparers) {\n                return function (a, b) {\n                    var result = comparers[0](a, b), idx, length;\n                    for (idx = 1, length = comparers.length; idx < length; idx++) {\n                        result = result || comparers[idx](a, b);\n                    }\n                    return result;\n                };\n            }\n        };\n        var StableComparer = extend({}, Comparer, {\n            asc: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    var valueA = selector(a);\n                    var valueB = selector(b);\n                    if (valueA && valueA.getTime && valueB && valueB.getTime) {\n                        valueA = valueA.getTime();\n                        valueB = valueB.getTime();\n                    }\n                    if (valueA === valueB) {\n                        return a.__position - b.__position;\n                    }\n                    if (valueA == null) {\n                        return -1;\n                    }\n                    if (valueB == null) {\n                        return 1;\n                    }\n                    if (valueA.localeCompare) {\n                        return valueA.localeCompare(valueB);\n                    }\n                    return valueA > valueB ? 1 : -1;\n                };\n            },\n            desc: function (field) {\n                var selector = this.selector(field);\n                return function (a, b) {\n                    var valueA = selector(a);\n                    var valueB = selector(b);\n                    if (valueA && valueA.getTime && valueB && valueB.getTime) {\n                        valueA = valueA.getTime();\n                        valueB = valueB.getTime();\n                    }\n                    if (valueA === valueB) {\n                        return a.__position - b.__position;\n                    }\n                    if (valueA == null) {\n                        return 1;\n                    }\n                    if (valueB == null) {\n                        return -1;\n                    }\n                    if (valueB.localeCompare) {\n                        return valueB.localeCompare(valueA);\n                    }\n                    return valueA < valueB ? 1 : -1;\n                };\n            },\n            create: function (sort) {\n                return this[sort.dir](sort.field);\n            }\n        });\n        map = function (array, callback) {\n            var idx, length = array.length, result = new Array(length);\n            for (idx = 0; idx < length; idx++) {\n                result[idx] = callback(array[idx], idx, array);\n            }\n            return result;\n        };\n        var operators = function () {\n            function quote(str) {\n                if (typeof str == 'string') {\n                    str = str.replace(/[\\r\\n]+/g, '');\n                }\n                return JSON.stringify(str);\n            }\n            function textOp(impl) {\n                return function (a, b, ignore, accentFoldingFiltering) {\n                    b += '';\n                    if (ignore) {\n                        a = '(' + a + ' || \\'\\').toString()' + (accentFoldingFiltering ? '.toLocaleLowerCase(\\'' + accentFoldingFiltering + '\\')' : '.toLowerCase()');\n                        b = accentFoldingFiltering ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase();\n                    }\n                    return impl(a, quote(b), ignore);\n                };\n            }\n            function operator(op, a, b, ignore, accentFoldingFiltering) {\n                if (b != null) {\n                    if (typeof b === STRING) {\n                        var date = dateRegExp.exec(b);\n                        if (date) {\n                            b = new Date(+date[1]);\n                        } else if (ignore) {\n                            b = quote(accentFoldingFiltering ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase());\n                            a = '((' + a + ' || \\'\\')+\\'\\')' + (accentFoldingFiltering ? '.toLocaleLowerCase(\\'' + accentFoldingFiltering + '\\')' : '.toLowerCase()');\n                        } else {\n                            b = quote(b);\n                        }\n                    }\n                    if (b.getTime) {\n                        a = '(' + a + '&&' + a + '.getTime?' + a + '.getTime():' + a + ')';\n                        b = b.getTime();\n                    }\n                }\n                return a + ' ' + op + ' ' + b;\n            }\n            function getMatchRegexp(pattern) {\n                for (var rx = '/^', esc = false, i = 0; i < pattern.length; ++i) {\n                    var ch = pattern.charAt(i);\n                    if (esc) {\n                        rx += '\\\\' + ch;\n                    } else if (ch == '~') {\n                        esc = true;\n                        continue;\n                    } else if (ch == '*') {\n                        rx += '.*';\n                    } else if (ch == '?') {\n                        rx += '.';\n                    } else if ('.+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0'.indexOf(ch) >= 0) {\n                        rx += '\\\\' + ch;\n                    } else {\n                        rx += ch;\n                    }\n                    esc = false;\n                }\n                return rx + '$/';\n            }\n            return {\n                quote: function (value) {\n                    if (value && value.getTime) {\n                        return 'new Date(' + value.getTime() + ')';\n                    }\n                    return quote(value);\n                },\n                eq: function (a, b, ignore, accentFoldingFiltering) {\n                    return operator('==', a, b, ignore, accentFoldingFiltering);\n                },\n                neq: function (a, b, ignore, accentFoldingFiltering) {\n                    return operator('!=', a, b, ignore, accentFoldingFiltering);\n                },\n                gt: function (a, b, ignore) {\n                    return operator('>', a, b, ignore);\n                },\n                gte: function (a, b, ignore) {\n                    return operator('>=', a, b, ignore);\n                },\n                lt: function (a, b, ignore) {\n                    return operator('<', a, b, ignore);\n                },\n                lte: function (a, b, ignore) {\n                    return operator('<=', a, b, ignore);\n                },\n                startswith: textOp(function (a, b) {\n                    return a + '.lastIndexOf(' + b + ', 0) == 0';\n                }),\n                doesnotstartwith: textOp(function (a, b) {\n                    return a + '.lastIndexOf(' + b + ', 0) == -1';\n                }),\n                endswith: textOp(function (a, b) {\n                    var n = b ? b.length - 2 : 0;\n                    return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') >= 0';\n                }),\n                doesnotendwith: textOp(function (a, b) {\n                    var n = b ? b.length - 2 : 0;\n                    return a + '.indexOf(' + b + ', ' + a + '.length - ' + n + ') < 0';\n                }),\n                contains: textOp(function (a, b) {\n                    return a + '.indexOf(' + b + ') >= 0';\n                }),\n                doesnotcontain: textOp(function (a, b) {\n                    return a + '.indexOf(' + b + ') == -1';\n                }),\n                matches: textOp(function (a, b) {\n                    b = b.substring(1, b.length - 1);\n                    return getMatchRegexp(b) + '.test(' + a + ')';\n                }),\n                doesnotmatch: textOp(function (a, b) {\n                    b = b.substring(1, b.length - 1);\n                    return '!' + getMatchRegexp(b) + '.test(' + a + ')';\n                }),\n                isempty: function (a) {\n                    return a + ' === \\'\\'';\n                },\n                isnotempty: function (a) {\n                    return a + ' !== \\'\\'';\n                },\n                isnull: function (a) {\n                    return '(' + a + ' == null)';\n                },\n                isnotnull: function (a) {\n                    return '(' + a + ' != null)';\n                },\n                isnullorempty: function (a) {\n                    return '(' + a + ' === null) || (' + a + ' === \\'\\')';\n                },\n                isnotnullorempty: function (a) {\n                    return '(' + a + ' !== null) && (' + a + ' !== \\'\\')';\n                }\n            };\n        }();\n        function Query(data) {\n            this.data = data || [];\n        }\n        Query.filterExpr = function (expression) {\n            var expressions = [], logic = {\n                    and: ' && ',\n                    or: ' || '\n                }, idx, length, filter, expr, fieldFunctions = [], operatorFunctions = [], field, operator, filters = expression.filters;\n            for (idx = 0, length = filters.length; idx < length; idx++) {\n                filter = filters[idx];\n                field = filter.field;\n                operator = filter.operator;\n                if (filter.filters) {\n                    expr = Query.filterExpr(filter);\n                    filter = expr.expression.replace(/__o\\[(\\d+)\\]/g, function (match, index) {\n                        index = +index;\n                        return '__o[' + (operatorFunctions.length + index) + ']';\n                    }).replace(/__f\\[(\\d+)\\]/g, function (match, index) {\n                        index = +index;\n                        return '__f[' + (fieldFunctions.length + index) + ']';\n                    });\n                    operatorFunctions.push.apply(operatorFunctions, expr.operators);\n                    fieldFunctions.push.apply(fieldFunctions, expr.fields);\n                } else {\n                    if (typeof field === FUNCTION) {\n                        expr = '__f[' + fieldFunctions.length + '](d)';\n                        fieldFunctions.push(field);\n                    } else {\n                        expr = kendo.expr(field);\n                    }\n                    if (typeof operator === FUNCTION) {\n                        filter = '__o[' + operatorFunctions.length + '](' + expr + ', ' + operators.quote(filter.value) + ')';\n                        operatorFunctions.push(operator);\n                    } else {\n                        filter = operators[(operator || 'eq').toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined ? filter.ignoreCase : true, expression.accentFoldingFiltering);\n                    }\n                }\n                expressions.push(filter);\n            }\n            return {\n                expression: '(' + expressions.join(logic[expression.logic]) + ')',\n                fields: fieldFunctions,\n                operators: operatorFunctions\n            };\n        };\n        function normalizeSort(field, dir) {\n            if (field) {\n                var descriptor = typeof field === STRING ? {\n                        field: field,\n                        dir: dir\n                    } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n                return grep(descriptors, function (d) {\n                    return !!d.dir;\n                });\n            }\n        }\n        var operatorMap = {\n            '==': 'eq',\n            equals: 'eq',\n            isequalto: 'eq',\n            equalto: 'eq',\n            equal: 'eq',\n            '!=': 'neq',\n            ne: 'neq',\n            notequals: 'neq',\n            isnotequalto: 'neq',\n            notequalto: 'neq',\n            notequal: 'neq',\n            '<': 'lt',\n            islessthan: 'lt',\n            lessthan: 'lt',\n            less: 'lt',\n            '<=': 'lte',\n            le: 'lte',\n            islessthanorequalto: 'lte',\n            lessthanequal: 'lte',\n            '>': 'gt',\n            isgreaterthan: 'gt',\n            greaterthan: 'gt',\n            greater: 'gt',\n            '>=': 'gte',\n            isgreaterthanorequalto: 'gte',\n            greaterthanequal: 'gte',\n            ge: 'gte',\n            notsubstringof: 'doesnotcontain',\n            isnull: 'isnull',\n            isempty: 'isempty',\n            isnotempty: 'isnotempty'\n        };\n        function normalizeOperator(expression) {\n            var idx, length, filter, operator, filters = expression.filters;\n            if (filters) {\n                for (idx = 0, length = filters.length; idx < length; idx++) {\n                    filter = filters[idx];\n                    operator = filter.operator;\n                    if (operator && typeof operator === STRING) {\n                        filter.operator = operatorMap[operator.toLowerCase()] || operator;\n                    }\n                    normalizeOperator(filter);\n                }\n            }\n        }\n        function normalizeFilter(expression) {\n            if (expression && !isEmptyObject(expression)) {\n                if (isArray(expression) || !expression.filters) {\n                    expression = {\n                        logic: 'and',\n                        filters: isArray(expression) ? expression : [expression]\n                    };\n                }\n                normalizeOperator(expression);\n                return expression;\n            }\n        }\n        Query.normalizeFilter = normalizeFilter;\n        function compareDescriptor(f1, f2) {\n            if (f1.logic || f2.logic) {\n                return false;\n            }\n            return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n        }\n        function normalizeDescriptor(filter) {\n            filter = filter || {};\n            if (isEmptyObject(filter)) {\n                return {\n                    logic: 'and',\n                    filters: []\n                };\n            }\n            return normalizeFilter(filter);\n        }\n        function fieldComparer(a, b) {\n            if (b.logic || a.field > b.field) {\n                return 1;\n            } else if (a.field < b.field) {\n                return -1;\n            } else {\n                return 0;\n            }\n        }\n        function compareFilters(expr1, expr2) {\n            expr1 = normalizeDescriptor(expr1);\n            expr2 = normalizeDescriptor(expr2);\n            if (expr1.logic !== expr2.logic) {\n                return false;\n            }\n            var f1, f2;\n            var filters1 = (expr1.filters || []).slice();\n            var filters2 = (expr2.filters || []).slice();\n            if (filters1.length !== filters2.length) {\n                return false;\n            }\n            filters1 = filters1.sort(fieldComparer);\n            filters2 = filters2.sort(fieldComparer);\n            for (var idx = 0; idx < filters1.length; idx++) {\n                f1 = filters1[idx];\n                f2 = filters2[idx];\n                if (f1.logic && f2.logic) {\n                    if (!compareFilters(f1, f2)) {\n                        return false;\n                    }\n                } else if (!compareDescriptor(f1, f2)) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        Query.compareFilters = compareFilters;\n        function normalizeAggregate(expressions) {\n            return isArray(expressions) ? expressions : [expressions];\n        }\n        function normalizeGroup(field, dir, compare, skipItemSorting) {\n            var descriptor = typeof field === STRING ? {\n                    field: field,\n                    dir: dir,\n                    compare: compare,\n                    skipItemSorting: skipItemSorting\n                } : field, descriptors = isArray(descriptor) ? descriptor : descriptor !== undefined ? [descriptor] : [];\n            return map(descriptors, function (d) {\n                return {\n                    field: d.field,\n                    dir: d.dir || 'asc',\n                    aggregates: d.aggregates,\n                    compare: d.compare,\n                    skipItemSorting: d.skipItemSorting\n                };\n            });\n        }\n        function normalizeGroupWithoutCompare(field, dir, compare) {\n            var descriptors = normalizeGroup(field, dir, compare);\n            for (var i = 0; i < descriptors.length; i++) {\n                delete descriptors[i].compare;\n            }\n            return descriptors;\n        }\n        function anyGroupDescriptorHasCompare(groupDescriptors) {\n            var descriptors = isArray(groupDescriptors) ? groupDescriptors : [groupDescriptors];\n            for (var i = 0; i < descriptors.length; i++) {\n                if (descriptors[i] && isFunction(descriptors[i].compare)) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        Query.prototype = {\n            toArray: function () {\n                return this.data;\n            },\n            range: function (index, count) {\n                return new Query(this.data.slice(index, index + count));\n            },\n            skip: function (count) {\n                return new Query(this.data.slice(count));\n            },\n            take: function (count) {\n                return new Query(this.data.slice(0, count));\n            },\n            select: function (selector) {\n                return new Query(map(this.data, selector));\n            },\n            order: function (selector, dir, inPlace) {\n                var sort = { dir: dir };\n                if (selector) {\n                    if (selector.compare) {\n                        sort.compare = selector.compare;\n                    } else {\n                        sort.field = selector;\n                    }\n                }\n                if (inPlace) {\n                    return new Query(this.data.sort(Comparer.create(sort)));\n                }\n                return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n            },\n            orderBy: function (selector, inPlace) {\n                return this.order(selector, 'asc', inPlace);\n            },\n            orderByDescending: function (selector, inPlace) {\n                return this.order(selector, 'desc', inPlace);\n            },\n            sort: function (field, dir, comparer, inPlace) {\n                var idx, length, descriptors = normalizeSort(field, dir), comparers = [];\n                comparer = comparer || Comparer;\n                if (descriptors.length) {\n                    for (idx = 0, length = descriptors.length; idx < length; idx++) {\n                        comparers.push(comparer.create(descriptors[idx]));\n                    }\n                    return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\n                }\n                return this;\n            },\n            filter: function (expressions) {\n                var idx, current, length, compiled, predicate, data = this.data, fields, operators, result = [], filter;\n                expressions = normalizeFilter(expressions);\n                if (!expressions || expressions.filters.length === 0) {\n                    return this;\n                }\n                compiled = Query.filterExpr(expressions);\n                fields = compiled.fields;\n                operators = compiled.operators;\n                predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n                if (fields.length || operators.length) {\n                    filter = function (d) {\n                        return predicate(d, fields, operators);\n                    };\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    current = data[idx];\n                    if (filter(current)) {\n                        result.push(current);\n                    }\n                }\n                return new Query(result);\n            },\n            group: function (descriptors, allData) {\n                descriptors = normalizeGroup(descriptors || []);\n                allData = allData || this.data;\n                var that = this, result = new Query(that.data), descriptor;\n                if (descriptors.length > 0) {\n                    descriptor = descriptors[0];\n                    result = result.groupBy(descriptor).select(function (group) {\n                        var data = new Query(allData).filter([{\n                                field: group.field,\n                                operator: 'eq',\n                                value: group.value,\n                                ignoreCase: false\n                            }]);\n                        return {\n                            field: group.field,\n                            value: group.value,\n                            items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n                            hasSubgroups: descriptors.length > 1,\n                            aggregates: data.aggregate(descriptor.aggregates)\n                        };\n                    });\n                }\n                return result;\n            },\n            groupBy: function (descriptor) {\n                var that = this;\n                if (isEmptyObject(descriptor) || !this.data.length) {\n                    return new Query([]);\n                }\n                var field = descriptor.field, sorted = descriptor.skipItemSorting ? this.data : this._sortForGrouping(field, descriptor.dir || 'asc'), accessor = kendo.accessor(field), item, groupValue = accessor.get(sorted[0], field), group = {\n                        field: field,\n                        value: groupValue,\n                        items: []\n                    }, currentValue, idx, len, result = [group];\n                for (idx = 0, len = sorted.length; idx < len; idx++) {\n                    item = sorted[idx];\n                    currentValue = accessor.get(item, field);\n                    if (!groupValueComparer(groupValue, currentValue)) {\n                        groupValue = currentValue;\n                        group = {\n                            field: field,\n                            value: groupValue,\n                            items: []\n                        };\n                        result.push(group);\n                    }\n                    group.items.push(item);\n                }\n                result = that._sortGroups(result, descriptor);\n                return new Query(result);\n            },\n            _sortForGrouping: function (field, dir) {\n                var idx, length, data = this.data;\n                if (!stableSort) {\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        data[idx].__position = idx;\n                    }\n                    data = new Query(data).sort(field, dir, StableComparer).toArray();\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        delete data[idx].__position;\n                    }\n                    return data;\n                }\n                return this.sort(field, dir).toArray();\n            },\n            _sortGroups: function (groups, descriptor) {\n                var result = groups;\n                if (descriptor && isFunction(descriptor.compare)) {\n                    result = new Query(result).order({ compare: descriptor.compare }, descriptor.dir || ASCENDING).toArray();\n                }\n                return result;\n            },\n            aggregate: function (aggregates) {\n                var idx, len, result = {}, state = {};\n                if (aggregates && aggregates.length) {\n                    for (idx = 0, len = this.data.length; idx < len; idx++) {\n                        calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n                    }\n                }\n                return result;\n            }\n        };\n        function groupValueComparer(a, b) {\n            if (a && a.getTime && b && b.getTime) {\n                return a.getTime() === b.getTime();\n            }\n            return a === b;\n        }\n        function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n            aggregates = aggregates || [];\n            var idx, aggr, functionName, len = aggregates.length;\n            for (idx = 0; idx < len; idx++) {\n                aggr = aggregates[idx];\n                functionName = aggr.aggregate;\n                var field = aggr.field;\n                accumulator[field] = accumulator[field] || {};\n                state[field] = state[field] || {};\n                state[field][functionName] = state[field][functionName] || {};\n                accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n            }\n        }\n        var functions = {\n            sum: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                return accumulator;\n            },\n            count: function (accumulator) {\n                return (accumulator || 0) + 1;\n            },\n            average: function (accumulator, item, accessor, index, length, state) {\n                var value = accessor.get(item);\n                if (state.count === undefined) {\n                    state.count = 0;\n                }\n                if (!isNumber(accumulator)) {\n                    accumulator = value;\n                } else if (isNumber(value)) {\n                    accumulator += value;\n                }\n                if (isNumber(value)) {\n                    state.count++;\n                }\n                if (index == length - 1 && isNumber(accumulator)) {\n                    accumulator = accumulator / state.count;\n                }\n                return accumulator;\n            },\n            max: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator < value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            },\n            min: function (accumulator, item, accessor) {\n                var value = accessor.get(item);\n                if (!isNumber(accumulator) && !isDate(accumulator)) {\n                    accumulator = value;\n                }\n                if (accumulator > value && (isNumber(value) || isDate(value))) {\n                    accumulator = value;\n                }\n                return accumulator;\n            }\n        };\n        function isNumber(val) {\n            return typeof val === 'number' && !isNaN(val);\n        }\n        function isDate(val) {\n            return val && val.getTime;\n        }\n        function toJSON(array) {\n            var idx, length = array.length, result = new Array(length);\n            for (idx = 0; idx < length; idx++) {\n                result[idx] = array[idx].toJSON();\n            }\n            return result;\n        }\n        Query.normalizeGroup = normalizeGroup;\n        Query.normalizeSort = normalizeSort;\n        Query.process = function (data, options, inPlace) {\n            options = options || {};\n            var group = options.group;\n            var customGroupSort = anyGroupDescriptorHasCompare(normalizeGroup(group || []));\n            var query = new Query(data), groupDescriptorsWithoutCompare = normalizeGroupWithoutCompare(group || []), normalizedSort = normalizeSort(options.sort || []), sort = customGroupSort ? normalizedSort : groupDescriptorsWithoutCompare.concat(normalizedSort), groupDescriptorsWithoutSort, total, filterCallback = options.filterCallback, filter = options.filter, skip = options.skip, take = options.take;\n            if (sort && inPlace) {\n                query = query.sort(sort, undefined, undefined, inPlace);\n            }\n            if (filter) {\n                query = query.filter(filter);\n                if (filterCallback) {\n                    query = filterCallback(query);\n                }\n                total = query.toArray().length;\n            }\n            if (sort && !inPlace) {\n                query = query.sort(sort);\n                if (group) {\n                    data = query.toArray();\n                }\n            }\n            if (customGroupSort) {\n                query = query.group(group, data);\n                if (skip !== undefined && take !== undefined) {\n                    query = new Query(flatGroups(query.toArray())).range(skip, take);\n                    groupDescriptorsWithoutSort = map(groupDescriptorsWithoutCompare, function (groupDescriptor) {\n                        return extend({}, groupDescriptor, { skipItemSorting: true });\n                    });\n                    query = query.group(groupDescriptorsWithoutSort, data);\n                }\n            } else {\n                if (skip !== undefined && take !== undefined) {\n                    query = query.range(skip, take);\n                }\n                if (group) {\n                    query = query.group(group, data);\n                }\n            }\n            return {\n                total: total,\n                data: query.toArray()\n            };\n        };\n        var LocalTransport = Class.extend({\n            init: function (options) {\n                this.data = options.data;\n            },\n            read: function (options) {\n                options.success(this.data);\n            },\n            update: function (options) {\n                options.success(options.data);\n            },\n            create: function (options) {\n                options.success(options.data);\n            },\n            destroy: function (options) {\n                options.success(options.data);\n            }\n        });\n        var RemoteTransport = Class.extend({\n            init: function (options) {\n                var that = this, parameterMap;\n                options = that.options = extend({}, that.options, options);\n                each(crud, function (index, type) {\n                    if (typeof options[type] === STRING) {\n                        options[type] = { url: options[type] };\n                    }\n                });\n                that.cache = options.cache ? Cache.create(options.cache) : {\n                    find: noop,\n                    add: noop\n                };\n                parameterMap = options.parameterMap;\n                if (options.submit) {\n                    that.submit = options.submit;\n                }\n                if (isFunction(options.push)) {\n                    that.push = options.push;\n                }\n                if (!that.push) {\n                    that.push = identity;\n                }\n                that.parameterMap = isFunction(parameterMap) ? parameterMap : function (options) {\n                    var result = {};\n                    each(options, function (option, value) {\n                        if (option in parameterMap) {\n                            option = parameterMap[option];\n                            if (isPlainObject(option)) {\n                                value = option.value(value);\n                                option = option.key;\n                            }\n                        }\n                        result[option] = value;\n                    });\n                    return result;\n                };\n            },\n            options: { parameterMap: identity },\n            create: function (options) {\n                return ajax(this.setup(options, CREATE));\n            },\n            read: function (options) {\n                var that = this, success, error, result, cache = that.cache;\n                options = that.setup(options, READ);\n                success = options.success || noop;\n                error = options.error || noop;\n                result = cache.find(options.data);\n                if (result !== undefined) {\n                    success(result);\n                } else {\n                    options.success = function (result) {\n                        cache.add(options.data, result);\n                        success(result);\n                    };\n                    $.ajax(options);\n                }\n            },\n            update: function (options) {\n                return ajax(this.setup(options, UPDATE));\n            },\n            destroy: function (options) {\n                return ajax(this.setup(options, DESTROY));\n            },\n            setup: function (options, type) {\n                options = options || {};\n                var that = this, parameters, operation = that.options[type], data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n                options = extend(true, {}, operation, options);\n                parameters = extend(true, {}, data, options.data);\n                options.data = that.parameterMap(parameters, type);\n                if (isFunction(options.url)) {\n                    options.url = options.url(parameters);\n                }\n                return options;\n            }\n        });\n        var Cache = Class.extend({\n            init: function () {\n                this._store = {};\n            },\n            add: function (key, data) {\n                if (key !== undefined) {\n                    this._store[stringify(key)] = data;\n                }\n            },\n            find: function (key) {\n                return this._store[stringify(key)];\n            },\n            clear: function () {\n                this._store = {};\n            },\n            remove: function (key) {\n                delete this._store[stringify(key)];\n            }\n        });\n        Cache.create = function (options) {\n            var store = {\n                'inmemory': function () {\n                    return new Cache();\n                }\n            };\n            if (isPlainObject(options) && isFunction(options.find)) {\n                return options;\n            }\n            if (options === true) {\n                return new Cache();\n            }\n            return store[options]();\n        };\n        function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, getter, originalName, idx, setters = {}, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                for (getter in getters) {\n                    originalName = fieldNames[getter];\n                    if (originalName && originalName !== getter) {\n                        if (!setters[originalName]) {\n                            setters[originalName] = kendo.setter(originalName);\n                        }\n                        setters[originalName](record, getters[getter](record));\n                        delete record[getter];\n                    }\n                }\n            }\n        }\n        function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, getter, originalName, idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                for (getter in getters) {\n                    record[getter] = modelInstance._parse(getter, getters[getter](record));\n                    originalName = fieldNames[getter];\n                    if (originalName && originalName !== getter) {\n                        delete record[originalName];\n                    }\n                }\n            }\n        }\n        function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n            var record, idx, fieldName, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                record = data[idx];\n                fieldName = originalFieldNames[record.field];\n                if (fieldName && fieldName != record.field) {\n                    record.field = fieldName;\n                }\n                record.value = modelInstance._parse(record.field, record.value);\n                if (record.hasSubgroups) {\n                    convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n                } else {\n                    convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n                }\n            }\n        }\n        function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n            return function (data) {\n                data = originalFunction(data);\n                return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\n            };\n        }\n        function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\n            return function (data) {\n                if (data && !isEmptyObject(getters)) {\n                    if (toString.call(data) !== '[object Array]' && !(data instanceof ObservableArray)) {\n                        data = [data];\n                    }\n                    converter(data, getters, new model(), originalFieldNames, fieldNames);\n                }\n                return data || [];\n            };\n        }\n        var DataReader = Class.extend({\n            init: function (schema) {\n                var that = this, member, get, model, base;\n                schema = schema || {};\n                for (member in schema) {\n                    get = schema[member];\n                    that[member] = typeof get === STRING ? getter(get) : get;\n                }\n                base = schema.modelBase || Model;\n                if (isPlainObject(that.model)) {\n                    that.model = model = base.define(that.model);\n                }\n                var dataFunction = proxy(that.data, that);\n                that._dataAccessFunction = dataFunction;\n                if (that.model) {\n                    var groupsFunction = proxy(that.groups, that), serializeFunction = proxy(that.serialize, that), originalFieldNames = {}, getters = {}, serializeGetters = {}, fieldNames = {}, shouldSerialize = false, fieldName, name;\n                    model = that.model;\n                    if (model.fields) {\n                        each(model.fields, function (field, value) {\n                            var fromName;\n                            fieldName = field;\n                            if (isPlainObject(value) && value.field) {\n                                fieldName = value.field;\n                            } else if (typeof value === STRING) {\n                                fieldName = value;\n                            }\n                            if (isPlainObject(value) && value.from) {\n                                fromName = value.from;\n                            }\n                            shouldSerialize = shouldSerialize || fromName && fromName !== field || fieldName !== field;\n                            name = fromName || fieldName;\n                            getters[field] = name.indexOf('.') !== -1 ? getter(name, true) : getter(name);\n                            serializeGetters[field] = getter(field);\n                            originalFieldNames[fromName || fieldName] = field;\n                            fieldNames[field] = fromName || fieldName;\n                        });\n                        if (!schema.serialize && shouldSerialize) {\n                            that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n                        }\n                    }\n                    that._dataAccessFunction = dataFunction;\n                    that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\n                    that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n                    that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n                }\n            },\n            errors: function (data) {\n                return data ? data.errors : null;\n            },\n            parse: identity,\n            data: identity,\n            total: function (data) {\n                return data.length;\n            },\n            groups: identity,\n            aggregates: function () {\n                return {};\n            },\n            serialize: function (data) {\n                return data;\n            }\n        });\n        function fillLastGroup(originalGroup, newGroup) {\n            var currOriginal;\n            var currentNew;\n            if (newGroup.items && newGroup.items.length) {\n                for (var i = 0; i < newGroup.items.length; i++) {\n                    currOriginal = originalGroup.items[i];\n                    currentNew = newGroup.items[i];\n                    if (currOriginal && currentNew) {\n                        if (currOriginal.hasSubgroups) {\n                            fillLastGroup(currOriginal, currentNew);\n                        } else if (currOriginal.field && currOriginal.value == currentNew.value) {\n                            currOriginal.items.push.apply(currOriginal.items, currentNew.items);\n                        } else {\n                            originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n                        }\n                    } else if (currentNew) {\n                        originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n                    }\n                }\n            }\n        }\n        function mergeGroups(target, dest, skip, take) {\n            var group, idx = 0, items;\n            while (dest.length && take) {\n                group = dest[idx];\n                items = group.items;\n                var length = items.length;\n                if (target && target.field === group.field && target.value === group.value) {\n                    if (target.hasSubgroups && target.items.length) {\n                        mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n                    } else {\n                        items = items.slice(skip, skip + take);\n                        target.items = target.items.concat(items);\n                    }\n                    dest.splice(idx--, 1);\n                } else if (group.hasSubgroups && items.length) {\n                    mergeGroups(group, items, skip, take);\n                    if (!group.items.length) {\n                        dest.splice(idx--, 1);\n                    }\n                } else {\n                    items = items.slice(skip, skip + take);\n                    group.items = items;\n                    if (!group.items.length) {\n                        dest.splice(idx--, 1);\n                    }\n                }\n                if (items.length === 0) {\n                    skip -= length;\n                } else {\n                    skip = 0;\n                    take -= items.length;\n                }\n                if (++idx >= dest.length) {\n                    break;\n                }\n            }\n            if (idx < dest.length) {\n                dest.splice(idx, dest.length - idx);\n            }\n        }\n        function flatGroups(groups, indexFunction) {\n            var result = [];\n            var groupsLength = (groups || []).length;\n            var group;\n            var items;\n            var indexFn = isFunction(indexFunction) ? indexFunction : function (array, index) {\n                return array[index];\n            };\n            for (var groupIndex = 0; groupIndex < groupsLength; groupIndex++) {\n                group = indexFn(groups, groupIndex);\n                if (group.hasSubgroups) {\n                    result = result.concat(flatGroups(group.items));\n                } else {\n                    items = group.items;\n                    for (var itemIndex = 0; itemIndex < items.length; itemIndex++) {\n                        result.push(indexFn(items, itemIndex));\n                    }\n                }\n            }\n            return result;\n        }\n        function flattenGroups(data) {\n            var idx, result = [], length, items, itemIndex;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                var group = data.at(idx);\n                if (group.hasSubgroups) {\n                    result = result.concat(flattenGroups(group.items));\n                } else {\n                    items = group.items;\n                    for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n                        result.push(items.at(itemIndex));\n                    }\n                }\n            }\n            return result;\n        }\n        function wrapGroupItems(data, model) {\n            var idx, length, group;\n            if (model) {\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    group = data.at(idx);\n                    if (group.hasSubgroups) {\n                        wrapGroupItems(group.items, model);\n                    } else {\n                        group.items = new LazyObservableArray(group.items, model, group.items._events);\n                    }\n                }\n            }\n        }\n        function eachGroupItems(data, func) {\n            for (var idx = 0; idx < data.length; idx++) {\n                if (data[idx].hasSubgroups) {\n                    if (eachGroupItems(data[idx].items, func)) {\n                        return true;\n                    }\n                } else if (func(data[idx].items, data[idx])) {\n                    return true;\n                }\n            }\n        }\n        function replaceInRanges(ranges, data, item, observable) {\n            for (var idx = 0; idx < ranges.length; idx++) {\n                if (ranges[idx].data === data) {\n                    break;\n                }\n                if (replaceInRange(ranges[idx].data, item, observable)) {\n                    break;\n                }\n            }\n        }\n        function replaceInRange(items, item, observable) {\n            for (var idx = 0, length = items.length; idx < length; idx++) {\n                if (items[idx] && items[idx].hasSubgroups) {\n                    return replaceInRange(items[idx].items, item, observable);\n                } else if (items[idx] === item || items[idx] === observable) {\n                    items[idx] = observable;\n                    return true;\n                }\n            }\n        }\n        function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n            for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n                var item = view[viewIndex];\n                if (!item || item instanceof type) {\n                    continue;\n                }\n                if (item.hasSubgroups !== undefined && !serverGrouping) {\n                    replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n                } else {\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (data[idx] === item) {\n                            view[viewIndex] = data.at(idx);\n                            replaceInRanges(ranges, data, item, view[viewIndex]);\n                            break;\n                        }\n                    }\n                }\n            }\n        }\n        function removeModel(data, model) {\n            var length = data.length;\n            var dataItem;\n            var idx;\n            for (idx = 0; idx < length; idx++) {\n                dataItem = data[idx];\n                if (dataItem.uid && dataItem.uid == model.uid) {\n                    data.splice(idx, 1);\n                    return dataItem;\n                }\n            }\n        }\n        function indexOfPristineModel(data, model) {\n            if (model) {\n                return indexOf(data, function (item) {\n                    return item.uid && item.uid == model.uid || item[model.idField] === model.id && model.id !== model._defaultId;\n                });\n            }\n            return -1;\n        }\n        function indexOfModel(data, model) {\n            if (model) {\n                return indexOf(data, function (item) {\n                    return item.uid == model.uid;\n                });\n            }\n            return -1;\n        }\n        function indexOf(data, comparer) {\n            var idx, length;\n            for (idx = 0, length = data.length; idx < length; idx++) {\n                if (comparer(data[idx])) {\n                    return idx;\n                }\n            }\n            return -1;\n        }\n        function fieldNameFromModel(fields, name) {\n            if (fields && !isEmptyObject(fields)) {\n                var descriptor = fields[name];\n                var fieldName;\n                if (isPlainObject(descriptor)) {\n                    fieldName = descriptor.from || descriptor.field || name;\n                } else {\n                    fieldName = fields[name] || name;\n                }\n                if (isFunction(fieldName)) {\n                    return name;\n                }\n                return fieldName;\n            }\n            return name;\n        }\n        function convertFilterDescriptorsField(descriptor, model) {\n            var idx, length, target = {};\n            for (var field in descriptor) {\n                if (field !== 'filters') {\n                    target[field] = descriptor[field];\n                }\n            }\n            if (descriptor.filters) {\n                target.filters = [];\n                for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n                    target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n                }\n            } else {\n                target.field = fieldNameFromModel(model.fields, target.field);\n            }\n            return target;\n        }\n        function convertDescriptorsField(descriptors, model) {\n            var idx, length, result = [], target, descriptor;\n            for (idx = 0, length = descriptors.length; idx < length; idx++) {\n                target = {};\n                descriptor = descriptors[idx];\n                for (var field in descriptor) {\n                    target[field] = descriptor[field];\n                }\n                target.field = fieldNameFromModel(model.fields, target.field);\n                if (target.aggregates && isArray(target.aggregates)) {\n                    target.aggregates = convertDescriptorsField(target.aggregates, model);\n                }\n                result.push(target);\n            }\n            return result;\n        }\n        var DataSource = Observable.extend({\n            init: function (options) {\n                var that = this, model, data;\n                if (options) {\n                    data = options.data;\n                }\n                options = that.options = extend({}, that.options, options);\n                that._map = {};\n                that._prefetch = {};\n                that._data = [];\n                that._pristineData = [];\n                that._ranges = [];\n                that._view = [];\n                that._pristineTotal = 0;\n                that._destroyed = [];\n                that._pageSize = options.pageSize;\n                that._page = options.page || (options.pageSize ? 1 : undefined);\n                that._sort = normalizeSort(options.sort);\n                that._filter = normalizeFilter(options.filter);\n                that._group = normalizeGroup(options.group);\n                that._aggregate = options.aggregate;\n                that._total = options.total;\n                that._shouldDetachObservableParents = true;\n                Observable.fn.init.call(that);\n                that.transport = Transport.create(options, data, that);\n                if (isFunction(that.transport.push)) {\n                    that.transport.push({\n                        pushCreate: proxy(that._pushCreate, that),\n                        pushUpdate: proxy(that._pushUpdate, that),\n                        pushDestroy: proxy(that._pushDestroy, that)\n                    });\n                }\n                if (options.offlineStorage != null) {\n                    if (typeof options.offlineStorage == 'string') {\n                        var key = options.offlineStorage;\n                        that._storage = {\n                            getItem: function () {\n                                return JSON.parse(localStorage.getItem(key));\n                            },\n                            setItem: function (item) {\n                                localStorage.setItem(key, stringify(that.reader.serialize(item)));\n                            }\n                        };\n                    } else {\n                        that._storage = options.offlineStorage;\n                    }\n                }\n                that.reader = new kendo.data.readers[options.schema.type || 'json'](options.schema);\n                model = that.reader.model || {};\n                that._detachObservableParents();\n                that._data = that._observe(that._data);\n                that._online = true;\n                that.bind([\n                    'push',\n                    ERROR,\n                    CHANGE,\n                    REQUESTSTART,\n                    SYNC,\n                    REQUESTEND,\n                    PROGRESS\n                ], options);\n            },\n            options: {\n                data: null,\n                schema: { modelBase: Model },\n                offlineStorage: null,\n                serverSorting: false,\n                serverPaging: false,\n                serverFiltering: false,\n                serverGrouping: false,\n                serverAggregates: false,\n                batch: false,\n                inPlaceSort: false\n            },\n            clone: function () {\n                return this;\n            },\n            online: function (value) {\n                if (value !== undefined) {\n                    if (this._online != value) {\n                        this._online = value;\n                        if (value) {\n                            return this.sync();\n                        }\n                    }\n                    return $.Deferred().resolve().promise();\n                } else {\n                    return this._online;\n                }\n            },\n            offlineData: function (state) {\n                if (this.options.offlineStorage == null) {\n                    return null;\n                }\n                if (state !== undefined) {\n                    return this._storage.setItem(state);\n                }\n                return this._storage.getItem() || [];\n            },\n            _isServerGrouped: function () {\n                var group = this.group() || [];\n                return this.options.serverGrouping && group.length;\n            },\n            _pushCreate: function (result) {\n                this._push(result, 'pushCreate');\n            },\n            _pushUpdate: function (result) {\n                this._push(result, 'pushUpdate');\n            },\n            _pushDestroy: function (result) {\n                this._push(result, 'pushDestroy');\n            },\n            _push: function (result, operation) {\n                var data = this._readData(result);\n                if (!data) {\n                    data = result;\n                }\n                this[operation](data);\n            },\n            _flatData: function (data, skip) {\n                if (data) {\n                    if (this._isServerGrouped()) {\n                        return flattenGroups(data);\n                    }\n                    if (!skip) {\n                        for (var idx = 0; idx < data.length; idx++) {\n                            data.at(idx);\n                        }\n                    }\n                }\n                return data;\n            },\n            parent: noop,\n            get: function (id) {\n                var idx, length, data = this._flatData(this._data, this.options.useRanges);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].id == id) {\n                        return data[idx];\n                    }\n                }\n            },\n            getByUid: function (id) {\n                return this._getByUid(id, this._data);\n            },\n            _getByUid: function (id, dataItems) {\n                var idx, length, data = this._flatData(dataItems, this.options.useRanges);\n                if (!data) {\n                    return;\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].uid == id) {\n                        return data[idx];\n                    }\n                }\n            },\n            indexOf: function (model) {\n                return indexOfModel(this._data, model);\n            },\n            at: function (index) {\n                return this._data.at(index);\n            },\n            data: function (value) {\n                var that = this;\n                if (value !== undefined) {\n                    that._detachObservableParents();\n                    that._data = this._observe(value);\n                    that._pristineData = value.slice(0);\n                    that._storeData();\n                    that._ranges = [];\n                    that.trigger('reset');\n                    that._addRange(that._data);\n                    that._total = that._data.length;\n                    that._pristineTotal = that._total;\n                    that._process(that._data);\n                } else {\n                    if (that._data) {\n                        for (var idx = 0; idx < that._data.length; idx++) {\n                            that._data.at(idx);\n                        }\n                    }\n                    return that._data;\n                }\n            },\n            view: function (value) {\n                if (value === undefined) {\n                    return this._view;\n                } else {\n                    this._view = this._observeView(value);\n                }\n            },\n            _observeView: function (data) {\n                var that = this;\n                replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n                var view = new LazyObservableArray(data, that.reader.model);\n                view.parent = function () {\n                    return that.parent();\n                };\n                return view;\n            },\n            flatView: function () {\n                var groups = this.group() || [];\n                if (groups.length) {\n                    return flattenGroups(this._view);\n                } else {\n                    return this._view;\n                }\n            },\n            add: function (model) {\n                return this.insert(this._data.length, model);\n            },\n            _createNewModel: function (model) {\n                if (this.reader.model) {\n                    return new this.reader.model(model);\n                }\n                if (model instanceof ObservableObject) {\n                    return model;\n                }\n                return new ObservableObject(model);\n            },\n            insert: function (index, model) {\n                if (!model) {\n                    model = index;\n                    index = 0;\n                }\n                if (!(model instanceof Model)) {\n                    model = this._createNewModel(model);\n                }\n                if (this._isServerGrouped()) {\n                    this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n                } else {\n                    this._data.splice(index, 0, model);\n                }\n                this._insertModelInRange(index, model);\n                return model;\n            },\n            pushInsert: function (index, items) {\n                var that = this;\n                var rangeSpan = that._getCurrentRangeSpan();\n                if (!items) {\n                    items = index;\n                    index = 0;\n                }\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var pushed = [];\n                var autoSync = this.options.autoSync;\n                this.options.autoSync = false;\n                try {\n                    for (var idx = 0; idx < items.length; idx++) {\n                        var item = items[idx];\n                        var result = this.insert(index, item);\n                        pushed.push(result);\n                        var pristine = result.toJSON();\n                        if (this._isServerGrouped()) {\n                            pristine = this._wrapInEmptyGroup(pristine);\n                        }\n                        this._pristineData.push(pristine);\n                        if (rangeSpan && rangeSpan.length) {\n                            $(rangeSpan).last()[0].pristineData.push(pristine);\n                        }\n                        index++;\n                    }\n                } finally {\n                    this.options.autoSync = autoSync;\n                }\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'create',\n                        items: pushed\n                    });\n                }\n            },\n            pushCreate: function (items) {\n                this.pushInsert(this._data.length, items);\n            },\n            pushUpdate: function (items) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var pushed = [];\n                for (var idx = 0; idx < items.length; idx++) {\n                    var item = items[idx];\n                    var model = this._createNewModel(item);\n                    var target = this.get(model.id);\n                    if (target) {\n                        pushed.push(target);\n                        target.accept(item);\n                        target.trigger(CHANGE);\n                        this._updatePristineForModel(target, item);\n                    } else {\n                        this.pushCreate(item);\n                    }\n                }\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'update',\n                        items: pushed\n                    });\n                }\n            },\n            pushDestroy: function (items) {\n                var pushed = this._removeItems(items);\n                if (pushed.length) {\n                    this.trigger('push', {\n                        type: 'destroy',\n                        items: pushed\n                    });\n                }\n            },\n            _removeItems: function (items, removePristine) {\n                if (!isArray(items)) {\n                    items = [items];\n                }\n                var shouldRemovePristine = typeof removePristine !== 'undefined' ? removePristine : true;\n                var destroyed = [];\n                var autoSync = this.options.autoSync;\n                this.options.autoSync = false;\n                try {\n                    for (var idx = 0; idx < items.length; idx++) {\n                        var item = items[idx];\n                        var model = this._createNewModel(item);\n                        var found = false;\n                        this._eachItem(this._data, function (items) {\n                            for (var idx = 0; idx < items.length; idx++) {\n                                var item = items.at(idx);\n                                if (item.id === model.id) {\n                                    destroyed.push(item);\n                                    items.splice(idx, 1);\n                                    found = true;\n                                    break;\n                                }\n                            }\n                        });\n                        if (found && shouldRemovePristine) {\n                            this._removePristineForModel(model);\n                            this._destroyed.pop();\n                        }\n                    }\n                } finally {\n                    this.options.autoSync = autoSync;\n                }\n                return destroyed;\n            },\n            remove: function (model) {\n                var result, that = this, hasGroups = that._isServerGrouped();\n                this._eachItem(that._data, function (items) {\n                    result = removeModel(items, model);\n                    if (result && hasGroups) {\n                        if (!result.isNew || !result.isNew()) {\n                            that._destroyed.push(result);\n                        }\n                        return true;\n                    }\n                });\n                this._removeModelFromRanges(model);\n                return model;\n            },\n            destroyed: function () {\n                return this._destroyed;\n            },\n            created: function () {\n                var idx, length, result = [], data = this._flatData(this._data, this.options.useRanges);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && data[idx].isNew()) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            updated: function () {\n                var idx, length, result = [], data = this._flatData(this._data, this.options.useRanges);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && !data[idx].isNew() && data[idx].dirty) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            sync: function () {\n                var that = this, created = [], updated = [], destroyed = that._destroyed;\n                var promise = $.Deferred().resolve().promise();\n                if (that.online()) {\n                    if (!that.reader.model) {\n                        return promise;\n                    }\n                    created = that.created();\n                    updated = that.updated();\n                    var promises = [];\n                    if (that.options.batch && that.transport.submit) {\n                        promises = that._sendSubmit(created, updated, destroyed);\n                    } else {\n                        promises.push.apply(promises, that._send('create', created));\n                        promises.push.apply(promises, that._send('update', updated));\n                        promises.push.apply(promises, that._send('destroy', destroyed));\n                    }\n                    promise = $.when.apply(null, promises).then(function () {\n                        var idx, length;\n                        for (idx = 0, length = arguments.length; idx < length; idx++) {\n                            if (arguments[idx]) {\n                                that._accept(arguments[idx]);\n                            }\n                        }\n                        that._storeData(true);\n                        that._syncEnd();\n                        that._change({ action: 'sync' });\n                        that.trigger(SYNC);\n                    });\n                } else {\n                    that._storeData(true);\n                    that._syncEnd();\n                    that._change({ action: 'sync' });\n                }\n                return promise;\n            },\n            _syncEnd: noop,\n            cancelChanges: function (model) {\n                var that = this;\n                if (model instanceof kendo.data.Model) {\n                    that._cancelModel(model);\n                } else {\n                    that._destroyed = [];\n                    that._detachObservableParents();\n                    that._data = that._observe(that._pristineData);\n                    if (that.options.serverPaging) {\n                        that._total = that._pristineTotal;\n                    }\n                    that._ranges = [];\n                    that._addRange(that._data, 0);\n                    that._changesCanceled();\n                    that._change();\n                    that._markOfflineUpdatesAsDirty();\n                }\n            },\n            _changesCanceled: noop,\n            _markOfflineUpdatesAsDirty: function () {\n                var that = this;\n                if (that.options.offlineStorage != null) {\n                    that._eachItem(that._data, function (items) {\n                        for (var idx = 0; idx < items.length; idx++) {\n                            var item = items.at(idx);\n                            if (item.__state__ == 'update' || item.__state__ == 'create') {\n                                item.dirty = true;\n                            }\n                        }\n                    });\n                }\n            },\n            hasChanges: function () {\n                var idx, length, data = this._flatData(this._data, this.options.useRanges);\n                if (this._destroyed.length) {\n                    return true;\n                }\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    if (data[idx].isNew && data[idx].isNew() || data[idx].dirty) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _accept: function (result) {\n                var that = this, models = result.models, response = result.response, idx = 0, serverGroup = that._isServerGrouped(), pristine = that._pristineData, type = result.type, length;\n                that.trigger(REQUESTEND, {\n                    response: response,\n                    type: type\n                });\n                if (response && !isEmptyObject(response)) {\n                    response = that.reader.parse(response);\n                    if (that._handleCustomErrors(response)) {\n                        return;\n                    }\n                    response = that.reader.data(response);\n                    if (!isArray(response)) {\n                        response = [response];\n                    }\n                } else {\n                    response = $.map(models, function (model) {\n                        return model.toJSON();\n                    });\n                }\n                if (type === 'destroy') {\n                    that._destroyed = [];\n                }\n                for (idx = 0, length = models.length; idx < length; idx++) {\n                    if (type !== 'destroy') {\n                        models[idx].accept(response[idx]);\n                        if (type === 'create') {\n                            pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\n                        } else if (type === 'update') {\n                            that._updatePristineForModel(models[idx], response[idx]);\n                        }\n                    } else {\n                        that._removePristineForModel(models[idx]);\n                    }\n                }\n            },\n            _updatePristineForModel: function (model, values) {\n                this._executeOnPristineForModel(model, function (index, items) {\n                    kendo.deepExtend(items[index], values);\n                });\n            },\n            _executeOnPristineForModel: function (model, callback) {\n                this._eachPristineItem(function (items) {\n                    var index = indexOfPristineModel(items, model);\n                    if (index > -1) {\n                        callback(index, items);\n                        return true;\n                    }\n                });\n            },\n            _removePristineForModel: function (model) {\n                this._executeOnPristineForModel(model, function (index, items) {\n                    items.splice(index, 1);\n                });\n            },\n            _readData: function (data) {\n                var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n                return read.call(this.reader, data);\n            },\n            _eachPristineItem: function (callback) {\n                var that = this;\n                var options = that.options;\n                var rangeSpan = that._getCurrentRangeSpan();\n                that._eachItem(that._pristineData, callback);\n                if (options.serverPaging && options.useRanges) {\n                    each(rangeSpan, function (i, range) {\n                        that._eachItem(range.pristineData, callback);\n                    });\n                }\n            },\n            _eachItem: function (data, callback) {\n                if (data && data.length) {\n                    if (this._isServerGrouped()) {\n                        eachGroupItems(data, callback);\n                    } else {\n                        callback(data);\n                    }\n                }\n            },\n            _pristineForModel: function (model) {\n                var pristine, idx, callback = function (items) {\n                        idx = indexOfPristineModel(items, model);\n                        if (idx > -1) {\n                            pristine = items[idx];\n                            return true;\n                        }\n                    };\n                this._eachPristineItem(callback);\n                return pristine;\n            },\n            _cancelModel: function (model) {\n                var that = this;\n                var pristine = this._pristineForModel(model);\n                this._eachItem(this._data, function (items) {\n                    var idx = indexOfModel(items, model);\n                    if (idx >= 0) {\n                        if (pristine && (!model.isNew() || pristine.__state__)) {\n                            items[idx].accept(pristine);\n                            if (pristine.__state__ == 'update') {\n                                items[idx].dirty = true;\n                            }\n                        } else {\n                            that._modelCanceled(model);\n                            items.splice(idx, 1);\n                            that._removeModelFromRanges(model);\n                        }\n                    }\n                });\n            },\n            _modelCanceled: noop,\n            _submit: function (promises, data) {\n                var that = this;\n                that.trigger(REQUESTSTART, { type: 'submit' });\n                that.trigger(PROGRESS);\n                that.transport.submit(extend({\n                    success: function (response, type) {\n                        var promise = $.grep(promises, function (x) {\n                            return x.type == type;\n                        })[0];\n                        if (promise) {\n                            promise.resolve({\n                                response: response,\n                                models: promise.models,\n                                type: type\n                            });\n                        }\n                    },\n                    error: function (response, status, error) {\n                        for (var idx = 0; idx < promises.length; idx++) {\n                            promises[idx].reject(response);\n                        }\n                        that.error(response, status, error);\n                    }\n                }, data));\n            },\n            _sendSubmit: function (created, updated, destroyed) {\n                var that = this, promises = [];\n                if (that.options.batch) {\n                    if (created.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'create';\n                            deferred.models = created;\n                        }));\n                    }\n                    if (updated.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'update';\n                            deferred.models = updated;\n                        }));\n                    }\n                    if (destroyed.length) {\n                        promises.push($.Deferred(function (deferred) {\n                            deferred.type = 'destroy';\n                            deferred.models = destroyed;\n                        }));\n                    }\n                    that._submit(promises, {\n                        data: {\n                            created: that.reader.serialize(toJSON(created)),\n                            updated: that.reader.serialize(toJSON(updated)),\n                            destroyed: that.reader.serialize(toJSON(destroyed))\n                        }\n                    });\n                }\n                return promises;\n            },\n            _promise: function (data, models, type) {\n                var that = this;\n                return $.Deferred(function (deferred) {\n                    that.trigger(REQUESTSTART, { type: type });\n                    that.trigger(PROGRESS);\n                    that.transport[type].call(that.transport, extend({\n                        success: function (response) {\n                            deferred.resolve({\n                                response: response,\n                                models: models,\n                                type: type\n                            });\n                        },\n                        error: function (response, status, error) {\n                            deferred.reject(response);\n                            that.error(response, status, error);\n                        }\n                    }, data));\n                }).promise();\n            },\n            _send: function (method, data) {\n                var that = this, idx, length, promises = [], converted = that.reader.serialize(toJSON(data));\n                if (that.options.batch) {\n                    if (data.length) {\n                        promises.push(that._promise({ data: { models: converted } }, data, method));\n                    }\n                } else {\n                    for (idx = 0, length = data.length; idx < length; idx++) {\n                        promises.push(that._promise({ data: converted[idx] }, [data[idx]], method));\n                    }\n                }\n                return promises;\n            },\n            read: function (data) {\n                var that = this, params = that._params(data);\n                var deferred = $.Deferred();\n                that._queueRequest(params, function () {\n                    var isPrevented = that.trigger(REQUESTSTART, { type: 'read' });\n                    if (!isPrevented) {\n                        that.trigger(PROGRESS);\n                        that._ranges = [];\n                        that.trigger('reset');\n                        if (that.online()) {\n                            that.transport.read({\n                                data: params,\n                                success: function (data) {\n                                    that._ranges = [];\n                                    that.success(data, params);\n                                    deferred.resolve();\n                                },\n                                error: function () {\n                                    var args = slice.call(arguments);\n                                    that.error.apply(that, args);\n                                    deferred.reject.apply(deferred, args);\n                                }\n                            });\n                        } else if (that.options.offlineStorage != null) {\n                            that.success(that.offlineData(), params);\n                            deferred.resolve();\n                        }\n                    } else {\n                        that._dequeueRequest();\n                        deferred.resolve(isPrevented);\n                    }\n                });\n                return deferred.promise();\n            },\n            _readAggregates: function (data) {\n                return this.reader.aggregates(data);\n            },\n            success: function (data) {\n                var that = this, options = that.options, items, replaceSubset;\n                that.trigger(REQUESTEND, {\n                    response: data,\n                    type: 'read'\n                });\n                if (that.online()) {\n                    data = that.reader.parse(data);\n                    if (that._handleCustomErrors(data)) {\n                        that._dequeueRequest();\n                        return;\n                    }\n                    that._total = that.reader.total(data);\n                    if (that._pageSize > that._total) {\n                        that._pageSize = that._total;\n                        if (that.options.pageSize && that.options.pageSize > that._pageSize) {\n                            that._pageSize = that.options.pageSize;\n                        }\n                    }\n                    if (that._aggregate && options.serverAggregates) {\n                        that._aggregateResult = that._readAggregates(data);\n                    }\n                    data = that._readData(data);\n                    that._destroyed = [];\n                } else {\n                    data = that._readData(data);\n                    items = [];\n                    var itemIds = {};\n                    var model = that.reader.model;\n                    var idField = model ? model.idField : 'id';\n                    var idx;\n                    for (idx = 0; idx < this._destroyed.length; idx++) {\n                        var id = this._destroyed[idx][idField];\n                        itemIds[id] = id;\n                    }\n                    for (idx = 0; idx < data.length; idx++) {\n                        var item = data[idx];\n                        var state = item.__state__;\n                        if (state == 'destroy') {\n                            if (!itemIds[item[idField]]) {\n                                this._destroyed.push(this._createNewModel(item));\n                            }\n                        } else {\n                            items.push(item);\n                        }\n                    }\n                    data = items;\n                    that._total = data.length;\n                }\n                that._pristineTotal = that._total;\n                replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\n                if (that.options.endless) {\n                    if (replaceSubset) {\n                        that._pristineData.splice(that._skip, that._pristineData.length);\n                    }\n                    items = data.slice(0);\n                    for (var j = 0; j < items.length; j++) {\n                        that._pristineData.push(items[j]);\n                    }\n                } else {\n                    that._pristineData = data.slice(0);\n                }\n                that._detachObservableParents();\n                if (that.options.endless) {\n                    that._data.unbind(CHANGE, that._changeHandler);\n                    if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\n                        fillLastGroup(that._data[that._data.length - 1], data[0]);\n                        data.shift();\n                    }\n                    data = that._observe(data);\n                    if (replaceSubset) {\n                        that._data.splice(that._skip, that._data.length);\n                    }\n                    for (var i = 0; i < data.length; i++) {\n                        that._data.push(data[i]);\n                    }\n                    that._data.bind(CHANGE, that._changeHandler);\n                } else {\n                    that._data = that._observe(data);\n                }\n                that._markOfflineUpdatesAsDirty();\n                that._storeData();\n                that._addRange(that._data);\n                that._process(that._data);\n                that._dequeueRequest();\n            },\n            _detachObservableParents: function () {\n                if (this._data && this._shouldDetachObservableParents) {\n                    for (var idx = 0; idx < this._data.length; idx++) {\n                        if (this._data[idx].parent) {\n                            this._data[idx].parent = noop;\n                        }\n                    }\n                }\n            },\n            _storeData: function (updatePristine) {\n                var serverGrouping = this._isServerGrouped();\n                var model = this.reader.model;\n                function items(data) {\n                    var state = [];\n                    for (var idx = 0; idx < data.length; idx++) {\n                        var dataItem = data.at(idx);\n                        var item = dataItem.toJSON();\n                        if (serverGrouping && dataItem.items) {\n                            item.items = items(dataItem.items);\n                        } else {\n                            item.uid = dataItem.uid;\n                            if (model) {\n                                if (dataItem.isNew()) {\n                                    item.__state__ = 'create';\n                                } else if (dataItem.dirty) {\n                                    item.__state__ = 'update';\n                                }\n                            }\n                        }\n                        state.push(item);\n                    }\n                    return state;\n                }\n                if (this.options.offlineStorage != null) {\n                    var state = items(this._data);\n                    var destroyed = [];\n                    for (var idx = 0; idx < this._destroyed.length; idx++) {\n                        var item = this._destroyed[idx].toJSON();\n                        item.__state__ = 'destroy';\n                        destroyed.push(item);\n                    }\n                    this.offlineData(state.concat(destroyed));\n                    if (updatePristine) {\n                        this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\n                    }\n                }\n            },\n            _addRange: function (data, skip) {\n                var that = this, start = typeof skip !== 'undefined' ? skip : that._skip || 0, end = start + that._flatData(data, true).length;\n                that._ranges.push({\n                    start: start,\n                    end: end,\n                    data: data,\n                    pristineData: data.toJSON(),\n                    timestamp: that._timeStamp()\n                });\n                that._sortRanges();\n            },\n            _sortRanges: function () {\n                this._ranges.sort(function (x, y) {\n                    return x.start - y.start;\n                });\n            },\n            error: function (xhr, status, errorThrown) {\n                this._dequeueRequest();\n                this.trigger(REQUESTEND, {});\n                this.trigger(ERROR, {\n                    xhr: xhr,\n                    status: status,\n                    errorThrown: errorThrown\n                });\n            },\n            _params: function (data) {\n                var that = this, options = extend({\n                        take: that.take(),\n                        skip: that.skip(),\n                        page: that.page(),\n                        pageSize: that.pageSize(),\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    }, data);\n                if (!that.options.serverPaging) {\n                    delete options.take;\n                    delete options.skip;\n                    delete options.page;\n                    delete options.pageSize;\n                }\n                if (!that.options.serverGrouping) {\n                    delete options.group;\n                } else if (that.reader.model && options.group) {\n                    options.group = convertDescriptorsField(options.group, that.reader.model);\n                }\n                if (!that.options.serverFiltering) {\n                    delete options.filter;\n                } else if (that.reader.model && options.filter) {\n                    options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n                }\n                if (!that.options.serverSorting) {\n                    delete options.sort;\n                } else if (that.reader.model && options.sort) {\n                    options.sort = convertDescriptorsField(options.sort, that.reader.model);\n                }\n                if (!that.options.serverAggregates) {\n                    delete options.aggregate;\n                } else if (that.reader.model && options.aggregate) {\n                    options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n                }\n                return options;\n            },\n            _queueRequest: function (options, callback) {\n                var that = this;\n                if (!that._requestInProgress) {\n                    that._requestInProgress = true;\n                    that._pending = undefined;\n                    callback();\n                } else {\n                    that._pending = {\n                        callback: proxy(callback, that),\n                        options: options\n                    };\n                }\n            },\n            _dequeueRequest: function () {\n                var that = this;\n                that._requestInProgress = false;\n                if (that._pending) {\n                    that._queueRequest(that._pending.options, that._pending.callback);\n                }\n            },\n            _handleCustomErrors: function (response) {\n                if (this.reader.errors) {\n                    var errors = this.reader.errors(response);\n                    if (errors) {\n                        this.trigger(ERROR, {\n                            xhr: null,\n                            status: 'customerror',\n                            errorThrown: 'custom error',\n                            errors: errors\n                        });\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _shouldWrap: function (data) {\n                var model = this.reader.model;\n                if (model && data.length) {\n                    return !(data[0] instanceof model);\n                }\n                return false;\n            },\n            _observe: function (data) {\n                var that = this, model = that.reader.model;\n                that._shouldDetachObservableParents = true;\n                if (data instanceof ObservableArray) {\n                    that._shouldDetachObservableParents = false;\n                    if (that._shouldWrap(data)) {\n                        data.type = that.reader.model;\n                        data.wrapAll(data, data);\n                    }\n                } else {\n                    var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n                    data = new arrayType(data, that.reader.model);\n                    data.parent = function () {\n                        return that.parent();\n                    };\n                }\n                if (that._isServerGrouped()) {\n                    wrapGroupItems(data, model);\n                }\n                if (that._changeHandler && that._data && that._data instanceof ObservableArray && !(that.options.useRanges && that.options.serverPaging)) {\n                    that._data.unbind(CHANGE, that._changeHandler);\n                } else {\n                    that._changeHandler = proxy(that._change, that);\n                }\n                return data.bind(CHANGE, that._changeHandler);\n            },\n            _updateTotalForAction: function (action, items) {\n                var that = this;\n                var total = parseInt(that._total, 10);\n                if (!isNumber(that._total)) {\n                    total = parseInt(that._pristineTotal, 10);\n                }\n                if (action === 'add') {\n                    total += items.length;\n                } else if (action === 'remove') {\n                    total -= items.length;\n                } else if (action !== 'itemchange' && action !== 'sync' && !that.options.serverPaging) {\n                    total = that._pristineTotal;\n                } else if (action === 'sync') {\n                    total = that._pristineTotal = parseInt(that._total, 10);\n                }\n                that._total = total;\n            },\n            _change: function (e) {\n                var that = this, idx, length, action = e ? e.action : '';\n                if (action === 'remove') {\n                    for (idx = 0, length = e.items.length; idx < length; idx++) {\n                        if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n                            that._destroyed.push(e.items[idx]);\n                        }\n                    }\n                }\n                if (that.options.autoSync && (action === 'add' || action === 'remove' || action === 'itemchange')) {\n                    var handler = function (args) {\n                        if (args.action === 'sync') {\n                            that.unbind('change', handler);\n                            that._updateTotalForAction(action, e.items);\n                        }\n                    };\n                    that.first('change', handler);\n                    that.sync();\n                } else {\n                    that._updateTotalForAction(action, e ? e.items : []);\n                    that._process(that._data, e);\n                }\n            },\n            _calculateAggregates: function (data, options) {\n                options = options || {};\n                var query = new Query(data), aggregates = options.aggregate, filter = options.filter;\n                if (filter) {\n                    query = query.filter(filter);\n                }\n                return query.aggregate(aggregates);\n            },\n            _process: function (data, e) {\n                var that = this, options = {}, result;\n                if (that.options.serverPaging !== true) {\n                    options.skip = that._skip;\n                    options.take = that._take || that._pageSize;\n                    if (options.skip === undefined && that._page !== undefined && that._pageSize !== undefined) {\n                        options.skip = (that._page - 1) * that._pageSize;\n                    }\n                    if (that.options.useRanges) {\n                        options.skip = that.currentRangeStart();\n                    }\n                }\n                if (that.options.serverSorting !== true) {\n                    options.sort = that._sort;\n                }\n                if (that.options.serverFiltering !== true) {\n                    options.filter = that._filter;\n                }\n                if (that.options.serverGrouping !== true) {\n                    options.group = that._group;\n                }\n                if (that.options.serverAggregates !== true) {\n                    options.aggregate = that._aggregate;\n                }\n                if (that.options.serverGrouping) {\n                    that._clearEmptyGroups(data);\n                }\n                result = that._queryProcess(data, options);\n                if (that.options.serverAggregates !== true) {\n                    that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\n                }\n                that.view(result.data);\n                that._setFilterTotal(result.total, false);\n                e = e || {};\n                e.items = e.items || that._view;\n                that.trigger(CHANGE, e);\n            },\n            _clearEmptyGroups: function (data) {\n                for (var idx = data.length - 1; idx >= 0; idx--) {\n                    var group = data[idx];\n                    if (group.hasSubgroups) {\n                        this._clearEmptyGroups(group.items);\n                    } else {\n                        if (group.items && !group.items.length) {\n                            splice.apply(group.parent(), [\n                                idx,\n                                1\n                            ]);\n                        }\n                    }\n                }\n            },\n            _queryProcess: function (data, options) {\n                if (this.options.inPlaceSort) {\n                    return Query.process(data, options, this.options.inPlaceSort);\n                } else {\n                    return Query.process(data, options);\n                }\n            },\n            _mergeState: function (options) {\n                var that = this;\n                if (options !== undefined) {\n                    that._pageSize = options.pageSize;\n                    that._page = options.page;\n                    that._sort = options.sort;\n                    that._filter = options.filter;\n                    that._group = options.group;\n                    that._aggregate = options.aggregate;\n                    that._skip = that._currentRangeStart = options.skip;\n                    that._take = options.take;\n                    if (that._skip === undefined) {\n                        that._skip = that._currentRangeStart = that.skip();\n                        options.skip = that.skip();\n                    }\n                    if (that._take === undefined && that._pageSize !== undefined) {\n                        that._take = that._pageSize;\n                        options.take = that._take;\n                    }\n                    if (options.sort) {\n                        that._sort = options.sort = normalizeSort(options.sort);\n                    }\n                    if (options.filter) {\n                        that._filter = options.filter = that.options.accentFoldingFiltering && !$.isEmptyObject(options.filter) ? $.extend({}, normalizeFilter(options.filter), { accentFoldingFiltering: that.options.accentFoldingFiltering }) : normalizeFilter(options.filter);\n                    }\n                    if (options.group) {\n                        that._group = options.group = normalizeGroup(options.group);\n                    }\n                    if (options.aggregate) {\n                        that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n                    }\n                }\n                return options;\n            },\n            query: function (options) {\n                var result;\n                var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n                if (remote || (this._data === undefined || this._data.length === 0) && !this._destroyed.length) {\n                    if (this.options.endless) {\n                        var moreItemsCount = options.pageSize - this.pageSize();\n                        if (moreItemsCount > 0) {\n                            moreItemsCount = this.pageSize();\n                            options.page = options.pageSize / moreItemsCount;\n                            options.pageSize = moreItemsCount;\n                        } else {\n                            options.page = 1;\n                            this.options.endless = false;\n                        }\n                    }\n                    return this.read(this._mergeState(options));\n                }\n                var isPrevented = this.trigger(REQUESTSTART, { type: 'read' });\n                if (!isPrevented) {\n                    this.trigger(PROGRESS);\n                    result = this._queryProcess(this._data, this._mergeState(options));\n                    this._setFilterTotal(result.total, true);\n                    this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\n                    this.view(result.data);\n                    this.trigger(REQUESTEND, { type: 'read' });\n                    this.trigger(CHANGE, { items: result.data });\n                }\n                return $.Deferred().resolve(isPrevented).promise();\n            },\n            _setFilterTotal: function (filterTotal, setDefaultValue) {\n                var that = this;\n                if (!that.options.serverFiltering) {\n                    if (filterTotal !== undefined) {\n                        that._total = filterTotal;\n                    } else if (setDefaultValue) {\n                        that._total = that._data.length;\n                    }\n                }\n            },\n            fetch: function (callback) {\n                var that = this;\n                var fn = function (isPrevented) {\n                    if (isPrevented !== true && isFunction(callback)) {\n                        callback.call(that);\n                    }\n                };\n                return this._query().done(fn);\n            },\n            _query: function (options) {\n                var that = this;\n                return that.query(extend({}, {\n                    page: that.page(),\n                    pageSize: that.pageSize(),\n                    sort: that.sort(),\n                    filter: that.filter(),\n                    group: that.group(),\n                    aggregate: that.aggregate()\n                }, options));\n            },\n            next: function (options) {\n                var that = this, page = that.page(), total = that.total();\n                options = options || {};\n                if (!page || total && page + 1 > that.totalPages()) {\n                    return;\n                }\n                that._skip = that._currentRangeStart = page * that.take();\n                page += 1;\n                options.page = page;\n                that._query(options);\n                return page;\n            },\n            prev: function (options) {\n                var that = this, page = that.page();\n                options = options || {};\n                if (!page || page === 1) {\n                    return;\n                }\n                that._skip = that._currentRangeStart = that._skip - that.take();\n                page -= 1;\n                options.page = page;\n                that._query(options);\n                return page;\n            },\n            page: function (val) {\n                var that = this, skip;\n                if (val !== undefined) {\n                    val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n                    that._query(that._pageableQueryOptions({ page: val }));\n                    return;\n                }\n                skip = that.skip();\n                return skip !== undefined ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined;\n            },\n            pageSize: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query(that._pageableQueryOptions({\n                        pageSize: val,\n                        page: 1\n                    }));\n                    return;\n                }\n                return that.take();\n            },\n            sort: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ sort: val });\n                    return;\n                }\n                return that._sort;\n            },\n            filter: function (val) {\n                var that = this;\n                if (val === undefined) {\n                    return that._filter;\n                }\n                that.trigger('reset');\n                that._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            group: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ group: val });\n                    return;\n                }\n                return that._group;\n            },\n            total: function () {\n                return parseInt(this._total || 0, 10);\n            },\n            aggregate: function (val) {\n                var that = this;\n                if (val !== undefined) {\n                    that._query({ aggregate: val });\n                    return;\n                }\n                return that._aggregate;\n            },\n            aggregates: function () {\n                var result = this._aggregateResult;\n                if (isEmptyObject(result)) {\n                    result = this._emptyAggregates(this.aggregate());\n                }\n                return result;\n            },\n            _emptyAggregates: function (aggregates) {\n                var result = {};\n                if (!isEmptyObject(aggregates)) {\n                    var aggregate = {};\n                    if (!isArray(aggregates)) {\n                        aggregates = [aggregates];\n                    }\n                    for (var idx = 0; idx < aggregates.length; idx++) {\n                        aggregate[aggregates[idx].aggregate] = 0;\n                        result[aggregates[idx].field] = aggregate;\n                    }\n                }\n                return result;\n            },\n            _pageableQueryOptions: function (options) {\n                return options;\n            },\n            _wrapInEmptyGroup: function (model) {\n                var groups = this.group(), parent, group, idx, length;\n                for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n                    group = groups[idx];\n                    parent = {\n                        value: model.get ? model.get(group.field) : model[group.field],\n                        field: group.field,\n                        items: parent ? [parent] : [model],\n                        hasSubgroups: !!parent,\n                        aggregates: this._emptyAggregates(group.aggregates)\n                    };\n                }\n                return parent;\n            },\n            totalPages: function () {\n                var that = this, pageSize = that.pageSize() || that.total();\n                return math.ceil((that.total() || 0) / pageSize);\n            },\n            inRange: function (skip, take) {\n                var that = this, end = math.min(skip + take, that.total());\n                if (!that.options.serverPaging && that._data.length > 0) {\n                    return true;\n                }\n                return that._findRange(skip, end).length > 0;\n            },\n            lastRange: function () {\n                var ranges = this._ranges;\n                return ranges[ranges.length - 1] || {\n                    start: 0,\n                    end: 0,\n                    data: []\n                };\n            },\n            firstItemUid: function () {\n                var ranges = this._ranges;\n                return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n            },\n            enableRequestsInProgress: function () {\n                this._skipRequestsInProgress = false;\n            },\n            _timeStamp: function () {\n                return new Date().getTime();\n            },\n            range: function (skip, take, callback) {\n                this._currentRequestTimeStamp = this._timeStamp();\n                this._skipRequestsInProgress = true;\n                skip = math.min(skip || 0, this.total());\n                callback = isFunction(callback) ? callback : noop;\n                var that = this, pageSkip = math.max(math.floor(skip / take), 0) * take, size = math.min(pageSkip + take, that.total()), data;\n                data = that._findRange(skip, math.min(skip + take, that.total()));\n                if (data.length || that.total() === 0) {\n                    that._processRangeData(data, skip, take, pageSkip, size);\n                    callback();\n                    return;\n                }\n                if (take !== undefined) {\n                    if (!that._rangeExists(pageSkip, size)) {\n                        that.prefetch(pageSkip, take, function () {\n                            if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n                                that.prefetch(size, take, function () {\n                                    that.range(skip, take, callback);\n                                });\n                            } else {\n                                that.range(skip, take, callback);\n                            }\n                        });\n                    } else if (pageSkip < skip) {\n                        that.prefetch(size, take, function () {\n                            that.range(skip, take, callback);\n                        });\n                    }\n                }\n            },\n            _findRange: function (start, end) {\n                var that = this, ranges = that._ranges, range, data = [], skipIdx, takeIdx, startIndex, endIndex, rangeData, rangeEnd, processed, options = that.options, remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates, flatData, count, length;\n                for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n                    range = ranges[skipIdx];\n                    if (start >= range.start && start <= range.end) {\n                        count = 0;\n                        for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n                            range = ranges[takeIdx];\n                            flatData = that._flatData(range.data, true);\n                            if (flatData.length && start + count >= range.start) {\n                                rangeData = range.data;\n                                rangeEnd = range.end;\n                                if (!remote) {\n                                    if (options.inPlaceSort) {\n                                        processed = that._queryProcess(range.data, { filter: that.filter() });\n                                    } else {\n                                        var sort = normalizeGroupWithoutCompare(that.group() || []).concat(normalizeSort(that.sort() || []));\n                                        processed = that._queryProcess(range.data, {\n                                            sort: sort,\n                                            filter: that.filter()\n                                        });\n                                    }\n                                    flatData = rangeData = processed.data;\n                                    if (processed.total !== undefined) {\n                                        rangeEnd = processed.total;\n                                    }\n                                }\n                                startIndex = 0;\n                                if (start + count > range.start) {\n                                    startIndex = start + count - range.start;\n                                }\n                                endIndex = flatData.length;\n                                if (rangeEnd > end) {\n                                    endIndex = endIndex - (rangeEnd - end);\n                                }\n                                count += endIndex - startIndex;\n                                data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n                                if (end <= range.end && count == end - start) {\n                                    return data;\n                                }\n                            }\n                        }\n                        break;\n                    }\n                }\n                return [];\n            },\n            _mergeGroups: function (data, range, skip, take) {\n                if (this._isServerGrouped()) {\n                    var temp = range.toJSON(), prevGroup;\n                    if (data.length) {\n                        prevGroup = data[data.length - 1];\n                    }\n                    mergeGroups(prevGroup, temp, skip, take);\n                    return data.concat(temp);\n                }\n                return data.concat(range.slice(skip, take));\n            },\n            _processRangeData: function (data, skip, take, pageSkip, size) {\n                var that = this;\n                that._pending = undefined;\n                that._skip = skip > that.skip() ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n                that._currentRangeStart = skip;\n                that._take = take;\n                var paging = that.options.serverPaging;\n                var sorting = that.options.serverSorting;\n                var filtering = that.options.serverFiltering;\n                var aggregates = that.options.serverAggregates;\n                try {\n                    that.options.serverPaging = true;\n                    if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n                        that.options.serverSorting = true;\n                    }\n                    that.options.serverFiltering = true;\n                    that.options.serverPaging = true;\n                    that.options.serverAggregates = true;\n                    if (paging) {\n                        that._detachObservableParents();\n                        that._data = data = that._observe(data);\n                    }\n                    that._process(data);\n                } finally {\n                    that.options.serverPaging = paging;\n                    that.options.serverSorting = sorting;\n                    that.options.serverFiltering = filtering;\n                    that.options.serverAggregates = aggregates;\n                }\n            },\n            skip: function () {\n                var that = this;\n                if (that._skip === undefined) {\n                    return that._page !== undefined ? (that._page - 1) * (that.take() || 1) : undefined;\n                }\n                return that._skip;\n            },\n            currentRangeStart: function () {\n                return this._currentRangeStart || 0;\n            },\n            take: function () {\n                return this._take || this._pageSize;\n            },\n            _prefetchSuccessHandler: function (skip, size, callback, force) {\n                var that = this;\n                var timestamp = that._timeStamp();\n                return function (data) {\n                    var found = false, range = {\n                            start: skip,\n                            end: size,\n                            data: [],\n                            timestamp: that._timeStamp()\n                        }, idx, length, temp;\n                    that._dequeueRequest();\n                    that.trigger(REQUESTEND, {\n                        response: data,\n                        type: 'read'\n                    });\n                    data = that.reader.parse(data);\n                    temp = that._readData(data);\n                    if (temp.length) {\n                        for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n                            if (that._ranges[idx].start === skip) {\n                                found = true;\n                                range = that._ranges[idx];\n                                range.pristineData = temp;\n                                range.data = that._observe(temp);\n                                range.end = range.start + that._flatData(range.data, true).length;\n                                that._sortRanges();\n                                break;\n                            }\n                        }\n                        if (!found) {\n                            that._addRange(that._observe(temp), skip);\n                        }\n                    }\n                    that._total = that.reader.total(data);\n                    if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n                        if (callback && temp.length) {\n                            callback();\n                        } else {\n                            that.trigger(CHANGE, {});\n                        }\n                    }\n                };\n            },\n            prefetch: function (skip, take, callback) {\n                var that = this, size = math.min(skip + take, that.total()), options = {\n                        take: take,\n                        skip: skip,\n                        page: skip / take + 1,\n                        pageSize: take,\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    };\n                if (!that._rangeExists(skip, size)) {\n                    clearTimeout(that._timeout);\n                    that._timeout = setTimeout(function () {\n                        that._queueRequest(options, function () {\n                            if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n                                that.transport.read({\n                                    data: that._params(options),\n                                    success: that._prefetchSuccessHandler(skip, size, callback),\n                                    error: function () {\n                                        var args = slice.call(arguments);\n                                        that.error.apply(that, args);\n                                    }\n                                });\n                            } else {\n                                that._dequeueRequest();\n                            }\n                        });\n                    }, 100);\n                } else if (callback) {\n                    callback();\n                }\n            },\n            _multiplePrefetch: function (skip, take, callback) {\n                var that = this, size = math.min(skip + take, that.total()), options = {\n                        take: take,\n                        skip: skip,\n                        page: skip / take + 1,\n                        pageSize: take,\n                        sort: that._sort,\n                        filter: that._filter,\n                        group: that._group,\n                        aggregate: that._aggregate\n                    };\n                if (!that._rangeExists(skip, size)) {\n                    if (!that.trigger(REQUESTSTART, { type: 'read' })) {\n                        that.transport.read({\n                            data: that._params(options),\n                            success: that._prefetchSuccessHandler(skip, size, callback, true)\n                        });\n                    }\n                } else if (callback) {\n                    callback();\n                }\n            },\n            _rangeExists: function (start, end) {\n                var that = this, ranges = that._ranges, idx, length;\n                for (idx = 0, length = ranges.length; idx < length; idx++) {\n                    if (ranges[idx].start <= start && ranges[idx].end >= end) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _getCurrentRangeSpan: function () {\n                var that = this;\n                var ranges = that._ranges;\n                var start = that.currentRangeStart();\n                var end = start + (that.take() || 0);\n                var rangeSpan = [];\n                var range;\n                var idx;\n                var length = ranges.length;\n                for (idx = 0; idx < length; idx++) {\n                    range = ranges[idx];\n                    if (range.start <= start && range.end >= start || range.start >= start && range.start <= end) {\n                        rangeSpan.push(range);\n                    }\n                }\n                return rangeSpan;\n            },\n            _removeModelFromRanges: function (model) {\n                var that = this;\n                var range;\n                for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n                    range = this._ranges[idx];\n                    that._removeModelFromRange(range, model);\n                }\n                that._updateRangesLength();\n            },\n            _removeModelFromRange: function (range, model) {\n                this._eachItem(range.data, function (data) {\n                    for (var idx = 0; idx < data.length; idx++) {\n                        var dataItem = data[idx];\n                        if (dataItem.uid && dataItem.uid == model.uid) {\n                            [].splice.call(data, idx, 1);\n                            break;\n                        }\n                    }\n                });\n            },\n            _insertModelInRange: function (index, model) {\n                var that = this;\n                var ranges = that._ranges || [];\n                var rangesLength = ranges.length;\n                var range;\n                var i;\n                for (i = 0; i < rangesLength; i++) {\n                    range = ranges[i];\n                    if (range.start <= index && range.end >= index) {\n                        if (!that._getByUid(model.uid, range.data)) {\n                            if (that._isServerGrouped()) {\n                                range.data.splice(index, 0, that._wrapInEmptyGroup(model));\n                            } else {\n                                range.data.splice(index, 0, model);\n                            }\n                        }\n                        break;\n                    }\n                }\n                that._updateRangesLength();\n            },\n            _updateRangesLength: function () {\n                var that = this;\n                var ranges = that._ranges || [];\n                var rangesLength = ranges.length;\n                var mismatchFound = false;\n                var mismatchLength = 0;\n                var lengthDifference = 0;\n                var range;\n                var i;\n                for (i = 0; i < rangesLength; i++) {\n                    range = ranges[i];\n                    lengthDifference = that._flatData(range.data, true).length - math.abs(range.end - range.start);\n                    if (!mismatchFound && lengthDifference !== 0) {\n                        mismatchFound = true;\n                        mismatchLength = lengthDifference;\n                        range.end += mismatchLength;\n                        continue;\n                    }\n                    if (mismatchFound) {\n                        range.start += mismatchLength;\n                        range.end += mismatchLength;\n                    }\n                }\n            }\n        });\n        var Transport = {};\n        Transport.create = function (options, data, dataSource) {\n            var transport, transportOptions = options.transport ? $.extend({}, options.transport) : null;\n            if (transportOptions) {\n                transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n                if (options.type === 'jsdo') {\n                    transportOptions.dataSource = dataSource;\n                }\n                if (options.type) {\n                    kendo.data.transports = kendo.data.transports || {};\n                    kendo.data.schemas = kendo.data.schemas || {};\n                    if (!kendo.data.transports[options.type]) {\n                        kendo.logToConsole('Unknown DataSource transport type \\'' + options.type + '\\'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.', 'warn');\n                    } else if (!isPlainObject(kendo.data.transports[options.type])) {\n                        transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n                    } else {\n                        transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n                    }\n                    options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n                }\n                if (!transport) {\n                    transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n                }\n            } else {\n                transport = new LocalTransport({ data: options.data || [] });\n            }\n            return transport;\n        };\n        DataSource.create = function (options) {\n            if (isArray(options) || options instanceof ObservableArray) {\n                options = { data: options };\n            }\n            var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, table = dataSource.table, select = dataSource.select, idx, length, model = {}, field;\n            if (!data && fields && !dataSource.transport) {\n                if (table) {\n                    data = inferTable(table, fields);\n                } else if (select) {\n                    data = inferSelect(select, fields);\n                    if (dataSource.group === undefined && data[0] && data[0].optgroup !== undefined) {\n                        dataSource.group = 'optgroup';\n                    }\n                }\n            }\n            if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    if (field.type) {\n                        model[field.field] = field;\n                    }\n                }\n                if (!isEmptyObject(model)) {\n                    dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n                }\n            }\n            dataSource.data = data;\n            select = null;\n            dataSource.select = null;\n            table = null;\n            dataSource.table = null;\n            return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n        };\n        function inferSelect(select, fields) {\n            select = $(select)[0];\n            var options = select.options;\n            var firstField = fields[0];\n            var secondField = fields[1];\n            var data = [];\n            var idx, length;\n            var optgroup;\n            var option;\n            var record;\n            var value;\n            for (idx = 0, length = options.length; idx < length; idx++) {\n                record = {};\n                option = options[idx];\n                optgroup = option.parentNode;\n                if (optgroup === select) {\n                    optgroup = null;\n                }\n                if (option.disabled || optgroup && optgroup.disabled) {\n                    continue;\n                }\n                if (optgroup) {\n                    record.optgroup = optgroup.label;\n                }\n                record[firstField.field] = option.text;\n                value = option.attributes.value;\n                if (value && value.specified) {\n                    value = option.value;\n                } else {\n                    value = option.text;\n                }\n                record[secondField.field] = value;\n                data.push(record);\n            }\n            return data;\n        }\n        function inferTable(table, fields) {\n            var tbody = $(table)[0].tBodies[0], rows = tbody ? tbody.rows : [], idx, length, fieldIndex, fieldCount = fields.length, data = [], cells, record, cell, empty;\n            for (idx = 0, length = rows.length; idx < length; idx++) {\n                record = {};\n                empty = true;\n                cells = rows[idx].cells;\n                for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n                    cell = cells[fieldIndex];\n                    if (cell.nodeName.toLowerCase() !== 'th') {\n                        empty = false;\n                        record[fields[fieldIndex].field] = cell.innerHTML;\n                    }\n                }\n                if (!empty) {\n                    data.push(record);\n                }\n            }\n            return data;\n        }\n        var Node = Model.define({\n            idField: 'id',\n            init: function (value) {\n                var that = this, hasChildren = that.hasChildren || value && value.hasChildren, childrenField = 'items', childrenOptions = {};\n                kendo.data.Model.fn.init.call(that, value);\n                if (typeof that.children === STRING) {\n                    childrenField = that.children;\n                }\n                childrenOptions = {\n                    schema: {\n                        data: childrenField,\n                        model: {\n                            hasChildren: hasChildren,\n                            id: that.idField,\n                            fields: that.fields\n                        }\n                    }\n                };\n                if (typeof that.children !== STRING) {\n                    extend(childrenOptions, that.children);\n                }\n                childrenOptions.data = value;\n                if (!hasChildren) {\n                    hasChildren = childrenOptions.schema.data;\n                }\n                if (typeof hasChildren === STRING) {\n                    hasChildren = kendo.getter(hasChildren);\n                }\n                if (isFunction(hasChildren)) {\n                    var hasChildrenObject = hasChildren.call(that, that);\n                    if (hasChildrenObject && hasChildrenObject.length === 0) {\n                        that.hasChildren = false;\n                    } else {\n                        that.hasChildren = !!hasChildrenObject;\n                    }\n                }\n                that._childrenOptions = childrenOptions;\n                if (that.hasChildren) {\n                    that._initChildren();\n                }\n                that._loaded = !!(value && value._loaded);\n            },\n            _initChildren: function () {\n                var that = this;\n                var children, transport, parameterMap;\n                if (!(that.children instanceof HierarchicalDataSource)) {\n                    children = that.children = new HierarchicalDataSource(that._childrenOptions);\n                    transport = children.transport;\n                    parameterMap = transport.parameterMap;\n                    transport.parameterMap = function (data, type) {\n                        data[that.idField || 'id'] = that.id;\n                        if (parameterMap) {\n                            data = parameterMap(data, type);\n                        }\n                        return data;\n                    };\n                    children.parent = function () {\n                        return that;\n                    };\n                    children.bind(CHANGE, function (e) {\n                        e.node = e.node || that;\n                        that.trigger(CHANGE, e);\n                    });\n                    children.bind(ERROR, function (e) {\n                        var collection = that.parent();\n                        if (collection) {\n                            e.node = e.node || that;\n                            collection.trigger(ERROR, e);\n                        }\n                    });\n                    that._updateChildrenField();\n                }\n            },\n            append: function (model) {\n                this._initChildren();\n                this.loaded(true);\n                this.children.add(model);\n            },\n            hasChildren: false,\n            level: function () {\n                var parentNode = this.parentNode(), level = 0;\n                while (parentNode && parentNode.parentNode) {\n                    level++;\n                    parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n                }\n                return level;\n            },\n            _updateChildrenField: function () {\n                var fieldName = this._childrenOptions.schema.data;\n                this[fieldName || 'items'] = this.children.data();\n            },\n            _childrenLoaded: function () {\n                this._loaded = true;\n                this._updateChildrenField();\n            },\n            load: function () {\n                var options = {};\n                var method = '_query';\n                var children, promise;\n                if (this.hasChildren) {\n                    this._initChildren();\n                    children = this.children;\n                    options[this.idField || 'id'] = this.id;\n                    if (!this._loaded) {\n                        children._data = undefined;\n                        method = 'read';\n                    }\n                    children.one(CHANGE, proxy(this._childrenLoaded, this));\n                    if (this._matchFilter) {\n                        options.filter = {\n                            field: '_matchFilter',\n                            operator: 'eq',\n                            value: true\n                        };\n                    }\n                    promise = children[method](options);\n                } else {\n                    this.loaded(true);\n                }\n                return promise || $.Deferred().resolve().promise();\n            },\n            parentNode: function () {\n                var array = this.parent();\n                return array.parent();\n            },\n            loaded: function (value) {\n                if (value !== undefined) {\n                    this._loaded = value;\n                } else {\n                    return this._loaded;\n                }\n            },\n            shouldSerialize: function (field) {\n                return Model.fn.shouldSerialize.call(this, field) && field !== 'children' && field !== '_loaded' && field !== 'hasChildren' && field !== '_childrenOptions';\n            }\n        });\n        function dataMethod(name) {\n            return function () {\n                var data = this._data, result = DataSource.fn[name].apply(this, slice.call(arguments));\n                if (this._data != data) {\n                    this._attachBubbleHandlers();\n                }\n                return result;\n            };\n        }\n        var HierarchicalDataSource = DataSource.extend({\n            init: function (options) {\n                var node = Node.define({ children: options });\n                if (options.filter && !options.serverFiltering) {\n                    this._hierarchicalFilter = options.filter;\n                    options.filter = null;\n                }\n                DataSource.fn.init.call(this, extend(true, {}, {\n                    schema: {\n                        modelBase: node,\n                        model: node\n                    }\n                }, options));\n                this._attachBubbleHandlers();\n            },\n            _attachBubbleHandlers: function () {\n                var that = this;\n                that._data.bind(ERROR, function (e) {\n                    that.trigger(ERROR, e);\n                });\n            },\n            read: function (data) {\n                var result = DataSource.fn.read.call(this, data);\n                if (this._hierarchicalFilter) {\n                    if (this._data && this._data.length > 0) {\n                        this.filter(this._hierarchicalFilter);\n                    } else {\n                        this.options.filter = this._hierarchicalFilter;\n                        this._filter = normalizeFilter(this.options.filter);\n                        this._hierarchicalFilter = null;\n                    }\n                }\n                return result;\n            },\n            remove: function (node) {\n                var parentNode = node.parentNode(), dataSource = this, result;\n                if (parentNode && parentNode._initChildren) {\n                    dataSource = parentNode.children;\n                }\n                result = DataSource.fn.remove.call(dataSource, node);\n                if (parentNode && !dataSource.data().length) {\n                    parentNode.hasChildren = false;\n                }\n                return result;\n            },\n            success: dataMethod('success'),\n            data: dataMethod('data'),\n            insert: function (index, model) {\n                var parentNode = this.parent();\n                if (parentNode && parentNode._initChildren) {\n                    parentNode.hasChildren = true;\n                    parentNode._initChildren();\n                }\n                return DataSource.fn.insert.call(this, index, model);\n            },\n            filter: function (val) {\n                if (val === undefined) {\n                    return this._filter;\n                }\n                if (!this.options.serverFiltering && this._markHierarchicalQuery(val)) {\n                    val = {\n                        logic: 'or',\n                        filters: [\n                            val,\n                            {\n                                field: '_matchFilter',\n                                operator: 'equals',\n                                value: true\n                            }\n                        ]\n                    };\n                }\n                this.trigger('reset');\n                this._query({\n                    filter: val,\n                    page: 1\n                });\n            },\n            _markHierarchicalQuery: function (expressions) {\n                var compiled;\n                var predicate;\n                var fields;\n                var operators;\n                var filter;\n                var accentFoldingFiltering = this.options.accentFoldingFiltering;\n                expressions = accentFoldingFiltering ? $.extend({}, normalizeFilter(expressions), { accentFoldingFiltering: accentFoldingFiltering }) : normalizeFilter(expressions);\n                if (!expressions || expressions.filters.length === 0) {\n                    this._updateHierarchicalFilter(function () {\n                        return true;\n                    });\n                    return false;\n                }\n                compiled = Query.filterExpr(expressions);\n                fields = compiled.fields;\n                operators = compiled.operators;\n                predicate = filter = new Function('d, __f, __o', 'return ' + compiled.expression);\n                if (fields.length || operators.length) {\n                    filter = function (d) {\n                        return predicate(d, fields, operators);\n                    };\n                }\n                this._updateHierarchicalFilter(filter);\n                return true;\n            },\n            _updateHierarchicalFilter: function (filter) {\n                var current;\n                var data = this._data;\n                var result = false;\n                for (var idx = 0; idx < data.length; idx++) {\n                    current = data[idx];\n                    if (current.hasChildren) {\n                        current._matchFilter = current.children._updateHierarchicalFilter(filter);\n                        if (!current._matchFilter) {\n                            current._matchFilter = filter(current);\n                        }\n                    } else {\n                        current._matchFilter = filter(current);\n                    }\n                    if (current._matchFilter) {\n                        result = true;\n                    }\n                }\n                return result;\n            },\n            _find: function (method, value) {\n                var idx, length, node, children;\n                var data = this._data;\n                if (!data) {\n                    return;\n                }\n                node = DataSource.fn[method].call(this, value);\n                if (node) {\n                    return node;\n                }\n                data = this._flatData(this._data);\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    children = data[idx].children;\n                    if (!(children instanceof HierarchicalDataSource)) {\n                        continue;\n                    }\n                    node = children[method](value);\n                    if (node) {\n                        return node;\n                    }\n                }\n            },\n            get: function (id) {\n                return this._find('get', id);\n            },\n            getByUid: function (uid) {\n                return this._find('getByUid', uid);\n            }\n        });\n        function inferList(list, fields) {\n            var items = $(list).children(), idx, length, data = [], record, textField = fields[0].field, urlField = fields[1] && fields[1].field, spriteCssClassField = fields[2] && fields[2].field, imageUrlField = fields[3] && fields[3].field, item, id, textChild, className, children;\n            function elements(collection, tagName) {\n                return collection.filter(tagName).add(collection.find(tagName));\n            }\n            for (idx = 0, length = items.length; idx < length; idx++) {\n                record = { _loaded: true };\n                item = items.eq(idx);\n                textChild = item[0].firstChild;\n                children = item.children();\n                list = children.filter('ul');\n                children = children.filter(':not(ul)');\n                id = item.attr('data-id');\n                if (id) {\n                    record.id = id;\n                }\n                if (textChild) {\n                    record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n                }\n                if (urlField) {\n                    record[urlField] = elements(children, 'a').attr('href');\n                }\n                if (imageUrlField) {\n                    record[imageUrlField] = elements(children, 'img').attr('src');\n                }\n                if (spriteCssClassField) {\n                    className = elements(children, '.k-sprite').prop('className');\n                    record[spriteCssClassField] = className && $.trim(className.replace('k-sprite', ''));\n                }\n                if (list.length) {\n                    record.items = inferList(list.eq(0), fields);\n                }\n                if (item.attr('data-hasChildren') == 'true') {\n                    record.hasChildren = true;\n                }\n                data.push(record);\n            }\n            return data;\n        }\n        HierarchicalDataSource.create = function (options) {\n            options = options && options.push ? { data: options } : options;\n            var dataSource = options || {}, data = dataSource.data, fields = dataSource.fields, list = dataSource.list;\n            if (data && data._dataSource) {\n                return data._dataSource;\n            }\n            if (!data && fields && !dataSource.transport) {\n                if (list) {\n                    data = inferList(list, fields);\n                }\n            }\n            dataSource.data = data;\n            return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n        };\n        var Buffer = kendo.Observable.extend({\n            init: function (dataSource, viewSize, disablePrefetch) {\n                kendo.Observable.fn.init.call(this);\n                this._prefetching = false;\n                this.dataSource = dataSource;\n                this.prefetch = !disablePrefetch;\n                var buffer = this;\n                dataSource.bind('change', function () {\n                    buffer._change();\n                });\n                dataSource.bind('reset', function () {\n                    buffer._reset();\n                });\n                this._syncWithDataSource();\n                this.setViewSize(viewSize);\n            },\n            setViewSize: function (viewSize) {\n                this.viewSize = viewSize;\n                this._recalculate();\n            },\n            at: function (index) {\n                var pageSize = this.pageSize, itemPresent = true;\n                if (index >= this.total()) {\n                    this.trigger('endreached', { index: index });\n                    return null;\n                }\n                if (!this.useRanges) {\n                    return this.dataSource.view()[index];\n                }\n                if (this.useRanges) {\n                    if (index < this.dataOffset || index >= this.skip + pageSize) {\n                        itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n                    }\n                    if (index === this.prefetchThreshold) {\n                        this._prefetch();\n                    }\n                    if (index === this.midPageThreshold) {\n                        this.range(this.nextMidRange, true);\n                    } else if (index === this.nextPageThreshold) {\n                        this.range(this.nextFullRange);\n                    } else if (index === this.pullBackThreshold) {\n                        if (this.offset === this.skip) {\n                            this.range(this.previousMidRange);\n                        } else {\n                            this.range(this.previousFullRange);\n                        }\n                    }\n                    if (itemPresent) {\n                        return this.dataSource.at(index - this.dataOffset);\n                    } else {\n                        this.trigger('endreached', { index: index });\n                        return null;\n                    }\n                }\n            },\n            indexOf: function (item) {\n                return this.dataSource.data().indexOf(item) + this.dataOffset;\n            },\n            total: function () {\n                return parseInt(this.dataSource.total(), 10);\n            },\n            next: function () {\n                var buffer = this, pageSize = buffer.pageSize, offset = buffer.skip - buffer.viewSize + pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n                this.offset = offset;\n                this.dataSource.prefetch(pageSkip, pageSize, function () {\n                    buffer._goToRange(offset, true);\n                });\n            },\n            range: function (offset, nextRange) {\n                if (this.offset === offset) {\n                    return true;\n                }\n                var buffer = this, pageSize = this.pageSize, pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize, dataSource = this.dataSource;\n                if (nextRange) {\n                    pageSkip += pageSize;\n                }\n                if (dataSource.inRange(offset, pageSize)) {\n                    this.offset = offset;\n                    this._recalculate();\n                    this._goToRange(offset);\n                    return true;\n                } else if (this.prefetch) {\n                    dataSource.prefetch(pageSkip, pageSize, function () {\n                        buffer.offset = offset;\n                        buffer._recalculate();\n                        buffer._goToRange(offset, true);\n                    });\n                    return false;\n                }\n                return true;\n            },\n            syncDataSource: function () {\n                var offset = this.offset;\n                this.offset = null;\n                this.range(offset);\n            },\n            destroy: function () {\n                this.unbind();\n            },\n            _prefetch: function () {\n                var buffer = this, pageSize = this.pageSize, prefetchOffset = this.skip + pageSize, dataSource = this.dataSource;\n                if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n                    this._prefetching = true;\n                    this.trigger('prefetching', {\n                        skip: prefetchOffset,\n                        take: pageSize\n                    });\n                    dataSource.prefetch(prefetchOffset, pageSize, function () {\n                        buffer._prefetching = false;\n                        buffer.trigger('prefetched', {\n                            skip: prefetchOffset,\n                            take: pageSize\n                        });\n                    });\n                }\n            },\n            _goToRange: function (offset, expanding) {\n                if (this.offset !== offset) {\n                    return;\n                }\n                this.dataOffset = offset;\n                this._expanding = expanding;\n                this.dataSource.range(offset, this.pageSize);\n                this.dataSource.enableRequestsInProgress();\n            },\n            _reset: function () {\n                this._syncPending = true;\n            },\n            _change: function () {\n                var dataSource = this.dataSource;\n                this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n                if (this._syncPending) {\n                    this._syncWithDataSource();\n                    this._recalculate();\n                    this._syncPending = false;\n                    this.trigger('reset', { offset: this.offset });\n                }\n                this.trigger('resize');\n                if (this._expanding) {\n                    this.trigger('expand');\n                }\n                delete this._expanding;\n            },\n            _syncWithDataSource: function () {\n                var dataSource = this.dataSource;\n                this._firstItemUid = dataSource.firstItemUid();\n                this.dataOffset = this.offset = dataSource.skip() || 0;\n                this.pageSize = dataSource.pageSize();\n                this.useRanges = dataSource.options.serverPaging;\n            },\n            _recalculate: function () {\n                var pageSize = this.pageSize, offset = this.offset, viewSize = this.viewSize, skip = Math.ceil(offset / pageSize) * pageSize;\n                this.skip = skip;\n                this.midPageThreshold = skip + pageSize - 1;\n                this.nextPageThreshold = skip + viewSize - 1;\n                this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n                this.pullBackThreshold = this.offset - 1;\n                this.nextMidRange = skip + pageSize - viewSize;\n                this.nextFullRange = skip;\n                this.previousMidRange = offset - viewSize;\n                this.previousFullRange = skip - pageSize;\n            }\n        });\n        var BatchBuffer = kendo.Observable.extend({\n            init: function (dataSource, batchSize) {\n                var batchBuffer = this;\n                kendo.Observable.fn.init.call(batchBuffer);\n                this.dataSource = dataSource;\n                this.batchSize = batchSize;\n                this._total = 0;\n                this.buffer = new Buffer(dataSource, batchSize * 3);\n                this.buffer.bind({\n                    'endreached': function (e) {\n                        batchBuffer.trigger('endreached', { index: e.index });\n                    },\n                    'prefetching': function (e) {\n                        batchBuffer.trigger('prefetching', {\n                            skip: e.skip,\n                            take: e.take\n                        });\n                    },\n                    'prefetched': function (e) {\n                        batchBuffer.trigger('prefetched', {\n                            skip: e.skip,\n                            take: e.take\n                        });\n                    },\n                    'reset': function () {\n                        batchBuffer._total = 0;\n                        batchBuffer.trigger('reset');\n                    },\n                    'resize': function () {\n                        batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n                        batchBuffer.trigger('resize', {\n                            total: batchBuffer.total(),\n                            offset: this.offset\n                        });\n                    }\n                });\n            },\n            syncDataSource: function () {\n                this.buffer.syncDataSource();\n            },\n            at: function (index) {\n                var buffer = this.buffer, skip = index * this.batchSize, take = this.batchSize, view = [], item;\n                if (buffer.offset > skip) {\n                    buffer.at(buffer.offset - 1);\n                }\n                for (var i = 0; i < take; i++) {\n                    item = buffer.at(skip + i);\n                    if (item === null) {\n                        break;\n                    }\n                    view.push(item);\n                }\n                return view;\n            },\n            total: function () {\n                return this._total;\n            },\n            destroy: function () {\n                this.buffer.destroy();\n                this.unbind();\n            }\n        });\n        extend(true, kendo.data, {\n            readers: { json: DataReader },\n            Query: Query,\n            DataSource: DataSource,\n            HierarchicalDataSource: HierarchicalDataSource,\n            Node: Node,\n            ObservableObject: ObservableObject,\n            ObservableArray: ObservableArray,\n            LazyObservableArray: LazyObservableArray,\n            LocalTransport: LocalTransport,\n            RemoteTransport: RemoteTransport,\n            Cache: Cache,\n            DataReader: DataReader,\n            Model: Model,\n            Buffer: Buffer,\n            BatchBuffer: BatchBuffer\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.binder', [\n        'kendo.core',\n        'kendo.data'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'binder',\n        name: 'MVVM',\n        category: 'framework',\n        description: 'Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).',\n        depends: [\n            'core',\n            'data'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Observable = kendo.Observable, ObservableObject = kendo.data.ObservableObject, ObservableArray = kendo.data.ObservableArray, toString = {}.toString, binders = {}, Class = kendo.Class, proxy = $.proxy, VALUE = 'value', SOURCE = 'source', EVENTS = 'events', CHECKED = 'checked', CSS = 'css', deleteExpando = true, FUNCTION = 'function', CHANGE = 'change';\n        (function () {\n            var a = document.createElement('a');\n            try {\n                delete a.test;\n            } catch (e) {\n                deleteExpando = false;\n            }\n        }());\n        var Binding = Observable.extend({\n            init: function (parents, path) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.source = parents[0];\n                that.parents = parents;\n                that.path = path;\n                that.dependencies = {};\n                that.dependencies[path] = true;\n                that.observable = that.source instanceof Observable;\n                that._access = function (e) {\n                    that.dependencies[e.field] = true;\n                };\n                if (that.observable) {\n                    that._change = function (e) {\n                        that.change(e);\n                    };\n                    that.source.bind(CHANGE, that._change);\n                }\n            },\n            _parents: function () {\n                var parents = this.parents;\n                var value = this.get();\n                if (value && typeof value.parent == 'function') {\n                    var parent = value.parent();\n                    if ($.inArray(parent, parents) < 0) {\n                        parents = [parent].concat(parents);\n                    }\n                }\n                return parents;\n            },\n            change: function (e) {\n                var dependency, ch, field = e.field, that = this;\n                if (that.path === 'this') {\n                    that.trigger(CHANGE, e);\n                } else {\n                    for (dependency in that.dependencies) {\n                        if (dependency.indexOf(field) === 0) {\n                            ch = dependency.charAt(field.length);\n                            if (!ch || ch === '.' || ch === '[') {\n                                that.trigger(CHANGE, e);\n                                break;\n                            }\n                        }\n                    }\n                }\n            },\n            start: function (source) {\n                source.bind('get', this._access);\n            },\n            stop: function (source) {\n                source.unbind('get', this._access);\n            },\n            get: function () {\n                var that = this, source = that.source, index = 0, path = that.path, result = source;\n                if (!that.observable) {\n                    return result;\n                }\n                that.start(that.source);\n                result = source.get(path);\n                while (result === undefined && source) {\n                    source = that.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        result = source.get(path);\n                    }\n                }\n                if (result === undefined) {\n                    source = that.source;\n                    while (result === undefined && source) {\n                        source = source.parent();\n                        if (source instanceof ObservableObject) {\n                            result = source.get(path);\n                        }\n                    }\n                }\n                if (typeof result === 'function') {\n                    index = path.lastIndexOf('.');\n                    if (index > 0) {\n                        source = source.get(path.substring(0, index));\n                    }\n                    that.start(source);\n                    if (source !== that.source) {\n                        result = result.call(source, that.source);\n                    } else {\n                        result = result.call(source);\n                    }\n                    that.stop(source);\n                }\n                if (source && source !== that.source) {\n                    that.currentSource = source;\n                    source.unbind(CHANGE, that._change).bind(CHANGE, that._change);\n                }\n                that.stop(that.source);\n                return result;\n            },\n            set: function (value) {\n                var source = this.currentSource || this.source;\n                var field = kendo.getter(this.path)(source);\n                if (typeof field === 'function') {\n                    if (source !== this.source) {\n                        field.call(source, this.source, value);\n                    } else {\n                        field.call(source, value);\n                    }\n                } else {\n                    source.set(this.path, value);\n                }\n            },\n            destroy: function () {\n                if (this.observable) {\n                    this.source.unbind(CHANGE, this._change);\n                    if (this.currentSource) {\n                        this.currentSource.unbind(CHANGE, this._change);\n                    }\n                }\n                this.unbind();\n            }\n        });\n        var EventBinding = Binding.extend({\n            get: function () {\n                var source = this.source, path = this.path, index = 0, handler;\n                handler = source.get(path);\n                while (!handler && source) {\n                    source = this.parents[++index];\n                    if (source instanceof ObservableObject) {\n                        handler = source.get(path);\n                    }\n                }\n                return proxy(handler, source);\n            }\n        });\n        var TemplateBinding = Binding.extend({\n            init: function (source, path, template) {\n                var that = this;\n                Binding.fn.init.call(that, source, path);\n                that.template = template;\n            },\n            render: function (value) {\n                var html;\n                this.start(this.source);\n                html = kendo.render(this.template, value);\n                this.stop(this.source);\n                return html;\n            }\n        });\n        var Binder = Class.extend({\n            init: function (element, bindings, options) {\n                this.element = element;\n                this.bindings = bindings;\n                this.options = options;\n            },\n            bind: function (binding, attribute) {\n                var that = this;\n                binding = attribute ? binding[attribute] : binding;\n                binding.bind(CHANGE, function (e) {\n                    that.refresh(attribute || e);\n                });\n                that.refresh(attribute);\n            },\n            destroy: function () {\n            }\n        });\n        var TypedBinder = Binder.extend({\n            dataType: function () {\n                var dataType = this.element.getAttribute('data-type') || this.element.type || 'text';\n                return dataType.toLowerCase();\n            },\n            parsedValue: function () {\n                return this._parseValue(this.element.value, this.dataType());\n            },\n            _parseValue: function (value, dataType) {\n                if (dataType == 'date') {\n                    value = kendo.parseDate(value, 'yyyy-MM-dd');\n                } else if (dataType == 'datetime-local') {\n                    value = kendo.parseDate(value, [\n                        'yyyy-MM-ddTHH:mm:ss',\n                        'yyyy-MM-ddTHH:mm'\n                    ]);\n                } else if (dataType == 'number') {\n                    value = kendo.parseFloat(value);\n                } else if (dataType == 'boolean') {\n                    value = value.toLowerCase();\n                    if (kendo.parseFloat(value) !== null) {\n                        value = Boolean(kendo.parseFloat(value));\n                    } else {\n                        value = value.toLowerCase() === 'true';\n                    }\n                }\n                return value;\n            }\n        });\n        binders.attr = Binder.extend({\n            refresh: function (key) {\n                this.element.setAttribute(key, this.bindings.attr[key].get());\n            }\n        });\n        binders.css = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.classes = {};\n            },\n            refresh: function (className) {\n                var element = $(this.element), binding = this.bindings.css[className], hasClass = this.classes[className] = binding.get();\n                if (hasClass) {\n                    element.addClass(className);\n                } else {\n                    element.removeClass(className);\n                }\n            }\n        });\n        binders.style = Binder.extend({\n            refresh: function (key) {\n                this.element.style[key] = this.bindings.style[key].get() || '';\n            }\n        });\n        binders.enabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.enabled.get()) {\n                    this.element.removeAttribute('disabled');\n                } else {\n                    this.element.setAttribute('disabled', 'disabled');\n                }\n            }\n        });\n        binders.readonly = Binder.extend({\n            refresh: function () {\n                if (this.bindings.readonly.get()) {\n                    this.element.setAttribute('readonly', 'readonly');\n                } else {\n                    this.element.removeAttribute('readonly');\n                }\n            }\n        });\n        binders.disabled = Binder.extend({\n            refresh: function () {\n                if (this.bindings.disabled.get()) {\n                    this.element.setAttribute('disabled', 'disabled');\n                } else {\n                    this.element.removeAttribute('disabled');\n                }\n            }\n        });\n        binders.events = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                this.handlers = {};\n            },\n            refresh: function (key) {\n                var element = $(this.element), binding = this.bindings.events[key], handler = this.handlers[key];\n                if (handler) {\n                    element.off(key, handler);\n                }\n                handler = this.handlers[key] = binding.get();\n                element.on(key, binding.source, handler);\n            },\n            destroy: function () {\n                var element = $(this.element), handler;\n                for (handler in this.handlers) {\n                    element.off(handler, this.handlers[handler]);\n                }\n            }\n        });\n        binders.text = Binder.extend({\n            refresh: function () {\n                var text = this.bindings.text.get();\n                var dataFormat = this.element.getAttribute('data-format') || '';\n                if (text == null) {\n                    text = '';\n                }\n                $(this.element).text(kendo.toString(text, dataFormat));\n            }\n        });\n        binders.visible = Binder.extend({\n            refresh: function () {\n                if (this.bindings.visible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.invisible = Binder.extend({\n            refresh: function () {\n                if (!this.bindings.invisible.get()) {\n                    this.element.style.display = '';\n                } else {\n                    this.element.style.display = 'none';\n                }\n            }\n        });\n        binders.html = Binder.extend({\n            refresh: function () {\n                this.element.innerHTML = this.bindings.html.get();\n            }\n        });\n        binders.value = TypedBinder.extend({\n            init: function (element, bindings, options) {\n                TypedBinder.fn.init.call(this, element, bindings, options);\n                this._change = proxy(this.change, this);\n                this.eventName = options.valueUpdate || CHANGE;\n                $(this.element).on(this.eventName, this._change);\n                this._initChange = false;\n            },\n            change: function () {\n                this._initChange = this.eventName != CHANGE;\n                this.bindings[VALUE].set(this.parsedValue());\n                this._initChange = false;\n            },\n            refresh: function () {\n                if (!this._initChange) {\n                    var value = this.bindings[VALUE].get();\n                    if (value == null) {\n                        value = '';\n                    }\n                    var type = this.dataType();\n                    if (type == 'date') {\n                        value = kendo.toString(value, 'yyyy-MM-dd');\n                    } else if (type == 'datetime-local') {\n                        value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                    }\n                    this.element.value = value;\n                }\n                this._initChange = false;\n            },\n            destroy: function () {\n                $(this.element).off(this.eventName, this._change);\n            }\n        });\n        binders.source = Binder.extend({\n            init: function (element, bindings, options) {\n                Binder.fn.init.call(this, element, bindings, options);\n                var source = this.bindings.source.get();\n                if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\n                    source.fetch();\n                }\n            },\n            refresh: function (e) {\n                var that = this, source = that.bindings.source.get();\n                if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                    e = e || {};\n                    if (e.action == 'add') {\n                        that.add(e.index, e.items);\n                    } else if (e.action == 'remove') {\n                        that.remove(e.index, e.items);\n                    } else if (e.action != 'itemchange') {\n                        that.render();\n                    }\n                } else {\n                    that.render();\n                }\n            },\n            container: function () {\n                var element = this.element;\n                if (element.nodeName.toLowerCase() == 'table') {\n                    if (!element.tBodies[0]) {\n                        element.appendChild(document.createElement('tbody'));\n                    }\n                    element = element.tBodies[0];\n                }\n                return element;\n            },\n            template: function () {\n                var options = this.options, template = options.template, nodeName = this.container().nodeName.toLowerCase();\n                if (!template) {\n                    if (nodeName == 'select') {\n                        if (options.valueField || options.textField) {\n                            template = kendo.format('<option value=\"#:{0}#\">#:{1}#</option>', options.valueField || options.textField, options.textField || options.valueField);\n                        } else {\n                            template = '<option>#:data#</option>';\n                        }\n                    } else if (nodeName == 'tbody') {\n                        template = '<tr><td>#:data#</td></tr>';\n                    } else if (nodeName == 'ul' || nodeName == 'ol') {\n                        template = '<li>#:data#</li>';\n                    } else {\n                        template = '#:data#';\n                    }\n                    template = kendo.template(template);\n                }\n                return template;\n            },\n            add: function (index, items) {\n                var element = this.container(), parents, idx, length, child, clone = element.cloneNode(false), reference = element.children[index];\n                $(clone).html(kendo.render(this.template(), items));\n                if (clone.children.length) {\n                    parents = this.bindings.source._parents();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        child = clone.children[0];\n                        element.insertBefore(child, reference || null);\n                        bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\n                    }\n                }\n            },\n            remove: function (index, items) {\n                var idx, element = this.container();\n                for (idx = 0; idx < items.length; idx++) {\n                    var child = element.children[index];\n                    unbindElementTree(child, true);\n                    if (child.parentNode == element) {\n                        element.removeChild(child);\n                    }\n                }\n            },\n            render: function () {\n                var source = this.bindings.source.get(), parents, idx, length, element = this.container(), template = this.template();\n                if (source == null) {\n                    return;\n                }\n                if (source instanceof kendo.data.DataSource) {\n                    source = source.view();\n                }\n                if (!(source instanceof ObservableArray) && toString.call(source) !== '[object Array]') {\n                    source = [source];\n                }\n                if (this.bindings.template) {\n                    unbindElementChildren(element, true);\n                    $(element).html(this.bindings.template.render(source));\n                    if (element.children.length) {\n                        parents = this.bindings.source._parents();\n                        for (idx = 0, length = source.length; idx < length; idx++) {\n                            bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\n                        }\n                    }\n                } else {\n                    $(element).html(kendo.render(template, source));\n                }\n            }\n        });\n        binders.input = {\n            checked: TypedBinder.extend({\n                init: function (element, bindings, options) {\n                    TypedBinder.fn.init.call(this, element, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                change: function () {\n                    var element = this.element;\n                    var value = this.value();\n                    if (element.type == 'radio') {\n                        value = this.parsedValue();\n                        this.bindings[CHECKED].set(value);\n                    } else if (element.type == 'checkbox') {\n                        var source = this.bindings[CHECKED].get();\n                        var index;\n                        if (source instanceof ObservableArray) {\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            if (index > -1) {\n                                source.splice(index, 1);\n                            } else {\n                                source.push(value);\n                            }\n                        } else {\n                            this.bindings[CHECKED].set(value);\n                        }\n                    }\n                },\n                refresh: function () {\n                    var value = this.bindings[CHECKED].get(), source = value, type = this.dataType(), element = this.element;\n                    if (element.type == 'checkbox') {\n                        if (source instanceof ObservableArray) {\n                            var index = -1;\n                            value = this.parsedValue();\n                            if (value instanceof Date) {\n                                for (var i = 0; i < source.length; i++) {\n                                    if (source[i] instanceof Date && +source[i] === +value) {\n                                        index = i;\n                                        break;\n                                    }\n                                }\n                            } else {\n                                index = source.indexOf(value);\n                            }\n                            element.checked = index >= 0;\n                        } else {\n                            element.checked = source;\n                        }\n                    } else if (element.type == 'radio') {\n                        if (type == 'date') {\n                            value = kendo.toString(value, 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(value, 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        if (value !== null && typeof value !== 'undefined' && element.value === value.toString()) {\n                            element.checked = true;\n                        } else {\n                            element.checked = false;\n                        }\n                    }\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (element.type == 'checkbox') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        binders.select = {\n            source: binders.source.extend({\n                refresh: function (e) {\n                    var that = this, source = that.bindings.source.get();\n                    if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n                        e = e || {};\n                        if (e.action == 'add') {\n                            that.add(e.index, e.items);\n                        } else if (e.action == 'remove') {\n                            that.remove(e.index, e.items);\n                        } else if (e.action == 'itemchange' || e.action === undefined) {\n                            that.render();\n                            if (that.bindings.value) {\n                                if (that.bindings.value) {\n                                    var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data('valueField'));\n                                    if (val === null) {\n                                        that.element.selectedIndex = -1;\n                                    } else {\n                                        that.element.value = val;\n                                    }\n                                }\n                            }\n                        }\n                    } else {\n                        that.render();\n                    }\n                }\n            }),\n            value: TypedBinder.extend({\n                init: function (target, bindings, options) {\n                    TypedBinder.fn.init.call(this, target, bindings, options);\n                    this._change = proxy(this.change, this);\n                    $(this.element).change(this._change);\n                },\n                parsedValue: function () {\n                    var dataType = this.dataType();\n                    var values = [];\n                    var value, option, idx, length;\n                    for (idx = 0, length = this.element.options.length; idx < length; idx++) {\n                        option = this.element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            values.push(this._parseValue(value, dataType));\n                        }\n                    }\n                    return values;\n                },\n                change: function () {\n                    var values = [], element = this.element, source, field = this.options.valueField || this.options.textField, valuePrimitive = this.options.valuePrimitive, option, valueIndex, value, idx, length;\n                    for (idx = 0, length = element.options.length; idx < length; idx++) {\n                        option = element.options[idx];\n                        if (option.selected) {\n                            value = option.attributes.value;\n                            if (value && value.specified) {\n                                value = option.value;\n                            } else {\n                                value = option.text;\n                            }\n                            if (field) {\n                                values.push(value);\n                            } else {\n                                values.push(this._parseValue(value, this.dataType()));\n                            }\n                        }\n                    }\n                    if (field) {\n                        source = this.bindings.source.get();\n                        if (source instanceof kendo.data.DataSource) {\n                            source = source.view();\n                        }\n                        for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                var sourceValue = source[idx].get(field);\n                                var match = String(sourceValue) === values[valueIndex];\n                                if (match) {\n                                    values[valueIndex] = source[idx];\n                                    break;\n                                }\n                            }\n                        }\n                    }\n                    value = this.bindings[VALUE].get();\n                    if (value instanceof ObservableArray) {\n                        value.splice.apply(value, [\n                            0,\n                            value.length\n                        ].concat(values));\n                    } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined || !field)) {\n                        this.bindings[VALUE].set(values[0]);\n                    } else {\n                        this.bindings[VALUE].set(values[0].get(field));\n                    }\n                },\n                refresh: function () {\n                    var optionIndex, element = this.element, options = element.options, value = this.bindings[VALUE].get(), values = value, field = this.options.valueField || this.options.textField, found = false, type = this.dataType(), optionValue;\n                    if (!(values instanceof ObservableArray)) {\n                        values = new ObservableArray([value]);\n                    }\n                    element.selectedIndex = -1;\n                    for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\n                        value = values[valueIndex];\n                        if (field && value instanceof ObservableObject) {\n                            value = value.get(field);\n                        }\n                        if (type == 'date') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-dd');\n                        } else if (type == 'datetime-local') {\n                            value = kendo.toString(values[valueIndex], 'yyyy-MM-ddTHH:mm:ss');\n                        }\n                        for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\n                            optionValue = options[optionIndex].value;\n                            if (optionValue === '' && value !== '') {\n                                optionValue = options[optionIndex].text;\n                            }\n                            if (value != null && optionValue == value.toString()) {\n                                options[optionIndex].selected = true;\n                                found = true;\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    $(this.element).off(CHANGE, this._change);\n                }\n            })\n        };\n        function dataSourceBinding(bindingName, fieldName, setter) {\n            return Binder.extend({\n                init: function (widget, bindings, options) {\n                    var that = this;\n                    Binder.fn.init.call(that, widget.element[0], bindings, options);\n                    that.widget = widget;\n                    that._dataBinding = proxy(that.dataBinding, that);\n                    that._dataBound = proxy(that.dataBound, that);\n                    that._itemChange = proxy(that.itemChange, that);\n                },\n                itemChange: function (e) {\n                    bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\n                },\n                dataBinding: function (e) {\n                    var idx, length, widget = this.widget, items = e.removedItems || widget.items();\n                    for (idx = 0, length = items.length; idx < length; idx++) {\n                        unbindElementTree(items[idx], false);\n                    }\n                },\n                _ns: function (ns) {\n                    ns = ns || kendo.ui;\n                    var all = [\n                        kendo.ui,\n                        kendo.dataviz.ui,\n                        kendo.mobile.ui\n                    ];\n                    all.splice($.inArray(ns, all), 1);\n                    all.unshift(ns);\n                    return kendo.rolesFromNamespaces(all);\n                },\n                dataBound: function (e) {\n                    var idx, length, widget = this.widget, items = e.addedItems || widget.items(), dataSource = widget[fieldName], view, parents, hds = kendo.data.HierarchicalDataSource;\n                    if (hds && dataSource instanceof hds) {\n                        return;\n                    }\n                    if (items.length) {\n                        view = e.addedDataItems || dataSource.flatView();\n                        parents = this.bindings[bindingName]._parents();\n                        for (idx = 0, length = view.length; idx < length; idx++) {\n                            if (items[idx]) {\n                                bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\n                            }\n                        }\n                    }\n                },\n                refresh: function (e) {\n                    var that = this, source, widget = that.widget, select, multiselect, dropdowntree;\n                    e = e || {};\n                    if (!e.action) {\n                        that.destroy();\n                        widget.bind('dataBinding', that._dataBinding);\n                        widget.bind('dataBound', that._dataBound);\n                        widget.bind('itemChange', that._itemChange);\n                        source = that.bindings[bindingName].get();\n                        if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\n                            if (source instanceof kendo.data.DataSource) {\n                                widget[setter](source);\n                            } else if (source && source._dataSource) {\n                                widget[setter](source._dataSource);\n                            } else {\n                                select = kendo.ui.Select && widget instanceof kendo.ui.Select;\n                                multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n                                dropdowntree = kendo.ui.DropDownTree && widget instanceof kendo.ui.DropDownTree;\n                                if (!dropdowntree) {\n                                    widget[fieldName].data(source);\n                                } else {\n                                    widget.treeview[fieldName].data(source);\n                                }\n                                if (that.bindings.value && (select || multiselect)) {\n                                    widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\n                                }\n                            }\n                        }\n                    }\n                },\n                destroy: function () {\n                    var widget = this.widget;\n                    widget.unbind('dataBinding', this._dataBinding);\n                    widget.unbind('dataBound', this._dataBound);\n                    widget.unbind('itemChange', this._itemChange);\n                }\n            });\n        }\n        binders.widget = {\n            events: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this.handlers = {};\n                },\n                refresh: function (key) {\n                    var binding = this.bindings.events[key], handler = this.handlers[key];\n                    if (handler) {\n                        this.widget.unbind(key, handler);\n                    }\n                    handler = binding.get();\n                    this.handlers[key] = function (e) {\n                        e.data = binding.source;\n                        handler(e);\n                        if (e.data === binding.source) {\n                            delete e.data;\n                        }\n                    };\n                    this.widget.bind(key, this.handlers[key]);\n                },\n                destroy: function () {\n                    var handler;\n                    for (handler in this.handlers) {\n                        this.widget.unbind(handler, this.handlers[handler]);\n                    }\n                }\n            }),\n            checked: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = proxy(this.change, this);\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings[CHECKED].set(this.value());\n                },\n                refresh: function () {\n                    this.widget.check(this.bindings[CHECKED].get() === true);\n                },\n                value: function () {\n                    var element = this.element, value = element.value;\n                    if (value == 'on' || value == 'off' || this.element.type == 'checkbox') {\n                        value = element.checked;\n                    }\n                    return value;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            start: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this._change = proxy(this.change, this);\n                    this.widget = widget;\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings.start.set(this.widget.range().start);\n                },\n                refresh: function () {\n                    var that = this;\n                    var start = this.bindings.start.get();\n                    var end = that.widget._range ? that.widget._range.end : null;\n                    this.widget.range({\n                        start: start,\n                        end: end\n                    });\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            end: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this._change = proxy(this.change, this);\n                    this.widget = widget;\n                    this.widget.bind(CHANGE, this._change);\n                },\n                change: function () {\n                    this.bindings.end.set(this.widget.range().end);\n                },\n                refresh: function () {\n                    var that = this;\n                    var end = this.bindings.end.get();\n                    var start = that.widget._range ? that.widget._range.start : null;\n                    this.widget.range({\n                        start: start,\n                        end: end\n                    });\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            visible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var visible = this.bindings.visible.get();\n                    this.widget.wrapper[0].style.display = visible ? '' : 'none';\n                }\n            }),\n            invisible: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    var invisible = this.bindings.invisible.get();\n                    this.widget.wrapper[0].style.display = invisible ? 'none' : '';\n                }\n            }),\n            enabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(this.bindings.enabled.get());\n                    }\n                }\n            }),\n            disabled: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                },\n                refresh: function () {\n                    if (this.widget.enable) {\n                        this.widget.enable(!this.bindings.disabled.get());\n                    }\n                }\n            }),\n            source: dataSourceBinding('source', 'dataSource', 'setDataSource'),\n            value: Binder.extend({\n                init: function (widget, bindings, options) {\n                    Binder.fn.init.call(this, widget.element[0], bindings, options);\n                    this.widget = widget;\n                    this._change = $.proxy(this.change, this);\n                    this.widget.first(CHANGE, this._change);\n                    var value = this.bindings.value.get();\n                    this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\n                    this._valueIsObservableArray = value instanceof ObservableArray;\n                    this._initChange = false;\n                },\n                _source: function () {\n                    var source;\n                    if (this.widget.dataItem) {\n                        source = this.widget.dataItem();\n                        if (source && source instanceof ObservableObject) {\n                            return [source];\n                        }\n                    }\n                    if (this.bindings.source) {\n                        source = this.bindings.source.get();\n                    }\n                    if (!source || source instanceof kendo.data.DataSource) {\n                        source = this.widget.dataSource.flatView();\n                    }\n                    return source;\n                },\n                change: function () {\n                    var value = this.widget.value(), field = this.options.dataValueField || this.options.dataTextField, isArray = toString.call(value) === '[object Array]', isObservableObject = this._valueIsObservableObject, valueIndex, valueLength, values = [], sourceItem, sourceValue, idx, length, source;\n                    this._initChange = true;\n                    if (field) {\n                        if (value === '' && (isObservableObject || this.options.valuePrimitive)) {\n                            value = null;\n                        } else {\n                            source = this._source();\n                            if (isArray) {\n                                valueLength = value.length;\n                                values = value.slice(0);\n                            }\n                            for (idx = 0, length = source.length; idx < length; idx++) {\n                                sourceItem = source[idx];\n                                sourceValue = sourceItem.get(field);\n                                if (isArray) {\n                                    for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\n                                        if (sourceValue == values[valueIndex]) {\n                                            values[valueIndex] = sourceItem;\n                                            break;\n                                        }\n                                    }\n                                } else if (sourceValue == value) {\n                                    value = isObservableObject ? sourceItem : sourceValue;\n                                    break;\n                                }\n                            }\n                            if (values[0]) {\n                                if (this._valueIsObservableArray) {\n                                    value = values;\n                                } else if (isObservableObject || !field) {\n                                    value = values[0];\n                                } else {\n                                    value = values[0].get(field);\n                                }\n                            }\n                        }\n                    }\n                    this.bindings.value.set(value);\n                    this._initChange = false;\n                },\n                refresh: function () {\n                    if (!this._initChange) {\n                        var widget = this.widget;\n                        var options = widget.options;\n                        var textField = options.dataTextField;\n                        var valueField = options.dataValueField || textField;\n                        var value = this.bindings.value.get();\n                        var text = options.text || '';\n                        var idx = 0, length;\n                        var values = [];\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (valueField) {\n                            if (value instanceof ObservableArray) {\n                                for (length = value.length; idx < length; idx++) {\n                                    values[idx] = value[idx].get(valueField);\n                                }\n                                value = values;\n                            } else if (value instanceof ObservableObject) {\n                                text = value.get(textField);\n                                value = value.get(valueField);\n                            }\n                        }\n                        if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\n                            if (textField === valueField && !text) {\n                                text = value;\n                            }\n                            if (!text && (value || value === 0) && options.valuePrimitive) {\n                                widget.value(value);\n                            } else {\n                                widget._preselect(value, text);\n                            }\n                        } else {\n                            widget.value(value);\n                        }\n                    }\n                    this._initChange = false;\n                },\n                destroy: function () {\n                    this.widget.unbind(CHANGE, this._change);\n                }\n            }),\n            dropdowntree: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, selectedNode = that.widget.treeview.select(), nonPrimitiveValues = that.widget._isMultipleSelection() ? that.widget._getAllChecked() : that.widget.treeview.dataItem(selectedNode) || that.widget.value(), newValues = valuePrimitive || that.widget.options.autoBind === false ? that.widget.value() : nonPrimitiveValues;\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice ? newValues.slice(0) : newValues;\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            gantt: { dependencies: dataSourceBinding('dependencies', 'dependencies', 'setDependenciesDataSource') },\n            multiselect: {\n                value: Binder.extend({\n                    init: function (widget, bindings, options) {\n                        Binder.fn.init.call(this, widget.element[0], bindings, options);\n                        this.widget = widget;\n                        this._change = $.proxy(this.change, this);\n                        this.widget.first(CHANGE, this._change);\n                        this._initChange = false;\n                    },\n                    change: function () {\n                        var that = this, oldValues = that.bindings[VALUE].get(), valuePrimitive = that.options.valuePrimitive, newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\n                        var field = this.options.dataValueField || this.options.dataTextField;\n                        newValues = newValues.slice(0);\n                        that._initChange = true;\n                        if (oldValues instanceof ObservableArray) {\n                            var remove = [];\n                            var newLength = newValues.length;\n                            var i = 0, j = 0;\n                            var old = oldValues[i];\n                            var same = false;\n                            var removeIndex;\n                            var newValue;\n                            var found;\n                            while (old !== undefined) {\n                                found = false;\n                                for (j = 0; j < newLength; j++) {\n                                    if (valuePrimitive) {\n                                        same = newValues[j] == old;\n                                    } else {\n                                        newValue = newValues[j];\n                                        newValue = newValue.get ? newValue.get(field) : newValue;\n                                        same = newValue == (old.get ? old.get(field) : old);\n                                    }\n                                    if (same) {\n                                        newValues.splice(j, 1);\n                                        newLength -= 1;\n                                        found = true;\n                                        break;\n                                    }\n                                }\n                                if (!found) {\n                                    remove.push(old);\n                                    arraySplice(oldValues, i, 1);\n                                    removeIndex = i;\n                                } else {\n                                    i += 1;\n                                }\n                                old = oldValues[i];\n                            }\n                            arraySplice(oldValues, oldValues.length, 0, newValues);\n                            if (remove.length) {\n                                oldValues.trigger('change', {\n                                    action: 'remove',\n                                    items: remove,\n                                    index: removeIndex\n                                });\n                            }\n                            if (newValues.length) {\n                                oldValues.trigger('change', {\n                                    action: 'add',\n                                    items: newValues,\n                                    index: oldValues.length - 1\n                                });\n                            }\n                        } else {\n                            that.bindings[VALUE].set(newValues);\n                        }\n                        that._initChange = false;\n                    },\n                    refresh: function () {\n                        if (!this._initChange) {\n                            var options = this.options, widget = this.widget, field = options.dataValueField || options.dataTextField, value = this.bindings.value.get(), data = value, idx = 0, length, values = [], selectedValue;\n                            if (value === undefined) {\n                                value = null;\n                            }\n                            if (field) {\n                                if (value instanceof ObservableArray) {\n                                    for (length = value.length; idx < length; idx++) {\n                                        selectedValue = value[idx];\n                                        values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n                                    }\n                                    value = values;\n                                } else if (value instanceof ObservableObject) {\n                                    value = value.get(field);\n                                }\n                            }\n                            if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\n                                widget._preselect(data, value);\n                            } else {\n                                widget.value(value);\n                            }\n                        }\n                    },\n                    destroy: function () {\n                        this.widget.unbind(CHANGE, this._change);\n                    }\n                })\n            },\n            scheduler: {\n                source: dataSourceBinding('source', 'dataSource', 'setDataSource').extend({\n                    dataBound: function (e) {\n                        var idx;\n                        var length;\n                        var widget = this.widget;\n                        var elements = e.addedItems || widget.items();\n                        var data, parents;\n                        if (elements.length) {\n                            data = e.addedDataItems || widget.dataItems();\n                            parents = this.bindings.source._parents();\n                            for (idx = 0, length = data.length; idx < length; idx++) {\n                                bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n                            }\n                        }\n                    }\n                })\n            },\n            grid: {\n                source: dataSourceBinding('source', 'dataSource', 'setDataSource').extend({\n                    dataBound: function (e) {\n                        var idx, length, widget = this.widget, elements = e.addedItems || widget.items(), parents, data;\n                        if (elements.length) {\n                            data = e.addedDataItems || widget.dataItems();\n                            parents = this.bindings.source._parents();\n                            for (idx = 0, length = data.length; idx < length; idx++) {\n                                bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n                            }\n                        }\n                    }\n                })\n            }\n        };\n        var arraySplice = function (arr, idx, remove, add) {\n            add = add || [];\n            remove = remove || 0;\n            var addLength = add.length;\n            var oldLength = arr.length;\n            var shifted = [].slice.call(arr, idx + remove);\n            var shiftedLength = shifted.length;\n            var index;\n            if (addLength) {\n                addLength = idx + addLength;\n                index = 0;\n                for (; idx < addLength; idx++) {\n                    arr[idx] = add[index];\n                    index++;\n                }\n                arr.length = addLength;\n            } else if (remove) {\n                arr.length = idx;\n                remove += idx;\n                while (idx < remove) {\n                    delete arr[--remove];\n                }\n            }\n            if (shiftedLength) {\n                shiftedLength = idx + shiftedLength;\n                index = 0;\n                for (; idx < shiftedLength; idx++) {\n                    arr[idx] = shifted[index];\n                    index++;\n                }\n                arr.length = shiftedLength;\n            }\n            idx = arr.length;\n            while (idx < oldLength) {\n                delete arr[idx];\n                idx++;\n            }\n        };\n        var BindingTarget = Class.extend({\n            init: function (target, options) {\n                this.target = target;\n                this.options = options;\n                this.toDestroy = [];\n            },\n            bind: function (bindings) {\n                var key, hasValue, hasSource, hasEvents, hasChecked, hasCss, widgetBinding = this instanceof WidgetBindingTarget, specificBinders = this.binders();\n                for (key in bindings) {\n                    if (key == VALUE) {\n                        hasValue = true;\n                    } else if (key == SOURCE) {\n                        hasSource = true;\n                    } else if (key == EVENTS && !widgetBinding) {\n                        hasEvents = true;\n                    } else if (key == CHECKED) {\n                        hasChecked = true;\n                    } else if (key == CSS) {\n                        hasCss = true;\n                    } else {\n                        this.applyBinding(key, bindings, specificBinders);\n                    }\n                }\n                if (hasSource) {\n                    this.applyBinding(SOURCE, bindings, specificBinders);\n                }\n                if (hasValue) {\n                    this.applyBinding(VALUE, bindings, specificBinders);\n                }\n                if (hasChecked) {\n                    this.applyBinding(CHECKED, bindings, specificBinders);\n                }\n                if (hasEvents && !widgetBinding) {\n                    this.applyBinding(EVENTS, bindings, specificBinders);\n                }\n                if (hasCss && !widgetBinding) {\n                    this.applyBinding(CSS, bindings, specificBinders);\n                }\n            },\n            binders: function () {\n                return binders[this.target.nodeName.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else if (name !== 'template') {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.nodeName.toLowerCase() + ' element');\n                }\n            },\n            destroy: function () {\n                var idx, length, toDestroy = this.toDestroy;\n                for (idx = 0, length = toDestroy.length; idx < length; idx++) {\n                    toDestroy[idx].destroy();\n                }\n            }\n        });\n        var WidgetBindingTarget = BindingTarget.extend({\n            binders: function () {\n                return binders.widget[this.target.options.name.toLowerCase()] || {};\n            },\n            applyBinding: function (name, bindings, specificBinders) {\n                var binder = specificBinders[name] || binders.widget[name], toDestroy = this.toDestroy, attribute, binding = bindings[name];\n                if (binder) {\n                    binder = new binder(this.target, bindings, this.target.options);\n                    toDestroy.push(binder);\n                    if (binding instanceof Binding) {\n                        binder.bind(binding);\n                        toDestroy.push(binding);\n                    } else {\n                        for (attribute in binding) {\n                            binder.bind(binding, attribute);\n                            toDestroy.push(binding[attribute]);\n                        }\n                    }\n                } else {\n                    throw new Error('The ' + name + ' binding is not supported by the ' + this.target.options.name + ' widget');\n                }\n            }\n        });\n        function bindingTargetForRole(element, roles) {\n            var widget = kendo.initWidget(element, {}, roles);\n            if (widget) {\n                return new WidgetBindingTarget(widget);\n            }\n        }\n        var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g, whiteSpaceRegExp = /\\s/g;\n        function parseBindings(bind) {\n            var result = {}, idx, length, token, colonIndex, key, value, tokens;\n            tokens = bind.match(keyValueRegExp);\n            for (idx = 0, length = tokens.length; idx < length; idx++) {\n                token = tokens[idx];\n                colonIndex = token.indexOf(':');\n                key = token.substring(0, colonIndex);\n                value = token.substring(colonIndex + 1);\n                if (value.charAt(0) == '{') {\n                    value = parseBindings(value);\n                }\n                result[key] = value;\n            }\n            return result;\n        }\n        function createBindings(bindings, source, type) {\n            var binding, result = {};\n            for (binding in bindings) {\n                result[binding] = new type(source, bindings[binding]);\n            }\n            return result;\n        }\n        function bindElement(element, source, roles, parents) {\n            if (!element || element.getAttribute('data-' + kendo.ns + 'stop')) {\n                return;\n            }\n            var role = element.getAttribute('data-' + kendo.ns + 'role'), idx, bind = element.getAttribute('data-' + kendo.ns + 'bind'), childrenCopy = [], deep = true, bindings, options = {}, target;\n            parents = parents || [source];\n            if (role || bind) {\n                unbindElement(element, false);\n            }\n            if (role) {\n                target = bindingTargetForRole(element, roles);\n            }\n            if (bind) {\n                bind = parseBindings(bind.replace(whiteSpaceRegExp, ''));\n                if (!target) {\n                    options = kendo.parseOptions(element, {\n                        textField: '',\n                        valueField: '',\n                        template: '',\n                        valueUpdate: CHANGE,\n                        valuePrimitive: false,\n                        autoBind: true\n                    }, source);\n                    options.roles = roles;\n                    target = new BindingTarget(element, options);\n                }\n                target.source = source;\n                bindings = createBindings(bind, parents, Binding);\n                if (options.template) {\n                    bindings.template = new TemplateBinding(parents, '', options.template);\n                }\n                if (bindings.click) {\n                    bind.events = bind.events || {};\n                    bind.events.click = bind.click;\n                    bindings.click.destroy();\n                    delete bindings.click;\n                }\n                if (bindings.source) {\n                    deep = false;\n                }\n                if (bind.attr) {\n                    bindings.attr = createBindings(bind.attr, parents, Binding);\n                }\n                if (bind.style) {\n                    bindings.style = createBindings(bind.style, parents, Binding);\n                }\n                if (bind.events) {\n                    bindings.events = createBindings(bind.events, parents, EventBinding);\n                }\n                if (bind.css) {\n                    bindings.css = createBindings(bind.css, parents, Binding);\n                }\n                target.bind(bindings);\n            }\n            if (target) {\n                element.kendoBindingTarget = target;\n            }\n            var children = element.children;\n            if (deep && children) {\n                for (idx = 0; idx < children.length; idx++) {\n                    childrenCopy[idx] = children[idx];\n                }\n                for (idx = 0; idx < childrenCopy.length; idx++) {\n                    bindElement(childrenCopy[idx], source, roles, parents);\n                }\n            }\n        }\n        function bind(dom, object) {\n            var idx, length, node, roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\n            object = kendo.observable(object);\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                node = dom[idx];\n                if (node.nodeType === 1) {\n                    bindElement(node, object, roles);\n                }\n            }\n        }\n        function unbindElement(element, destroyWidget) {\n            var bindingTarget = element.kendoBindingTarget;\n            if (bindingTarget) {\n                bindingTarget.destroy();\n                if (deleteExpando) {\n                    delete element.kendoBindingTarget;\n                } else if (element.removeAttribute) {\n                    element.removeAttribute('kendoBindingTarget');\n                } else {\n                    element.kendoBindingTarget = null;\n                }\n            }\n            if (destroyWidget) {\n                var widget = kendo.widgetInstance($(element));\n                if (widget && typeof widget.destroy === FUNCTION) {\n                    widget.destroy();\n                }\n            }\n        }\n        function unbindElementTree(element, destroyWidgets) {\n            unbindElement(element, destroyWidgets);\n            unbindElementChildren(element, destroyWidgets);\n        }\n        function unbindElementChildren(element, destroyWidgets) {\n            var children = element.children;\n            if (children) {\n                for (var idx = 0, length = children.length; idx < length; idx++) {\n                    unbindElementTree(children[idx], destroyWidgets);\n                }\n            }\n        }\n        function unbind(dom) {\n            var idx, length;\n            dom = $(dom);\n            for (idx = 0, length = dom.length; idx < length; idx++) {\n                unbindElementTree(dom[idx], false);\n            }\n        }\n        function notify(widget, namespace) {\n            var element = widget.element, bindingTarget = element[0].kendoBindingTarget;\n            if (bindingTarget) {\n                bind(element, bindingTarget.source, namespace);\n            }\n        }\n        function retrievePrimitiveValues(value, valueField) {\n            var values = [];\n            var idx = 0;\n            var length;\n            var item;\n            if (!valueField) {\n                return value;\n            }\n            if (value instanceof ObservableArray) {\n                for (length = value.length; idx < length; idx++) {\n                    item = value[idx];\n                    values[idx] = item.get ? item.get(valueField) : item[valueField];\n                }\n                value = values;\n            } else if (value instanceof ObservableObject) {\n                value = value.get(valueField);\n            }\n            return value;\n        }\n        kendo.unbind = unbind;\n        kendo.bind = bind;\n        kendo.data.binders = binders;\n        kendo.data.Binder = Binder;\n        kendo.notify = notify;\n        kendo.observable = function (object) {\n            if (!(object instanceof ObservableObject)) {\n                object = new ObservableObject(object);\n            }\n            return object;\n        };\n        kendo.observableHierarchy = function (array) {\n            var dataSource = kendo.data.HierarchicalDataSource.create(array);\n            function recursiveRead(data) {\n                var i, children;\n                for (i = 0; i < data.length; i++) {\n                    data[i]._initChildren();\n                    children = data[i].children;\n                    children.fetch();\n                    data[i].items = children.data();\n                    recursiveRead(data[i].items);\n                }\n            }\n            dataSource.fetch();\n            recursiveRead(dataSource.data());\n            dataSource._data._dataSource = dataSource;\n            return dataSource._data;\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.view', [\n        'kendo.core',\n        'kendo.binder',\n        'kendo.fx'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'view',\n        name: 'View',\n        category: 'framework',\n        description: 'The View class instantiates and handles the events of a certain screen from the application.',\n        depends: [\n            'core',\n            'binder',\n            'fx'\n        ],\n        hidden: false\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, attr = kendo.attr, ui = kendo.ui, attrValue = kendo.attrValue, directiveSelector = kendo.directiveSelector, Observable = kendo.Observable, Widget = kendo.ui.Widget, roleSelector = kendo.roleSelector, SCRIPT = 'SCRIPT', INIT = 'init', TRANSITION_START = 'transitionStart', TRANSITION_END = 'transitionEnd', SHOW = 'show', HIDE = 'hide', ATTACH = 'attach', DETACH = 'detach', sizzleErrorRegExp = /unrecognized expression/;\n        var bodyRegExp = /<body[^>]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i;\n        var LOAD_START = 'loadStart';\n        var LOAD_COMPLETE = 'loadComplete';\n        var SHOW_START = 'showStart';\n        var SAME_VIEW_REQUESTED = 'sameViewRequested';\n        var VIEW_SHOW = 'viewShow';\n        var VIEW_TYPE_DETERMINED = 'viewTypeDetermined';\n        var AFTER = 'after';\n        var classNames = {\n            content: 'k-content',\n            view: 'k-view',\n            stretchedView: 'k-stretched-view',\n            widget: 'k-widget',\n            header: 'k-header',\n            footer: 'k-footer'\n        };\n        var View = kendo.ui.Widget.extend({\n            init: function (content, options) {\n                var that = this;\n                options = options || {};\n                that.id = kendo.guid();\n                Observable.fn.init.call(that);\n                that._initOptions(options);\n                that.content = content;\n                if (that.options.renderOnInit) {\n                    Widget.fn.init.call(that, that._createElement(), options);\n                }\n                if (that.options.wrapInSections) {\n                    that._renderSections();\n                }\n                that.tagName = options.tagName || 'div';\n                that.model = options.model;\n                that._wrap = options.wrap !== false;\n                this._evalTemplate = options.evalTemplate || false;\n                that._fragments = {};\n                that.bind([\n                    INIT,\n                    SHOW,\n                    HIDE,\n                    TRANSITION_START,\n                    TRANSITION_END\n                ], options);\n            },\n            options: {\n                name: 'View',\n                renderOnInit: false,\n                wrapInSections: false,\n                detachOnHide: true,\n                detachOnDestroy: true\n            },\n            render: function (container) {\n                var that = this, notInitialized = !that.element;\n                if (notInitialized) {\n                    that.element = that._createElement();\n                }\n                if (container) {\n                    $(container).append(that.element);\n                }\n                if (notInitialized) {\n                    kendo.bind(that.element, that.model);\n                    that.trigger(INIT);\n                }\n                if (container) {\n                    that._eachFragment(ATTACH);\n                    that.trigger(SHOW);\n                }\n                return that.element;\n            },\n            clone: function () {\n                return new ViewClone(this);\n            },\n            triggerBeforeShow: function () {\n                return true;\n            },\n            triggerBeforeHide: function () {\n                return true;\n            },\n            showStart: function () {\n                var that = this;\n                var element = that.render();\n                if (element) {\n                    element.css('display', '');\n                }\n                this.trigger(SHOW, { view: this });\n            },\n            showEnd: function () {\n            },\n            hideEnd: function () {\n                this.hide();\n            },\n            beforeTransition: function (type) {\n                this.trigger(TRANSITION_START, { type: type });\n            },\n            afterTransition: function (type) {\n                this.trigger(TRANSITION_END, { type: type });\n            },\n            hide: function () {\n                if (this.options.detachOnHide) {\n                    this._eachFragment(DETACH);\n                    $(this.element).detach();\n                }\n                this.trigger(HIDE);\n            },\n            destroy: function () {\n                var that = this;\n                var element = that.element;\n                if (element) {\n                    Widget.fn.destroy.call(that);\n                    kendo.unbind(element);\n                    kendo.destroy(element);\n                    if (that.options.detachOnDestroy) {\n                        element.remove();\n                    }\n                }\n            },\n            purge: function () {\n                var that = this;\n                that.destroy();\n                $(that.element).add(that.content).add(that.wrapper).off().remove();\n            },\n            fragments: function (fragments) {\n                $.extend(this._fragments, fragments);\n            },\n            _eachFragment: function (methodName) {\n                for (var placeholder in this._fragments) {\n                    this._fragments[placeholder][methodName](this, placeholder);\n                }\n            },\n            _createElement: function () {\n                var that = this, wrapper = '<' + that.tagName + ' />', element, content;\n                try {\n                    content = $(document.getElementById(that.content) || that.content);\n                    if (content[0].tagName === SCRIPT) {\n                        content = content.html();\n                    }\n                } catch (e) {\n                    if (sizzleErrorRegExp.test(e.message)) {\n                        content = that.content;\n                    }\n                }\n                if (typeof content === 'string') {\n                    content = content.replace(/^\\s+|\\s+$/g, '');\n                    if (that._evalTemplate) {\n                        content = kendo.template(content)(that.model || {});\n                    }\n                    element = $(wrapper).append(content);\n                    if (!that._wrap) {\n                        element = element.contents();\n                    }\n                } else {\n                    element = content;\n                    if (that._evalTemplate) {\n                        var result = $(kendo.template($('<div />').append(element.clone(true)).html())(that.model || {}));\n                        if ($.contains(document, element[0])) {\n                            element.replaceWith(result);\n                        }\n                        element = result;\n                    }\n                    if (that._wrap) {\n                        element = element.wrapAll(wrapper).parent();\n                    }\n                }\n                return element;\n            },\n            _renderSections: function () {\n                var that = this;\n                if (that.options.wrapInSections) {\n                    that._wrapper();\n                    that._createContent();\n                    that._createHeader();\n                    that._createFooter();\n                }\n            },\n            _wrapper: function () {\n                var that = this;\n                var content = that.content;\n                if (content.is(roleSelector('view'))) {\n                    that.wrapper = that.content;\n                } else {\n                    that.wrapper = content.wrap('<div data-' + kendo.ns + 'stretch=\"true\" data-' + kendo.ns + 'role=\"view\" data-' + kendo.ns + 'init-widgets=\"false\"></div>').parent();\n                }\n                var wrapper = that.wrapper;\n                wrapper.attr('id', that.id);\n                wrapper.addClass(classNames.view);\n                wrapper.addClass(classNames.widget);\n                wrapper.attr('role', 'view');\n            },\n            _createContent: function () {\n                var that = this;\n                var wrapper = $(that.wrapper);\n                var contentSelector = roleSelector('content');\n                if (!wrapper.children(contentSelector)[0]) {\n                    var ccontentElements = wrapper.children().filter(function () {\n                        var child = $(this);\n                        if (!child.is(roleSelector('header')) && !child.is(roleSelector('footer'))) {\n                            return child;\n                        }\n                    });\n                    ccontentElements.wrap('<div ' + attr('role') + '=\"content\"></div>');\n                }\n                this.contentElement = wrapper.children(roleSelector('content'));\n                this.contentElement.addClass(classNames.stretchedView).addClass(classNames.content);\n            },\n            _createHeader: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                this.header = wrapper.children(roleSelector('header')).addClass(classNames.header);\n            },\n            _createFooter: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                this.footer = wrapper.children(roleSelector('footer')).addClass(classNames.footer);\n            }\n        });\n        var ViewClone = kendo.Class.extend({\n            init: function (view) {\n                $.extend(this, {\n                    element: view.element.clone(true),\n                    transition: view.transition,\n                    id: view.id\n                });\n                view.element.parent().append(this.element);\n            },\n            hideEnd: function () {\n                this.element.remove();\n            },\n            beforeTransition: $.noop,\n            afterTransition: $.noop\n        });\n        var Layout = View.extend({\n            init: function (content, options) {\n                View.fn.init.call(this, content, options);\n                this.containers = {};\n            },\n            container: function (selector) {\n                var container = this.containers[selector];\n                if (!container) {\n                    container = this._createContainer(selector);\n                    this.containers[selector] = container;\n                }\n                return container;\n            },\n            showIn: function (selector, view, transition) {\n                this.container(selector).show(view, transition);\n            },\n            _createContainer: function (selector) {\n                var root = this.render(), element = root.find(selector), container;\n                if (!element.length && root.is(selector)) {\n                    if (root.is(selector)) {\n                        element = root;\n                    } else {\n                        throw new Error('can\\'t find a container with the specified ' + selector + ' selector');\n                    }\n                }\n                container = new ViewContainer(element);\n                container.bind('accepted', function (e) {\n                    e.view.render(element);\n                });\n                return container;\n            }\n        });\n        var Fragment = View.extend({\n            attach: function (view, placeholder) {\n                view.element.find(placeholder).replaceWith(this.render());\n            },\n            detach: function () {\n            }\n        });\n        var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\n        function parseTransition(transition) {\n            if (!transition) {\n                return {};\n            }\n            var matches = transition.match(transitionRegExp) || [];\n            return {\n                type: matches[1],\n                direction: matches[3],\n                reverse: matches[5] === 'reverse'\n            };\n        }\n        var ViewContainer = Observable.extend({\n            init: function (container) {\n                Observable.fn.init.call(this);\n                this.container = container;\n                this.history = [];\n                this.view = null;\n                this.running = false;\n            },\n            after: function () {\n                this.running = false;\n                this.trigger('complete', { view: this.view });\n                this.trigger('after');\n            },\n            end: function () {\n                this.view.showEnd();\n                this.previous.hideEnd();\n                this.after();\n            },\n            show: function (view, transition, locationID) {\n                if (!view.triggerBeforeShow() || this.view && !this.view.triggerBeforeHide()) {\n                    this.trigger('after');\n                    return false;\n                }\n                locationID = locationID || view.id;\n                var that = this, current = view === that.view ? view.clone() : that.view, history = that.history, previousEntry = history[history.length - 2] || {}, back = previousEntry.id === locationID, theTransition = transition || (back ? history[history.length - 1].transition : view.transition), transitionData = parseTransition(theTransition);\n                if (that.running) {\n                    that.effect.stop();\n                }\n                if (theTransition === 'none') {\n                    theTransition = null;\n                }\n                that.trigger('accepted', { view: view });\n                that.view = view;\n                that.previous = current;\n                that.running = true;\n                if (!back) {\n                    history.push({\n                        id: locationID,\n                        transition: theTransition\n                    });\n                } else {\n                    history.pop();\n                }\n                if (!current) {\n                    view.showStart();\n                    view.showEnd();\n                    that.after();\n                    return true;\n                }\n                if (!theTransition || !kendo.effects.enabled) {\n                    view.showStart();\n                    that.end();\n                } else {\n                    view.element.addClass('k-fx-hidden');\n                    view.showStart();\n                    if (back && !transition) {\n                        transitionData.reverse = !transitionData.reverse;\n                    }\n                    that.effect = kendo.fx(view.element).replace(current.element, transitionData.type).beforeTransition(function () {\n                        view.beforeTransition('show');\n                        current.beforeTransition('hide');\n                    }).afterTransition(function () {\n                        view.afterTransition('show');\n                        current.afterTransition('hide');\n                    }).direction(transitionData.direction).setReverse(transitionData.reverse);\n                    that.effect.run().then(function () {\n                        that.end();\n                    });\n                }\n                return true;\n            },\n            destroy: function () {\n                var that = this;\n                var view = that.view;\n                if (view && view.destroy) {\n                    view.destroy();\n                }\n            }\n        });\n        var ViewEngine = Observable.extend({\n            init: function (options) {\n                var that = this, views, container;\n                Observable.fn.init.call(that);\n                that.options = options;\n                $.extend(that, options);\n                that.sandbox = $('<div />');\n                container = that.container;\n                views = that._hideViews(container);\n                that.rootView = views.first();\n                that.layouts = {};\n                that.viewContainer = new kendo.ViewContainer(that.container);\n                that.viewContainer.bind('accepted', function (e) {\n                    e.view.params = that.params;\n                });\n                that.viewContainer.bind('complete', function (e) {\n                    that.trigger(VIEW_SHOW, { view: e.view });\n                });\n                that.viewContainer.bind(AFTER, function () {\n                    that.trigger(AFTER);\n                });\n                this.bind(this.events, options);\n            },\n            events: [\n                SHOW_START,\n                AFTER,\n                VIEW_SHOW,\n                LOAD_START,\n                LOAD_COMPLETE,\n                SAME_VIEW_REQUESTED,\n                VIEW_TYPE_DETERMINED\n            ],\n            destroy: function () {\n                var that = this;\n                var viewContainer = that.viewContainer;\n                kendo.destroy(that.container);\n                for (var id in that.layouts) {\n                    this.layouts[id].destroy();\n                }\n                if (viewContainer) {\n                    viewContainer.destroy();\n                }\n            },\n            view: function () {\n                return this.viewContainer.view;\n            },\n            showView: function (url, transition, params) {\n                url = url.replace(new RegExp('^' + this.remoteViewURLPrefix), '');\n                if (url === '' && this.remoteViewURLPrefix) {\n                    url = '/';\n                }\n                if (url.replace(/^#/, '') === this.url) {\n                    this.trigger(SAME_VIEW_REQUESTED);\n                    return false;\n                }\n                this.trigger(SHOW_START);\n                var that = this, element = that._findViewElement(url), view = kendo.widgetInstance(element);\n                that.url = url.replace(/^#/, '');\n                that.params = params;\n                if (view && view.reload) {\n                    view.purge();\n                    element = [];\n                }\n                this.trigger(VIEW_TYPE_DETERMINED, {\n                    remote: element.length === 0,\n                    url: url\n                });\n                if (element[0]) {\n                    if (!view) {\n                        view = that._createView(element);\n                    }\n                    return that.viewContainer.show(view, transition, url);\n                } else {\n                    return true;\n                }\n            },\n            append: function (html, url) {\n                var sandbox = this.sandbox, urlPath = (url || '').split('?')[0], container = this.container, views, view;\n                if (bodyRegExp.test(html)) {\n                    html = RegExp.$1;\n                }\n                sandbox[0].innerHTML = html;\n                container.append(sandbox.children('script, style'));\n                views = this._hideViews(sandbox);\n                view = views.first();\n                if (!view.length) {\n                    views = view = sandbox.wrapInner('<div data-role=view />').children();\n                }\n                if (urlPath) {\n                    view.hide().attr(attr('url'), urlPath);\n                }\n                container.append(views);\n                return this._createView(view);\n            },\n            _locate: function (selectors) {\n                return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n            },\n            _findViewElement: function (url) {\n                var element, urlPath = url.split('?')[0];\n                if (!urlPath) {\n                    return this.rootView;\n                }\n                element = this.container.children('[' + attr('url') + '=\\'' + urlPath + '\\']');\n                if (!element[0] && urlPath.indexOf('/') === -1) {\n                    element = this.container.children(urlPath.charAt(0) === '#' ? urlPath : '#' + urlPath);\n                }\n                if (!element[0]) {\n                    element = this._findViewElementById(url);\n                }\n                return element;\n            },\n            _findViewElementById: function (id) {\n                var element = this.container.children('[id=\\'' + id + '\\']');\n                return element;\n            },\n            _createView: function (element) {\n                return this._createSpaView(element);\n            },\n            _createMobileView: function (element) {\n                return kendo.initWidget(element, {\n                    defaultTransition: this.transition,\n                    loader: this.loader,\n                    container: this.container,\n                    getLayout: this.getLayoutProxy,\n                    modelScope: this.modelScope,\n                    reload: attrValue(element, 'reload')\n                }, ui.roles);\n            },\n            _createSpaView: function (element) {\n                var viewOptions = (this.options || {}).viewOptions || {};\n                return new kendo.View(element, {\n                    renderOnInit: viewOptions.renderOnInit,\n                    wrap: viewOptions.wrap || false,\n                    wrapInSections: viewOptions.wrapInSections,\n                    detachOnHide: viewOptions.detachOnHide,\n                    detachOnDestroy: viewOptions.detachOnDestroy\n                });\n            },\n            _hideViews: function (container) {\n                return container.children(this._locate('view')).hide();\n            }\n        });\n        kendo.ViewEngine = ViewEngine;\n        kendo.ViewContainer = ViewContainer;\n        kendo.Fragment = Fragment;\n        kendo.Layout = Layout;\n        kendo.View = View;\n        kendo.ViewClone = ViewClone;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.data.signalr', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'data.signalr',\n        name: 'SignalR',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($) {\n        var kendo = window.kendo;\n        var isFunction = kendo.isFunction;\n        function isJQueryPromise(promise) {\n            return promise && isFunction(promise.done) && isFunction(promise.fail);\n        }\n        function isNativePromise(promise) {\n            return promise && isFunction(promise.then) && isFunction(promise.catch);\n        }\n        var transport = kendo.data.RemoteTransport.extend({\n            init: function (options) {\n                var signalr = options && options.signalr ? options.signalr : {};\n                var promise = signalr.promise;\n                if (!promise) {\n                    throw new Error('The \"promise\" option must be set.');\n                }\n                if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\n                    throw new Error('The \"promise\" option must be a Promise.');\n                }\n                this.promise = promise;\n                var hub = signalr.hub;\n                if (!hub) {\n                    throw new Error('The \"hub\" option must be set.');\n                }\n                if (typeof hub.on != 'function' || typeof hub.invoke != 'function') {\n                    throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\n                }\n                this.hub = hub;\n                kendo.data.RemoteTransport.fn.init.call(this, options);\n            },\n            push: function (callbacks) {\n                var client = this.options.signalr.client || {};\n                if (client.create) {\n                    this.hub.on(client.create, callbacks.pushCreate);\n                }\n                if (client.update) {\n                    this.hub.on(client.update, callbacks.pushUpdate);\n                }\n                if (client.destroy) {\n                    this.hub.on(client.destroy, callbacks.pushDestroy);\n                }\n            },\n            _crud: function (options, type) {\n                var hub = this.hub;\n                var promise = this.promise;\n                var server = this.options.signalr.server;\n                if (!server || !server[type]) {\n                    throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\n                }\n                var args = [server[type]];\n                var data = this.parameterMap(options.data, type);\n                if (!$.isEmptyObject(data)) {\n                    args.push(data);\n                }\n                if (isJQueryPromise(promise)) {\n                    promise.done(function () {\n                        hub.invoke.apply(hub, args).done(options.success).fail(options.error);\n                    });\n                } else if (isNativePromise(promise)) {\n                    promise.then(function () {\n                        hub.invoke.apply(hub, args).then(options.success).catch(options.error);\n                    });\n                }\n            },\n            read: function (options) {\n                this._crud(options, 'read');\n            },\n            create: function (options) {\n                this._crud(options, 'create');\n            },\n            update: function (options) {\n                this._crud(options, 'update');\n            },\n            destroy: function (options) {\n                this._crud(options, 'destroy');\n            }\n        });\n        $.extend(true, kendo.data, { transports: { signalr: transport } });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.userevents', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'userevents',\n        name: 'User Events',\n        category: 'framework',\n        depends: ['core'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, Class = kendo.Class, Observable = kendo.Observable, now = $.now, extend = $.extend, OS = support.mobileOS, invalidZeroEvents = OS && OS.android, DEFAULT_MIN_HOLD = 800, CLICK_DELAY = 300, DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, PRESS = 'press', HOLD = 'hold', SELECT = 'select', START = 'start', MOVE = 'move', END = 'end', CANCEL = 'cancel', TAP = 'tap', DOUBLETAP = 'doubleTap', RELEASE = 'release', GESTURESTART = 'gesturestart', GESTURECHANGE = 'gesturechange', GESTUREEND = 'gestureend', GESTURETAP = 'gesturetap';\n        var THRESHOLD = {\n            'api': 0,\n            'touch': 0,\n            'mouse': 9,\n            'pointer': 9\n        };\n        var ENABLE_GLOBAL_SURFACE = !support.touch || support.mouseAndTouchPresent;\n        function touchDelta(touch1, touch2) {\n            var x1 = touch1.x.location, y1 = touch1.y.location, x2 = touch2.x.location, y2 = touch2.y.location, dx = x1 - x2, dy = y1 - y2;\n            return {\n                center: {\n                    x: (x1 + x2) / 2,\n                    y: (y1 + y2) / 2\n                },\n                distance: Math.sqrt(dx * dx + dy * dy)\n            };\n        }\n        function getTouches(e) {\n            var touches = [], originalEvent = e.originalEvent, currentTarget = e.currentTarget, idx = 0, length, changedTouches, touch;\n            if (e.api) {\n                touches.push({\n                    id: 2,\n                    event: e,\n                    target: e.target,\n                    currentTarget: e.target,\n                    location: e,\n                    type: 'api'\n                });\n            } else if (e.type.match(/touch/)) {\n                changedTouches = originalEvent ? originalEvent.changedTouches : [];\n                for (length = changedTouches.length; idx < length; idx++) {\n                    touch = changedTouches[idx];\n                    touches.push({\n                        location: touch,\n                        event: e,\n                        target: touch.target,\n                        currentTarget: currentTarget,\n                        id: touch.identifier,\n                        type: 'touch'\n                    });\n                }\n            } else if (support.pointers || support.msPointers) {\n                touches.push({\n                    location: originalEvent,\n                    event: e,\n                    target: e.target,\n                    currentTarget: currentTarget,\n                    id: originalEvent.pointerId,\n                    type: 'pointer'\n                });\n            } else {\n                touches.push({\n                    id: 1,\n                    event: e,\n                    target: e.target,\n                    currentTarget: currentTarget,\n                    location: e,\n                    type: 'mouse'\n                });\n            }\n            return touches;\n        }\n        var TouchAxis = Class.extend({\n            init: function (axis, location) {\n                var that = this;\n                that.axis = axis;\n                that._updateLocationData(location);\n                that.startLocation = that.location;\n                that.velocity = that.delta = 0;\n                that.timeStamp = now();\n            },\n            move: function (location) {\n                var that = this, offset = location['page' + that.axis], timeStamp = now(), timeDelta = timeStamp - that.timeStamp || 1;\n                if (!offset && invalidZeroEvents) {\n                    return;\n                }\n                that.delta = offset - that.location;\n                that._updateLocationData(location);\n                that.initialDelta = offset - that.startLocation;\n                that.velocity = that.delta / timeDelta;\n                that.timeStamp = timeStamp;\n            },\n            _updateLocationData: function (location) {\n                var that = this, axis = that.axis;\n                that.location = location['page' + axis];\n                that.client = location['client' + axis];\n                that.screen = location['screen' + axis];\n            }\n        });\n        var Touch = Class.extend({\n            init: function (userEvents, target, touchInfo) {\n                extend(this, {\n                    x: new TouchAxis('X', touchInfo.location),\n                    y: new TouchAxis('Y', touchInfo.location),\n                    type: touchInfo.type,\n                    useClickAsTap: userEvents.useClickAsTap,\n                    threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n                    userEvents: userEvents,\n                    target: target,\n                    currentTarget: touchInfo.currentTarget,\n                    initialTouch: touchInfo.target,\n                    id: touchInfo.id,\n                    pressEvent: touchInfo,\n                    _clicks: userEvents._clicks,\n                    supportDoubleTap: userEvents.supportDoubleTap,\n                    _moved: false,\n                    _finished: false\n                });\n            },\n            press: function () {\n                this._holdTimeout = setTimeout($.proxy(this, '_hold'), this.userEvents.minHold);\n                this._trigger(PRESS, this.pressEvent);\n            },\n            _tap: function (touchInfo) {\n                var that = this;\n                that.userEvents._clicks++;\n                if (that.userEvents._clicks == 1) {\n                    that._clickTimeout = setTimeout(function () {\n                        if (that.userEvents._clicks == 1) {\n                            that._trigger(TAP, touchInfo);\n                        } else {\n                            that._trigger(DOUBLETAP, touchInfo);\n                        }\n                        that.userEvents._clicks = 0;\n                    }, CLICK_DELAY);\n                }\n            },\n            _hold: function () {\n                this._trigger(HOLD, this.pressEvent);\n            },\n            move: function (touchInfo) {\n                var that = this;\n                if (that._finished) {\n                    return;\n                }\n                that.x.move(touchInfo.location);\n                that.y.move(touchInfo.location);\n                if (!that._moved) {\n                    if (that._withinIgnoreThreshold()) {\n                        return;\n                    }\n                    if (!UserEvents.current || UserEvents.current === that.userEvents) {\n                        that._start(touchInfo);\n                    } else {\n                        return that.dispose();\n                    }\n                }\n                if (!that._finished) {\n                    that._trigger(MOVE, touchInfo);\n                }\n            },\n            end: function (touchInfo) {\n                this.endTime = now();\n                if (this._finished) {\n                    return;\n                }\n                this._finished = true;\n                this._trigger(RELEASE, touchInfo);\n                if (this._moved) {\n                    this._trigger(END, touchInfo);\n                } else {\n                    if (!this.useClickAsTap) {\n                        if (this.supportDoubleTap) {\n                            this._tap(touchInfo);\n                        } else {\n                            this._trigger(TAP, touchInfo);\n                        }\n                    }\n                }\n                clearTimeout(this._holdTimeout);\n                this.dispose();\n            },\n            dispose: function () {\n                var userEvents = this.userEvents, activeTouches = userEvents.touches;\n                this._finished = true;\n                this.pressEvent = null;\n                clearTimeout(this._holdTimeout);\n                activeTouches.splice($.inArray(this, activeTouches), 1);\n            },\n            skip: function () {\n                this.dispose();\n            },\n            cancel: function () {\n                this.dispose();\n            },\n            isMoved: function () {\n                return this._moved;\n            },\n            _start: function (touchInfo) {\n                clearTimeout(this._holdTimeout);\n                this.startTime = now();\n                this._moved = true;\n                this._trigger(START, touchInfo);\n            },\n            _trigger: function (name, touchInfo) {\n                var that = this, jQueryEvent = touchInfo.event, data = {\n                        touch: that,\n                        x: that.x,\n                        y: that.y,\n                        target: that.target,\n                        event: jQueryEvent\n                    };\n                if (that.userEvents.notify(name, data)) {\n                    jQueryEvent.preventDefault();\n                }\n            },\n            _withinIgnoreThreshold: function () {\n                var xDelta = this.x.initialDelta, yDelta = this.y.initialDelta;\n                return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n            }\n        });\n        function withEachUpEvent(callback) {\n            var downEvents = kendo.eventMap.up.split(' '), idx = 0, length = downEvents.length;\n            for (; idx < length; idx++) {\n                callback(downEvents[idx]);\n            }\n        }\n        var UserEvents = Observable.extend({\n            init: function (element, options) {\n                var that = this, filter, ns = kendo.guid();\n                options = options || {};\n                filter = that.filter = options.filter;\n                that.threshold = options.threshold || DEFAULT_THRESHOLD;\n                that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n                that.touches = [];\n                that._maxTouches = options.multiTouch ? 2 : 1;\n                that.allowSelection = options.allowSelection;\n                that.captureUpIfMoved = options.captureUpIfMoved;\n                that.useClickAsTap = !options.fastTap && !support.delayedClick();\n                that.eventNS = ns;\n                that._clicks = 0;\n                that.supportDoubleTap = options.supportDoubleTap;\n                element = $(element).handler(that);\n                Observable.fn.init.call(that);\n                extend(that, {\n                    element: element,\n                    surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n                    stopPropagation: options.stopPropagation,\n                    pressed: false\n                });\n                that.surface.handler(that).on(kendo.applyEventMap('move', ns), '_move').on(kendo.applyEventMap('up cancel', ns), '_end');\n                element.on(kendo.applyEventMap('down', ns), filter, '_start');\n                if (that.useClickAsTap) {\n                    element.on(kendo.applyEventMap('click', ns), filter, '_click');\n                }\n                if (support.pointers || support.msPointers) {\n                    if (support.browser.version < 11) {\n                        var defaultAction = 'pinch-zoom double-tap-zoom';\n                        element.css('-ms-touch-action', options.touchAction && options.touchAction != 'none' ? defaultAction + ' ' + options.touchAction : defaultAction);\n                    } else {\n                        element.css('touch-action', options.touchAction || 'none');\n                    }\n                }\n                if (options.preventDragEvent) {\n                    element.on(kendo.applyEventMap('dragstart', ns), kendo.preventDefault);\n                }\n                element.on(kendo.applyEventMap('mousedown', ns), filter, { root: element }, '_select');\n                if (that.captureUpIfMoved && support.eventCapture) {\n                    var surfaceElement = that.surface[0], preventIfMovingProxy = $.proxy(that.preventIfMoving, that);\n                    withEachUpEvent(function (eventName) {\n                        surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n                    });\n                }\n                that.bind([\n                    PRESS,\n                    HOLD,\n                    TAP,\n                    DOUBLETAP,\n                    START,\n                    MOVE,\n                    END,\n                    RELEASE,\n                    CANCEL,\n                    GESTURESTART,\n                    GESTURECHANGE,\n                    GESTUREEND,\n                    GESTURETAP,\n                    SELECT\n                ], options);\n            },\n            preventIfMoving: function (e) {\n                if (this._isMoved()) {\n                    e.preventDefault();\n                }\n            },\n            destroy: function () {\n                var that = this;\n                if (that._destroyed) {\n                    return;\n                }\n                that._destroyed = true;\n                if (that.captureUpIfMoved && support.eventCapture) {\n                    var surfaceElement = that.surface[0];\n                    withEachUpEvent(function (eventName) {\n                        surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n                    });\n                }\n                that.element.kendoDestroy(that.eventNS);\n                that.surface.kendoDestroy(that.eventNS);\n                that.element.removeData('handler');\n                that.surface.removeData('handler');\n                that._disposeAll();\n                that.unbind();\n                delete that.surface;\n                delete that.element;\n                delete that.currentTarget;\n            },\n            capture: function () {\n                UserEvents.current = this;\n            },\n            cancel: function () {\n                this._disposeAll();\n                this.trigger(CANCEL);\n            },\n            notify: function (eventName, data) {\n                var that = this, touches = that.touches;\n                if (this._isMultiTouch()) {\n                    switch (eventName) {\n                    case MOVE:\n                        eventName = GESTURECHANGE;\n                        break;\n                    case END:\n                        eventName = GESTUREEND;\n                        break;\n                    case TAP:\n                        eventName = GESTURETAP;\n                        break;\n                    }\n                    extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n                }\n                return this.trigger(eventName, extend(data, { type: eventName }));\n            },\n            press: function (x, y, target) {\n                this._apiCall('_start', x, y, target);\n            },\n            move: function (x, y) {\n                this._apiCall('_move', x, y);\n            },\n            end: function (x, y) {\n                this._apiCall('_end', x, y);\n            },\n            _isMultiTouch: function () {\n                return this.touches.length > 1;\n            },\n            _maxTouchesReached: function () {\n                return this.touches.length >= this._maxTouches;\n            },\n            _disposeAll: function () {\n                var touches = this.touches;\n                while (touches.length > 0) {\n                    touches.pop().dispose();\n                }\n            },\n            _isMoved: function () {\n                return $.grep(this.touches, function (touch) {\n                    return touch.isMoved();\n                }).length;\n            },\n            _select: function (e) {\n                if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n                    e.preventDefault();\n                }\n            },\n            _start: function (e) {\n                var that = this, idx = 0, filter = that.filter, target, touches = getTouches(e), length = touches.length, touch, which = e.which;\n                if (which && which > 1 || that._maxTouchesReached()) {\n                    return;\n                }\n                UserEvents.current = null;\n                that.currentTarget = e.currentTarget;\n                if (that.stopPropagation) {\n                    e.stopPropagation();\n                }\n                for (; idx < length; idx++) {\n                    if (that._maxTouchesReached()) {\n                        break;\n                    }\n                    touch = touches[idx];\n                    if (filter) {\n                        target = $(touch.currentTarget);\n                    } else {\n                        target = that.element;\n                    }\n                    if (!target.length) {\n                        continue;\n                    }\n                    touch = new Touch(that, target, touch);\n                    that.touches.push(touch);\n                    touch.press();\n                    if (that._isMultiTouch()) {\n                        that.notify('gesturestart', {});\n                    }\n                }\n            },\n            _move: function (e) {\n                this._eachTouch('move', e);\n            },\n            _end: function (e) {\n                this._eachTouch('end', e);\n            },\n            _click: function (e) {\n                var data = {\n                    touch: {\n                        initialTouch: e.target,\n                        target: $(e.currentTarget),\n                        endTime: now(),\n                        x: {\n                            location: e.pageX,\n                            client: e.clientX\n                        },\n                        y: {\n                            location: e.pageY,\n                            client: e.clientY\n                        }\n                    },\n                    x: e.pageX,\n                    y: e.pageY,\n                    target: $(e.currentTarget),\n                    event: e,\n                    type: 'tap'\n                };\n                if (this.trigger('tap', data)) {\n                    e.preventDefault();\n                }\n            },\n            _eachTouch: function (methodName, e) {\n                var that = this, dict = {}, touches = getTouches(e), activeTouches = that.touches, idx, touch, touchInfo, matchingTouch;\n                for (idx = 0; idx < activeTouches.length; idx++) {\n                    touch = activeTouches[idx];\n                    dict[touch.id] = touch;\n                }\n                for (idx = 0; idx < touches.length; idx++) {\n                    touchInfo = touches[idx];\n                    matchingTouch = dict[touchInfo.id];\n                    if (matchingTouch) {\n                        matchingTouch[methodName](touchInfo);\n                    }\n                }\n            },\n            _apiCall: function (type, x, y, target) {\n                this[type]({\n                    api: true,\n                    pageX: x,\n                    pageY: y,\n                    clientX: x,\n                    clientY: y,\n                    target: $(target || this.element)[0],\n                    stopPropagation: $.noop,\n                    preventDefault: $.noop\n                });\n            }\n        });\n        UserEvents.defaultThreshold = function (value) {\n            DEFAULT_THRESHOLD = value;\n        };\n        UserEvents.minHold = function (value) {\n            DEFAULT_MIN_HOLD = value;\n        };\n        kendo.getTouches = getTouches;\n        kendo.touchDelta = touchDelta;\n        kendo.UserEvents = UserEvents;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.draganddrop', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'draganddrop',\n        name: 'Drag & drop',\n        category: 'framework',\n        description: 'Drag & drop functionality for any DOM element.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, document = window.document, $window = $(window), Class = kendo.Class, Widget = kendo.ui.Widget, Observable = kendo.Observable, UserEvents = kendo.UserEvents, proxy = $.proxy, extend = $.extend, getOffset = kendo.getOffset, draggables = {}, dropTargets = {}, dropAreas = {}, lastDropTarget, elementUnderCursor = kendo.elementUnderCursor, KEYUP = 'keyup', CHANGE = 'change', DRAGSTART = 'dragstart', HOLD = 'hold', DRAG = 'drag', DRAGEND = 'dragend', DRAGCANCEL = 'dragcancel', HINTDESTROYED = 'hintDestroyed', DRAGENTER = 'dragenter', DRAGLEAVE = 'dragleave', DROP = 'drop';\n        function contains(parent, child) {\n            try {\n                return $.contains(parent, child) || parent == child;\n            } catch (e) {\n                return false;\n            }\n        }\n        function numericCssPropery(element, property) {\n            return parseInt(element.css(property), 10) || 0;\n        }\n        function within(value, range) {\n            return Math.min(Math.max(value, range.min), range.max);\n        }\n        function containerBoundaries(container, element) {\n            var offset = getOffset(container), outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, minX = offset.left + numericCssPropery(container, 'borderLeftWidth') + numericCssPropery(container, 'paddingLeft'), minY = offset.top + numericCssPropery(container, 'borderTopWidth') + numericCssPropery(container, 'paddingTop'), maxX = minX + container.width() - outerWidth(element, true), maxY = minY + container.height() - outerHeight(element, true);\n            return {\n                x: {\n                    min: minX,\n                    max: maxX\n                },\n                y: {\n                    min: minY,\n                    max: maxY\n                }\n            };\n        }\n        function checkTarget(target, targets, areas) {\n            var theTarget, theFilter, i = 0, targetLen = targets && targets.length, areaLen = areas && areas.length;\n            while (target && target.parentNode) {\n                for (i = 0; i < targetLen; i++) {\n                    theTarget = targets[i];\n                    if (theTarget.element[0] === target) {\n                        return {\n                            target: theTarget,\n                            targetElement: target\n                        };\n                    }\n                }\n                for (i = 0; i < areaLen; i++) {\n                    theFilter = areas[i];\n                    if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n                        return {\n                            target: theFilter,\n                            targetElement: target\n                        };\n                    }\n                }\n                target = target.parentNode;\n            }\n            return undefined;\n        }\n        var TapCapture = Observable.extend({\n            init: function (element, options) {\n                var that = this, domElement = element[0];\n                that.capture = false;\n                if (domElement.addEventListener) {\n                    $.each(kendo.eventMap.down.split(' '), function () {\n                        domElement.addEventListener(this, proxy(that._press, that), true);\n                    });\n                    $.each(kendo.eventMap.up.split(' '), function () {\n                        domElement.addEventListener(this, proxy(that._release, that), true);\n                    });\n                } else {\n                    $.each(kendo.eventMap.down.split(' '), function () {\n                        domElement.attachEvent(this, proxy(that._press, that));\n                    });\n                    $.each(kendo.eventMap.up.split(' '), function () {\n                        domElement.attachEvent(this, proxy(that._release, that));\n                    });\n                }\n                Observable.fn.init.call(that);\n                that.bind([\n                    'press',\n                    'release'\n                ], options || {});\n            },\n            captureNext: function () {\n                this.capture = true;\n            },\n            cancelCapture: function () {\n                this.capture = false;\n            },\n            _press: function (e) {\n                var that = this;\n                that.trigger('press');\n                if (that.capture) {\n                    e.preventDefault();\n                }\n            },\n            _release: function (e) {\n                var that = this;\n                that.trigger('release');\n                if (that.capture) {\n                    e.preventDefault();\n                    that.cancelCapture();\n                }\n            }\n        });\n        var PaneDimension = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.forcedEnabled = false;\n                $.extend(that, options);\n                that.scale = 1;\n                if (that.horizontal) {\n                    that.measure = 'offsetWidth';\n                    that.scrollSize = 'scrollWidth';\n                    that.axis = 'x';\n                } else {\n                    that.measure = 'offsetHeight';\n                    that.scrollSize = 'scrollHeight';\n                    that.axis = 'y';\n                }\n            },\n            makeVirtual: function () {\n                $.extend(this, {\n                    virtual: true,\n                    forcedEnabled: true,\n                    _virtualMin: 0,\n                    _virtualMax: 0\n                });\n            },\n            virtualSize: function (min, max) {\n                if (this._virtualMin !== min || this._virtualMax !== max) {\n                    this._virtualMin = min;\n                    this._virtualMax = max;\n                    this.update();\n                }\n            },\n            outOfBounds: function (offset) {\n                return offset > this.max || offset < this.min;\n            },\n            forceEnabled: function () {\n                this.forcedEnabled = true;\n            },\n            getSize: function () {\n                return this.container[0][this.measure];\n            },\n            getTotal: function () {\n                return this.element[0][this.scrollSize];\n            },\n            rescale: function (scale) {\n                this.scale = scale;\n            },\n            update: function (silent) {\n                var that = this, total = that.virtual ? that._virtualMax : that.getTotal(), scaledTotal = total * that.scale, size = that.getSize();\n                if (total === 0 && !that.forcedEnabled) {\n                    return;\n                }\n                that.max = that.virtual ? -that._virtualMin : 0;\n                that.size = size;\n                that.total = scaledTotal;\n                that.min = Math.min(that.max, size - scaledTotal);\n                that.minScale = size / total;\n                that.centerOffset = (scaledTotal - size) / 2;\n                that.enabled = that.forcedEnabled || scaledTotal > size;\n                if (!silent) {\n                    that.trigger(CHANGE, that);\n                }\n            }\n        });\n        var PaneDimensions = Observable.extend({\n            init: function (options) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.x = new PaneDimension(extend({ horizontal: true }, options));\n                that.y = new PaneDimension(extend({ horizontal: false }, options));\n                that.container = options.container;\n                that.forcedMinScale = options.minScale;\n                that.maxScale = options.maxScale || 100;\n                that.bind(CHANGE, options);\n            },\n            rescale: function (newScale) {\n                this.x.rescale(newScale);\n                this.y.rescale(newScale);\n                this.refresh();\n            },\n            centerCoordinates: function () {\n                return {\n                    x: Math.min(0, -this.x.centerOffset),\n                    y: Math.min(0, -this.y.centerOffset)\n                };\n            },\n            refresh: function () {\n                var that = this;\n                that.x.update();\n                that.y.update();\n                that.enabled = that.x.enabled || that.y.enabled;\n                that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n                that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n                that.trigger(CHANGE);\n            }\n        });\n        var PaneAxis = Observable.extend({\n            init: function (options) {\n                var that = this;\n                extend(that, options);\n                Observable.fn.init.call(that);\n            },\n            outOfBounds: function () {\n                return this.dimension.outOfBounds(this.movable[this.axis]);\n            },\n            dragMove: function (delta) {\n                var that = this, dimension = that.dimension, axis = that.axis, movable = that.movable, position = movable[axis] + delta;\n                if (!dimension.enabled) {\n                    return;\n                }\n                if (position < dimension.min && delta < 0 || position > dimension.max && delta > 0) {\n                    delta *= that.resistance;\n                }\n                movable.translateAxis(axis, delta);\n                that.trigger(CHANGE, that);\n            }\n        });\n        var Pane = Class.extend({\n            init: function (options) {\n                var that = this, x, y, resistance, movable;\n                extend(that, { elastic: true }, options);\n                resistance = that.elastic ? 0.5 : 0;\n                movable = that.movable;\n                that.x = x = new PaneAxis({\n                    axis: 'x',\n                    dimension: that.dimensions.x,\n                    resistance: resistance,\n                    movable: movable\n                });\n                that.y = y = new PaneAxis({\n                    axis: 'y',\n                    dimension: that.dimensions.y,\n                    resistance: resistance,\n                    movable: movable\n                });\n                that.userEvents.bind([\n                    'press',\n                    'move',\n                    'end',\n                    'gesturestart',\n                    'gesturechange'\n                ], {\n                    gesturestart: function (e) {\n                        that.gesture = e;\n                        that.offset = that.dimensions.container.offset();\n                    },\n                    press: function (e) {\n                        if ($(e.event.target).closest('a').is('[data-navigate-on-press=true]')) {\n                            e.sender.cancel();\n                        }\n                    },\n                    gesturechange: function (e) {\n                        var previousGesture = that.gesture, previousCenter = previousGesture.center, center = e.center, scaleDelta = e.distance / previousGesture.distance, minScale = that.dimensions.minScale, maxScale = that.dimensions.maxScale, coordinates;\n                        if (movable.scale <= minScale && scaleDelta < 1) {\n                            scaleDelta += (1 - scaleDelta) * 0.8;\n                        }\n                        if (movable.scale * scaleDelta >= maxScale) {\n                            scaleDelta = maxScale / movable.scale;\n                        }\n                        var offsetX = movable.x + that.offset.left, offsetY = movable.y + that.offset.top;\n                        coordinates = {\n                            x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n                            y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n                        };\n                        movable.scaleWith(scaleDelta);\n                        x.dragMove(coordinates.x);\n                        y.dragMove(coordinates.y);\n                        that.dimensions.rescale(movable.scale);\n                        that.gesture = e;\n                        e.preventDefault();\n                    },\n                    move: function (e) {\n                        if (e.event.target.tagName.match(/textarea|input/i)) {\n                            return;\n                        }\n                        if (x.dimension.enabled || y.dimension.enabled) {\n                            x.dragMove(e.x.delta);\n                            y.dragMove(e.y.delta);\n                            e.preventDefault();\n                        } else {\n                            e.touch.skip();\n                        }\n                    },\n                    end: function (e) {\n                        e.preventDefault();\n                    }\n                });\n            }\n        });\n        var TRANSFORM_STYLE = support.transitions.prefix + 'Transform', translate;\n        if (support.hasHW3D) {\n            translate = function (x, y, scale) {\n                return 'translate3d(' + x + 'px,' + y + 'px,0) scale(' + scale + ')';\n            };\n        } else {\n            translate = function (x, y, scale) {\n                return 'translate(' + x + 'px,' + y + 'px) scale(' + scale + ')';\n            };\n        }\n        var Movable = Observable.extend({\n            init: function (element) {\n                var that = this;\n                Observable.fn.init.call(that);\n                that.element = $(element);\n                that.element[0].style.webkitTransformOrigin = 'left top';\n                that.x = 0;\n                that.y = 0;\n                that.scale = 1;\n                that._saveCoordinates(translate(that.x, that.y, that.scale));\n            },\n            translateAxis: function (axis, by) {\n                this[axis] += by;\n                this.refresh();\n            },\n            scaleTo: function (scale) {\n                this.scale = scale;\n                this.refresh();\n            },\n            scaleWith: function (scaleDelta) {\n                this.scale *= scaleDelta;\n                this.refresh();\n            },\n            translate: function (coordinates) {\n                this.x += coordinates.x;\n                this.y += coordinates.y;\n                this.refresh();\n            },\n            moveAxis: function (axis, value) {\n                this[axis] = value;\n                this.refresh();\n            },\n            moveTo: function (coordinates) {\n                extend(this, coordinates);\n                this.refresh();\n            },\n            refresh: function () {\n                var that = this, x = that.x, y = that.y, newCoordinates;\n                if (that.round) {\n                    x = Math.round(x);\n                    y = Math.round(y);\n                }\n                newCoordinates = translate(x, y, that.scale);\n                if (newCoordinates != that.coordinates) {\n                    if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                        that.element[0].style.position = 'absolute';\n                        that.element[0].style.left = that.x + 'px';\n                        that.element[0].style.top = that.y + 'px';\n                    } else {\n                        that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n                    }\n                    that._saveCoordinates(newCoordinates);\n                    that.trigger(CHANGE);\n                }\n            },\n            _saveCoordinates: function (coordinates) {\n                this.coordinates = coordinates;\n            }\n        });\n        function destroyDroppable(collection, widget) {\n            var groupName = widget.options.group, droppables = collection[groupName], i;\n            Widget.fn.destroy.call(widget);\n            if (droppables.length > 1) {\n                for (i = 0; i < droppables.length; i++) {\n                    if (droppables[i] == widget) {\n                        droppables.splice(i, 1);\n                        break;\n                    }\n                }\n            } else {\n                droppables.length = 0;\n                delete collection[groupName];\n            }\n        }\n        var DropTarget = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var group = that.options.group;\n                if (!(group in dropTargets)) {\n                    dropTargets[group] = [that];\n                } else {\n                    dropTargets[group].push(that);\n                }\n            },\n            events: [\n                DRAGENTER,\n                DRAGLEAVE,\n                DROP\n            ],\n            options: {\n                name: 'DropTarget',\n                group: 'default'\n            },\n            destroy: function () {\n                destroyDroppable(dropTargets, this);\n            },\n            _trigger: function (eventName, e) {\n                var that = this, draggable = draggables[that.options.group];\n                if (draggable) {\n                    return that.trigger(eventName, extend({}, e.event, {\n                        draggable: draggable,\n                        dropTarget: e.dropTarget\n                    }));\n                }\n            },\n            _over: function (e) {\n                this._trigger(DRAGENTER, e);\n            },\n            _out: function (e) {\n                this._trigger(DRAGLEAVE, e);\n            },\n            _drop: function (e) {\n                var that = this, draggable = draggables[that.options.group];\n                if (draggable) {\n                    draggable.dropped = !that._trigger(DROP, e);\n                }\n            }\n        });\n        DropTarget.destroyGroup = function (groupName) {\n            var group = dropTargets[groupName] || dropAreas[groupName], i;\n            if (group) {\n                for (i = 0; i < group.length; i++) {\n                    Widget.fn.destroy.call(group[i]);\n                }\n                group.length = 0;\n                delete dropTargets[groupName];\n                delete dropAreas[groupName];\n            }\n        };\n        DropTarget._cache = dropTargets;\n        var DropTargetArea = DropTarget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                var group = that.options.group;\n                if (!(group in dropAreas)) {\n                    dropAreas[group] = [that];\n                } else {\n                    dropAreas[group].push(that);\n                }\n            },\n            destroy: function () {\n                destroyDroppable(dropAreas, this);\n            },\n            options: {\n                name: 'DropTargetArea',\n                group: 'default',\n                filter: null\n            }\n        });\n        var Draggable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that._activated = false;\n                that.userEvents = new UserEvents(that.element, {\n                    global: true,\n                    allowSelection: true,\n                    filter: that.options.filter,\n                    threshold: that.options.distance,\n                    start: proxy(that._start, that),\n                    hold: proxy(that._hold, that),\n                    move: proxy(that._drag, that),\n                    end: proxy(that._end, that),\n                    cancel: proxy(that._cancel, that),\n                    select: proxy(that._select, that)\n                });\n                that._afterEndHandler = proxy(that._afterEnd, that);\n                that._captureEscape = proxy(that._captureEscape, that);\n            },\n            events: [\n                HOLD,\n                DRAGSTART,\n                DRAG,\n                DRAGEND,\n                DRAGCANCEL,\n                HINTDESTROYED\n            ],\n            options: {\n                name: 'Draggable',\n                distance: kendo.support.touch ? 0 : 5,\n                group: 'default',\n                cursorOffset: null,\n                axis: null,\n                container: null,\n                filter: null,\n                ignore: null,\n                holdToDrag: false,\n                autoScroll: false,\n                dropped: false\n            },\n            cancelHold: function () {\n                this._activated = false;\n            },\n            _captureEscape: function (e) {\n                var that = this;\n                if (e.keyCode === kendo.keys.ESC) {\n                    that._trigger(DRAGCANCEL, { event: e });\n                    that.userEvents.cancel();\n                }\n            },\n            _updateHint: function (e) {\n                var that = this, coordinates, options = that.options, boundaries = that.boundaries, axis = options.axis, cursorOffset = that.options.cursorOffset;\n                if (cursorOffset) {\n                    coordinates = {\n                        left: e.x.location + cursorOffset.left,\n                        top: e.y.location + cursorOffset.top\n                    };\n                } else {\n                    that.hintOffset.left += e.x.delta;\n                    that.hintOffset.top += e.y.delta;\n                    coordinates = $.extend({}, that.hintOffset);\n                }\n                if (boundaries) {\n                    coordinates.top = within(coordinates.top, boundaries.y);\n                    coordinates.left = within(coordinates.left, boundaries.x);\n                }\n                if (axis === 'x') {\n                    delete coordinates.top;\n                } else if (axis === 'y') {\n                    delete coordinates.left;\n                }\n                that.hint.css(coordinates);\n            },\n            _shouldIgnoreTarget: function (target) {\n                var ignoreSelector = this.options.ignore;\n                return ignoreSelector && $(target).is(ignoreSelector);\n            },\n            _select: function (e) {\n                if (!this._shouldIgnoreTarget(e.event.target)) {\n                    e.preventDefault();\n                }\n            },\n            _start: function (e) {\n                var that = this, options = that.options, container = options.container ? $(options.container) : null, hint = options.hint;\n                if (this._shouldIgnoreTarget(e.touch.initialTouch) || options.holdToDrag && !that._activated) {\n                    that.userEvents.cancel();\n                    return;\n                }\n                that.currentTarget = e.target;\n                that.currentTargetOffset = getOffset(that.currentTarget);\n                if (hint) {\n                    if (that.hint) {\n                        that.hint.stop(true, true).remove();\n                    }\n                    that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n                    var offset = getOffset(that.currentTarget);\n                    that.hintOffset = offset;\n                    that.hint.css({\n                        position: 'absolute',\n                        zIndex: 20000,\n                        left: offset.left,\n                        top: offset.top\n                    }).appendTo(document.body);\n                    that.angular('compile', function () {\n                        that.hint.removeAttr('ng-repeat');\n                        var scopeTarget = $(e.target);\n                        while (!scopeTarget.data('$$kendoScope') && scopeTarget.length) {\n                            scopeTarget = scopeTarget.parent();\n                        }\n                        return {\n                            elements: that.hint.get(),\n                            scopeFrom: scopeTarget.data('$$kendoScope')\n                        };\n                    });\n                }\n                draggables[options.group] = that;\n                that.dropped = false;\n                if (container) {\n                    that.boundaries = containerBoundaries(container, that.hint);\n                }\n                $(document).on(KEYUP, that._captureEscape);\n                if (that._trigger(DRAGSTART, e)) {\n                    that.userEvents.cancel();\n                    that._afterEnd();\n                }\n                that.userEvents.capture();\n            },\n            _hold: function (e) {\n                this.currentTarget = e.target;\n                if (this.options.holdToDrag && this._trigger(HOLD, e)) {\n                    this.userEvents.cancel();\n                } else {\n                    this._activated = true;\n                }\n            },\n            _drag: function (e) {\n                e.preventDefault();\n                var cursorElement = this._elementUnderCursor(e);\n                if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n                    this._scrollableParent = findScrollableParent(cursorElement);\n                    this._cursorElement = cursorElement;\n                }\n                this._lastEvent = e;\n                this._processMovement(e, cursorElement);\n                if (this.options.autoScroll) {\n                    if (this._scrollableParent[0]) {\n                        var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n                        this._scrollCompenstation = $.extend({}, this.hintOffset);\n                        this._scrollVelocity = velocity;\n                        if (velocity.y === 0 && velocity.x === 0) {\n                            clearInterval(this._scrollInterval);\n                            this._scrollInterval = null;\n                        } else if (!this._scrollInterval) {\n                            this._scrollInterval = setInterval($.proxy(this, '_autoScroll'), 50);\n                        }\n                    }\n                }\n                if (this.hint) {\n                    this._updateHint(e);\n                }\n            },\n            _processMovement: function (e, cursorElement) {\n                this._withDropTarget(cursorElement, function (target, targetElement) {\n                    if (!target) {\n                        if (lastDropTarget) {\n                            lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n                            lastDropTarget = null;\n                        }\n                        return;\n                    }\n                    if (lastDropTarget) {\n                        if (targetElement === lastDropTarget.targetElement) {\n                            return;\n                        }\n                        lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n                    }\n                    target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n                    lastDropTarget = extend(target, { targetElement: targetElement });\n                });\n                this._trigger(DRAG, extend(e, {\n                    dropTarget: lastDropTarget,\n                    elementUnderCursor: cursorElement\n                }));\n            },\n            _autoScroll: function () {\n                var parent = this._scrollableParent[0], velocity = this._scrollVelocity, compensation = this._scrollCompenstation;\n                if (!parent) {\n                    return;\n                }\n                var cursorElement = this._elementUnderCursor(this._lastEvent);\n                this._processMovement(this._lastEvent, cursorElement);\n                var yIsScrollable, xIsScrollable;\n                var isRootNode = parent === scrollableRoot()[0];\n                if (isRootNode) {\n                    yIsScrollable = document.body.scrollHeight > $window.height();\n                    xIsScrollable = document.body.scrollWidth > $window.width();\n                } else {\n                    yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n                    xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n                }\n                var yDelta = parent.scrollTop + velocity.y;\n                var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n                var xDelta = parent.scrollLeft + velocity.x;\n                var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n                if (yInBounds) {\n                    parent.scrollTop += velocity.y;\n                }\n                if (xInBounds) {\n                    parent.scrollLeft += velocity.x;\n                }\n                if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n                    if (yInBounds) {\n                        compensation.top += velocity.y;\n                    }\n                    if (xInBounds) {\n                        compensation.left += velocity.x;\n                    }\n                    this.hint.css(compensation);\n                }\n            },\n            _end: function (e) {\n                this._withDropTarget(this._elementUnderCursor(e), function (target, targetElement) {\n                    if (target) {\n                        target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n                        lastDropTarget = null;\n                    }\n                });\n                this._cancel(this._trigger(DRAGEND, e));\n            },\n            _cancel: function (isDefaultPrevented) {\n                var that = this;\n                that._scrollableParent = null;\n                this._cursorElement = null;\n                clearInterval(this._scrollInterval);\n                that._activated = false;\n                if (that.hint && !that.dropped) {\n                    setTimeout(function () {\n                        that.hint.stop(true, true);\n                        if (isDefaultPrevented) {\n                            that._afterEndHandler();\n                        } else {\n                            that.hint.animate(that.currentTargetOffset, 'fast', that._afterEndHandler);\n                        }\n                    }, 0);\n                } else {\n                    that._afterEnd();\n                }\n            },\n            _trigger: function (eventName, e) {\n                var that = this;\n                return that.trigger(eventName, extend({}, e.event, {\n                    x: e.x,\n                    y: e.y,\n                    currentTarget: that.currentTarget,\n                    initialTarget: e.touch ? e.touch.initialTouch : null,\n                    dropTarget: e.dropTarget,\n                    elementUnderCursor: e.elementUnderCursor\n                }));\n            },\n            _elementUnderCursor: function (e) {\n                var target = elementUnderCursor(e), hint = this.hint;\n                if (hint && contains(hint[0], target)) {\n                    hint.hide();\n                    target = elementUnderCursor(e);\n                    if (!target) {\n                        target = elementUnderCursor(e);\n                    }\n                    hint.show();\n                }\n                return target;\n            },\n            _withDropTarget: function (element, callback) {\n                var result, group = this.options.group, targets = dropTargets[group], areas = dropAreas[group];\n                if (targets && targets.length || areas && areas.length) {\n                    result = checkTarget(element, targets, areas);\n                    if (result) {\n                        callback(result.target, result.targetElement);\n                    } else {\n                        callback();\n                    }\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that._afterEnd();\n                that.userEvents.destroy();\n                this._scrollableParent = null;\n                this._cursorElement = null;\n                clearInterval(this._scrollInterval);\n                that.currentTarget = null;\n            },\n            _afterEnd: function () {\n                var that = this;\n                if (that.hint) {\n                    that.hint.remove();\n                }\n                delete draggables[that.options.group];\n                that.trigger('destroy');\n                that.trigger(HINTDESTROYED);\n                $(document).off(KEYUP, that._captureEscape);\n            }\n        });\n        kendo.ui.plugin(DropTarget);\n        kendo.ui.plugin(DropTargetArea);\n        kendo.ui.plugin(Draggable);\n        kendo.TapCapture = TapCapture;\n        kendo.containerBoundaries = containerBoundaries;\n        extend(kendo.ui, {\n            Pane: Pane,\n            PaneDimensions: PaneDimensions,\n            Movable: Movable\n        });\n        function scrollableViewPort(element) {\n            var root = scrollableRoot()[0], offset, top, left;\n            if (element[0] === root) {\n                top = root.scrollTop;\n                left = root.scrollLeft;\n                return {\n                    top: top,\n                    left: left,\n                    bottom: top + $window.height(),\n                    right: left + $window.width()\n                };\n            } else {\n                offset = element.offset();\n                offset.bottom = offset.top + element.height();\n                offset.right = offset.left + element.width();\n                return offset;\n            }\n        }\n        function scrollableRoot() {\n            return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\n        }\n        function findScrollableParent(element) {\n            var root = scrollableRoot();\n            if (!element || element === document.body || element === document.documentElement) {\n                return root;\n            }\n            var parent = $(element)[0];\n            while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n                parent = parent.parentNode;\n            }\n            if (parent === document.body) {\n                return root;\n            }\n            return $(parent);\n        }\n        function autoScrollVelocity(mouseX, mouseY, rect) {\n            var velocity = {\n                x: 0,\n                y: 0\n            };\n            var AUTO_SCROLL_AREA = 50;\n            if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n                velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n            } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n                velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n            }\n            if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n                velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n            } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n                velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n            }\n            return velocity;\n        }\n        kendo.ui.Draggable.utils = {\n            autoScrollVelocity: autoScrollVelocity,\n            scrollableViewPort: scrollableViewPort,\n            findScrollableParent: findScrollableParent\n        };\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.mobile.scroller', [\n        'kendo.fx',\n        'kendo.draganddrop'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'mobile.scroller',\n        name: 'Scroller',\n        category: 'mobile',\n        description: 'The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.',\n        depends: [\n            'fx',\n            'draganddrop'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, mobile = kendo.mobile, fx = kendo.effects, ui = mobile.ui, proxy = $.proxy, extend = $.extend, Widget = ui.Widget, Class = kendo.Class, Movable = kendo.ui.Movable, Pane = kendo.ui.Pane, PaneDimensions = kendo.ui.PaneDimensions, Transition = fx.Transition, Animation = fx.Animation, abs = Math.abs, SNAPBACK_DURATION = 500, SCROLLBAR_OPACITY = 0.7, FRICTION = 0.96, VELOCITY_MULTIPLIER = 10, MAX_VELOCITY = 55, OUT_OF_BOUNDS_FRICTION = 0.5, ANIMATED_SCROLLER_PRECISION = 5, RELEASECLASS = 'km-scroller-release', REFRESHCLASS = 'km-scroller-refresh', PULL = 'pull', CHANGE = 'change', RESIZE = 'resize', SCROLL = 'scroll', MOUSE_WHEEL_ID = 2;\n        var ZoomSnapBack = Animation.extend({\n            init: function (options) {\n                var that = this;\n                Animation.fn.init.call(that);\n                extend(that, options);\n                that.userEvents.bind('gestureend', proxy(that.start, that));\n                that.tapCapture.bind('press', proxy(that.cancel, that));\n            },\n            enabled: function () {\n                return this.movable.scale < this.dimensions.minScale;\n            },\n            done: function () {\n                return this.dimensions.minScale - this.movable.scale < 0.01;\n            },\n            tick: function () {\n                var movable = this.movable;\n                movable.scaleWith(1.1);\n                this.dimensions.rescale(movable.scale);\n            },\n            onEnd: function () {\n                var movable = this.movable;\n                movable.scaleTo(this.dimensions.minScale);\n                this.dimensions.rescale(movable.scale);\n            }\n        });\n        var DragInertia = Animation.extend({\n            init: function (options) {\n                var that = this;\n                Animation.fn.init.call(that);\n                extend(that, options, {\n                    transition: new Transition({\n                        axis: options.axis,\n                        movable: options.movable,\n                        onEnd: function () {\n                            that._end();\n                        }\n                    })\n                });\n                that.tapCapture.bind('press', function () {\n                    that.cancel();\n                });\n                that.userEvents.bind('end', proxy(that.start, that));\n                that.userEvents.bind('gestureend', proxy(that.start, that));\n                that.userEvents.bind('tap', proxy(that.onEnd, that));\n            },\n            onCancel: function () {\n                this.transition.cancel();\n            },\n            freeze: function (location) {\n                var that = this;\n                that.cancel();\n                that._moveTo(location);\n            },\n            onEnd: function () {\n                var that = this;\n                if (that.paneAxis.outOfBounds()) {\n                    that._snapBack();\n                } else {\n                    that._end();\n                }\n            },\n            done: function () {\n                return abs(this.velocity) < 1;\n            },\n            start: function (e) {\n                var that = this, velocity;\n                if (!that.dimension.enabled) {\n                    return;\n                }\n                if (that.paneAxis.outOfBounds()) {\n                    that._snapBack();\n                } else {\n                    velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n                    that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n                    that.tapCapture.captureNext();\n                    Animation.fn.start.call(that);\n                }\n            },\n            tick: function () {\n                var that = this, dimension = that.dimension, friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction, delta = that.velocity *= friction, location = that.movable[that.axis] + delta;\n                if (!that.elastic && dimension.outOfBounds(location)) {\n                    location = Math.max(Math.min(location, dimension.max), dimension.min);\n                    that.velocity = 0;\n                }\n                that.movable.moveAxis(that.axis, location);\n            },\n            _end: function () {\n                this.tapCapture.cancelCapture();\n                this.end();\n            },\n            _snapBack: function () {\n                var that = this, dimension = that.dimension, snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n                that._moveTo(snapBack);\n            },\n            _moveTo: function (location) {\n                this.transition.moveTo({\n                    location: location,\n                    duration: SNAPBACK_DURATION,\n                    ease: Transition.easeOutExpo\n                });\n            }\n        });\n        var AnimatedScroller = Animation.extend({\n            init: function (options) {\n                var that = this;\n                kendo.effects.Animation.fn.init.call(this);\n                extend(that, options, {\n                    origin: {},\n                    destination: {},\n                    offset: {}\n                });\n            },\n            tick: function () {\n                this._updateCoordinates();\n                this.moveTo(this.origin);\n            },\n            done: function () {\n                return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n            },\n            onEnd: function () {\n                this.moveTo(this.destination);\n                if (this.callback) {\n                    this.callback.call();\n                }\n            },\n            setCoordinates: function (from, to) {\n                this.offset = {};\n                this.origin = from;\n                this.destination = to;\n            },\n            setCallback: function (callback) {\n                if (callback && kendo.isFunction(callback)) {\n                    this.callback = callback;\n                } else {\n                    callback = undefined;\n                }\n            },\n            _updateCoordinates: function () {\n                this.offset = {\n                    x: (this.destination.x - this.origin.x) / 4,\n                    y: (this.destination.y - this.origin.y) / 4\n                };\n                this.origin = {\n                    y: this.origin.y + this.offset.y,\n                    x: this.origin.x + this.offset.x\n                };\n            }\n        });\n        var ScrollBar = Class.extend({\n            init: function (options) {\n                var that = this, horizontal = options.axis === 'x', element = $('<div class=\"km-touch-scrollbar km-' + (horizontal ? 'horizontal' : 'vertical') + '-scrollbar\" />');\n                extend(that, options, {\n                    element: element,\n                    elementSize: 0,\n                    movable: new Movable(element),\n                    scrollMovable: options.movable,\n                    alwaysVisible: options.alwaysVisible,\n                    size: horizontal ? 'width' : 'height'\n                });\n                that.scrollMovable.bind(CHANGE, proxy(that.refresh, that));\n                that.container.append(element);\n                if (options.alwaysVisible) {\n                    that.show();\n                }\n            },\n            refresh: function () {\n                var that = this, axis = that.axis, dimension = that.dimension, paneSize = dimension.size, scrollMovable = that.scrollMovable, sizeRatio = paneSize / dimension.total, position = Math.round(-scrollMovable[axis] * sizeRatio), size = Math.round(paneSize * sizeRatio);\n                if (sizeRatio >= 1) {\n                    this.element.css('display', 'none');\n                } else {\n                    this.element.css('display', '');\n                }\n                if (position + size > paneSize) {\n                    size = paneSize - position;\n                } else if (position < 0) {\n                    size += position;\n                    position = 0;\n                }\n                if (that.elementSize != size) {\n                    that.element.css(that.size, size + 'px');\n                    that.elementSize = size;\n                }\n                that.movable.moveAxis(axis, position);\n            },\n            show: function () {\n                this.element.css({\n                    opacity: SCROLLBAR_OPACITY,\n                    visibility: 'visible'\n                });\n            },\n            hide: function () {\n                if (!this.alwaysVisible) {\n                    this.element.css({ opacity: 0 });\n                }\n            }\n        });\n        var Scroller = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n                if (that._native) {\n                    element.addClass('km-native-scroller').prepend('<div class=\"km-scroll-header\"/>');\n                    extend(that, {\n                        scrollElement: element,\n                        fixedContainer: element.children().first()\n                    });\n                    return;\n                }\n                element.css('overflow', 'hidden').addClass('km-scroll-wrapper').wrapInner('<div class=\"km-scroll-container\"/>').prepend('<div class=\"km-scroll-header\"/>');\n                var inner = element.children().eq(1), tapCapture = new kendo.TapCapture(element), movable = new Movable(inner), dimensions = new PaneDimensions({\n                        element: inner,\n                        container: element,\n                        forcedEnabled: that.options.zoom\n                    }), avoidScrolling = this.options.avoidScrolling, userEvents = new kendo.UserEvents(element, {\n                        touchAction: 'pan-y',\n                        fastTap: true,\n                        allowSelection: true,\n                        preventDragEvent: true,\n                        captureUpIfMoved: true,\n                        multiTouch: that.options.zoom,\n                        supportDoubleTap: that.options.supportDoubleTap,\n                        start: function (e) {\n                            dimensions.refresh();\n                            var velocityX = abs(e.x.velocity), velocityY = abs(e.y.velocity), horizontalSwipe = velocityX * 2 >= velocityY, originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target), verticalSwipe = velocityY * 2 >= velocityX;\n                            if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n                                userEvents.capture();\n                            } else {\n                                userEvents.cancel();\n                            }\n                        }\n                    }), pane = new Pane({\n                        movable: movable,\n                        dimensions: dimensions,\n                        userEvents: userEvents,\n                        elastic: that.options.elastic\n                    }), zoomSnapBack = new ZoomSnapBack({\n                        movable: movable,\n                        dimensions: dimensions,\n                        userEvents: userEvents,\n                        tapCapture: tapCapture\n                    }), animatedScroller = new AnimatedScroller({\n                        moveTo: function (coordinates) {\n                            that.scrollTo(coordinates.x, coordinates.y);\n                        }\n                    });\n                movable.bind(CHANGE, function () {\n                    that.scrollTop = -movable.y;\n                    that.scrollLeft = -movable.x;\n                    that.trigger(SCROLL, {\n                        scrollTop: that.scrollTop,\n                        scrollLeft: that.scrollLeft\n                    });\n                });\n                if (that.options.mousewheelScrolling) {\n                    element.on('DOMMouseScroll mousewheel', proxy(this, '_wheelScroll'));\n                }\n                extend(that, {\n                    movable: movable,\n                    dimensions: dimensions,\n                    zoomSnapBack: zoomSnapBack,\n                    animatedScroller: animatedScroller,\n                    userEvents: userEvents,\n                    pane: pane,\n                    tapCapture: tapCapture,\n                    pulled: false,\n                    enabled: true,\n                    scrollElement: inner,\n                    scrollTop: 0,\n                    scrollLeft: 0,\n                    fixedContainer: element.children().first()\n                });\n                that._initAxis('x');\n                that._initAxis('y');\n                that._wheelEnd = function () {\n                    that._wheel = false;\n                    that.userEvents.end(0, that._wheelY);\n                };\n                dimensions.refresh();\n                if (that.options.pullToRefresh) {\n                    that._initPullToRefresh();\n                }\n            },\n            _wheelScroll: function (e) {\n                if (!this._wheel) {\n                    this._wheel = true;\n                    this._wheelY = 0;\n                    this.userEvents.press(0, this._wheelY);\n                }\n                clearTimeout(this._wheelTimeout);\n                this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n                var delta = kendo.wheelDeltaY(e);\n                if (delta) {\n                    this._wheelY += delta;\n                    this.userEvents.move(0, this._wheelY);\n                }\n                e.preventDefault();\n            },\n            makeVirtual: function () {\n                this.dimensions.y.makeVirtual();\n            },\n            virtualSize: function (min, max) {\n                this.dimensions.y.virtualSize(min, max);\n            },\n            height: function () {\n                return this.dimensions.y.size;\n            },\n            scrollHeight: function () {\n                return this.scrollElement[0].scrollHeight;\n            },\n            scrollWidth: function () {\n                return this.scrollElement[0].scrollWidth;\n            },\n            options: {\n                name: 'Scroller',\n                zoom: false,\n                pullOffset: 140,\n                visibleScrollHints: false,\n                elastic: true,\n                useNative: false,\n                mousewheelScrolling: true,\n                avoidScrolling: function () {\n                    return false;\n                },\n                pullToRefresh: false,\n                messages: {\n                    pullTemplate: 'Pull to refresh',\n                    releaseTemplate: 'Release to refresh',\n                    refreshTemplate: 'Refreshing'\n                }\n            },\n            events: [\n                PULL,\n                SCROLL,\n                RESIZE\n            ],\n            _resize: function () {\n                if (!this._native) {\n                    this.contentResized();\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                if (options.pullToRefresh) {\n                    that._initPullToRefresh();\n                }\n            },\n            reset: function () {\n                if (this._native) {\n                    this.scrollElement.scrollTop(0);\n                } else {\n                    this.movable.moveTo({\n                        x: 0,\n                        y: 0\n                    });\n                    this._scale(1);\n                }\n            },\n            contentResized: function () {\n                this.dimensions.refresh();\n                if (this.pane.x.outOfBounds()) {\n                    this.movable.moveAxis('x', this.dimensions.x.min);\n                }\n                if (this.pane.y.outOfBounds()) {\n                    this.movable.moveAxis('y', this.dimensions.y.min);\n                }\n            },\n            zoomOut: function () {\n                var dimensions = this.dimensions;\n                dimensions.refresh();\n                this._scale(dimensions.fitScale);\n                this.movable.moveTo(dimensions.centerCoordinates());\n            },\n            enable: function () {\n                this.enabled = true;\n            },\n            disable: function () {\n                this.enabled = false;\n            },\n            scrollTo: function (x, y) {\n                if (this._native) {\n                    this.scrollElement.scrollLeft(abs(x));\n                    this.scrollElement.scrollTop(abs(y));\n                } else {\n                    this.dimensions.refresh();\n                    this.movable.moveTo({\n                        x: x,\n                        y: y\n                    });\n                }\n            },\n            animatedScrollTo: function (x, y, callback) {\n                var from, to;\n                if (this._native) {\n                    this.scrollTo(x, y);\n                } else {\n                    from = {\n                        x: this.movable.x,\n                        y: this.movable.y\n                    };\n                    to = {\n                        x: x,\n                        y: y\n                    };\n                    this.animatedScroller.setCoordinates(from, to);\n                    this.animatedScroller.setCallback(callback);\n                    this.animatedScroller.start();\n                }\n            },\n            pullHandled: function () {\n                var that = this;\n                that.refreshHint.removeClass(REFRESHCLASS);\n                that.hintContainer.html(that.pullTemplate({}));\n                that.yinertia.onEnd();\n                that.xinertia.onEnd();\n                that.userEvents.cancel();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                if (this.userEvents) {\n                    this.userEvents.destroy();\n                }\n            },\n            _scale: function (scale) {\n                this.dimensions.rescale(scale);\n                this.movable.scaleTo(scale);\n            },\n            _initPullToRefresh: function () {\n                var that = this;\n                that.dimensions.y.forceEnabled();\n                that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n                that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n                that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n                that.scrollElement.prepend('<span class=\"km-scroller-pull\"><span class=\"km-icon\"></span><span class=\"km-loading-left\"></span><span class=\"km-loading-right\"></span><span class=\"km-template\">' + that.pullTemplate({}) + '</span></span>');\n                that.refreshHint = that.scrollElement.children().first();\n                that.hintContainer = that.refreshHint.children('.km-template');\n                that.pane.y.bind('change', proxy(that._paneChange, that));\n                that.userEvents.bind('end', proxy(that._dragEnd, that));\n            },\n            _dragEnd: function () {\n                var that = this;\n                if (!that.pulled) {\n                    return;\n                }\n                that.pulled = false;\n                that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n                that.hintContainer.html(that.refreshTemplate({}));\n                that.yinertia.freeze(that.options.pullOffset / 2);\n                that.trigger('pull');\n            },\n            _paneChange: function () {\n                var that = this;\n                if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n                    if (!that.pulled) {\n                        that.pulled = true;\n                        that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n                        that.hintContainer.html(that.releaseTemplate({}));\n                    }\n                } else if (that.pulled) {\n                    that.pulled = false;\n                    that.refreshHint.removeClass(RELEASECLASS);\n                    that.hintContainer.html(that.pullTemplate({}));\n                }\n            },\n            _initAxis: function (axis) {\n                var that = this, movable = that.movable, dimension = that.dimensions[axis], tapCapture = that.tapCapture, paneAxis = that.pane[axis], scrollBar = new ScrollBar({\n                        axis: axis,\n                        movable: movable,\n                        dimension: dimension,\n                        container: that.element,\n                        alwaysVisible: that.options.visibleScrollHints\n                    });\n                dimension.bind(CHANGE, function () {\n                    scrollBar.refresh();\n                });\n                paneAxis.bind(CHANGE, function () {\n                    scrollBar.show();\n                });\n                that[axis + 'inertia'] = new DragInertia({\n                    axis: axis,\n                    paneAxis: paneAxis,\n                    movable: movable,\n                    tapCapture: tapCapture,\n                    userEvents: that.userEvents,\n                    dimension: dimension,\n                    elastic: that.options.elastic,\n                    friction: that.options.friction || FRICTION,\n                    velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n                    end: function () {\n                        scrollBar.hide();\n                        that.trigger('scrollEnd', {\n                            axis: axis,\n                            scrollTop: that.scrollTop,\n                            scrollLeft: that.scrollLeft\n                        });\n                    }\n                });\n            }\n        });\n        ui.plugin(Scroller);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.popup', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'popup',\n        name: 'Pop-up',\n        category: 'framework',\n        depends: ['core'],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, Class = kendo.Class, support = kendo.support, getOffset = kendo.getOffset, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, OPEN = 'open', CLOSE = 'close', DEACTIVATE = 'deactivate', ACTIVATE = 'activate', CENTER = 'center', LEFT = 'left', RIGHT = 'right', TOP = 'top', BOTTOM = 'bottom', ABSOLUTE = 'absolute', HIDDEN = 'hidden', BODY = 'body', LOCATION = 'location', POSITION = 'position', VISIBLE = 'visible', EFFECTS = 'effects', ACTIVE = 'k-state-active', ACTIVEBORDER = 'k-state-border', ACTIVEBORDERREGEXP = /k-state-border-(\\w+)/, ACTIVECHILDREN = '.k-picker-wrap, .k-dropdown-wrap, .k-link', MOUSEDOWN = 'down', DOCUMENT_ELEMENT = $(document.documentElement), proxy = $.proxy, WINDOW = $(window), SCROLL = 'scroll', cssPrefix = support.transitions.css, TRANSFORM = cssPrefix + 'transform', extend = $.extend, NS = '.kendoPopup', styles = [\n                'font-size',\n                'font-family',\n                'font-stretch',\n                'font-style',\n                'font-weight',\n                'line-height'\n            ];\n        function contains(container, target) {\n            if (!container || !target) {\n                return false;\n            }\n            return container === target || $.contains(container, target);\n        }\n        var Popup = Widget.extend({\n            init: function (element, options) {\n                var that = this, parentPopup;\n                options = options || {};\n                if (options.isRtl) {\n                    options.origin = options.origin || BOTTOM + ' ' + RIGHT;\n                    options.position = options.position || TOP + ' ' + RIGHT;\n                }\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that.collisions = options.collision ? options.collision.split(' ') : [];\n                that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n                if (that.collisions.length === 1) {\n                    that.collisions.push(that.collisions[0]);\n                }\n                parentPopup = $(that.options.anchor).closest('.k-popup,.k-group').filter(':not([class^=km-])');\n                options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\n                that.element.hide().addClass('k-popup k-group k-reset').toggleClass('k-rtl', !!options.isRtl).css({ position: ABSOLUTE }).appendTo(options.appendTo).attr('aria-hidden', true).on('mouseenter' + NS, function () {\n                    that._hovered = true;\n                }).on('wheel' + NS, function (e) {\n                    var list = $(e.target).find('.k-list');\n                    var scrollArea = list.parent();\n                    if (list.length && list.is(':visible') && (scrollArea.scrollTop() === 0 && e.originalEvent.deltaY < 0 || scrollArea.scrollTop() === scrollArea.prop('scrollHeight') - scrollArea.prop('offsetHeight') && e.originalEvent.deltaY > 0)) {\n                        e.preventDefault();\n                    }\n                }).on('mouseleave' + NS, function () {\n                    that._hovered = false;\n                });\n                that.wrapper = $();\n                if (options.animation === false) {\n                    options.animation = {\n                        open: { effects: {} },\n                        close: {\n                            hide: true,\n                            effects: {}\n                        }\n                    };\n                }\n                extend(options.animation.open, {\n                    complete: function () {\n                        that.wrapper.css({ overflow: VISIBLE });\n                        that._activated = true;\n                        that._trigger(ACTIVATE);\n                    }\n                });\n                extend(options.animation.close, {\n                    complete: function () {\n                        that._animationClose();\n                    }\n                });\n                that._mousedownProxy = function (e) {\n                    that._mousedown(e);\n                };\n                if (support.mobileOS.android) {\n                    that._resizeProxy = function (e) {\n                        setTimeout(function () {\n                            that._resize(e);\n                        }, 600);\n                    };\n                } else {\n                    that._resizeProxy = function (e) {\n                        that._resize(e);\n                    };\n                }\n                if (options.toggleTarget) {\n                    $(options.toggleTarget).on(options.toggleEvent + NS, $.proxy(that.toggle, that));\n                }\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                CLOSE,\n                DEACTIVATE\n            ],\n            options: {\n                name: 'Popup',\n                toggleEvent: 'click',\n                origin: BOTTOM + ' ' + LEFT,\n                position: TOP + ' ' + LEFT,\n                anchor: BODY,\n                appendTo: null,\n                collision: 'flip fit',\n                viewport: window,\n                copyAnchorStyles: true,\n                autosize: false,\n                modal: false,\n                adjustSize: {\n                    width: 0,\n                    height: 0\n                },\n                animation: {\n                    open: {\n                        effects: 'slideIn:down',\n                        transition: true,\n                        duration: 200\n                    },\n                    close: {\n                        duration: 100,\n                        hide: true\n                    }\n                }\n            },\n            _animationClose: function () {\n                var that = this;\n                var location = that.wrapper.data(LOCATION);\n                that.wrapper.hide();\n                if (location) {\n                    that.wrapper.css(location);\n                }\n                if (that.options.anchor != BODY) {\n                    that._hideDirClass();\n                }\n                that._closing = false;\n                that._trigger(DEACTIVATE);\n            },\n            destroy: function () {\n                var that = this, options = that.options, element = that.element.off(NS), parent;\n                Widget.fn.destroy.call(that);\n                if (options.toggleTarget) {\n                    $(options.toggleTarget).off(NS);\n                }\n                if (!options.modal) {\n                    DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n                    that._toggleResize(false);\n                }\n                kendo.destroy(that.element.children());\n                element.removeData();\n                if (options.appendTo[0] === document.body) {\n                    parent = element.parent('.k-animation-container');\n                    if (parent[0]) {\n                        parent.remove();\n                    } else {\n                        element.remove();\n                    }\n                }\n            },\n            open: function (x, y) {\n                var that = this, fixed = {\n                        isFixed: !isNaN(parseInt(y, 10)),\n                        x: x,\n                        y: y\n                    }, element = that.element, options = that.options, animation, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n                if (!that.visible()) {\n                    if (options.copyAnchorStyles) {\n                        if (mobile && styles[0] == 'font-size') {\n                            styles.shift();\n                        }\n                        element.css(kendo.getComputedStyles(anchor[0], styles));\n                    }\n                    if (element.data('animating') || that._trigger(OPEN)) {\n                        return;\n                    }\n                    that._activated = false;\n                    if (!options.modal) {\n                        DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy).on(that.downEvent, that._mousedownProxy);\n                        that._toggleResize(false);\n                        that._toggleResize(true);\n                    }\n                    that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n                        overflow: HIDDEN,\n                        display: 'block',\n                        position: ABSOLUTE\n                    }).attr('aria-hidden', false);\n                    if (support.mobileOS.android) {\n                        wrapper.css(TRANSFORM, 'translatez(0)');\n                    }\n                    wrapper.css(POSITION);\n                    if ($(options.appendTo)[0] == document.body) {\n                        wrapper.css(TOP, '-10000px');\n                    }\n                    that.flipped = that._position(fixed);\n                    animation = that._openAnimation();\n                    if (options.anchor != BODY) {\n                        that._showDirClass(animation);\n                    }\n                    element.data(EFFECTS, animation.effects).kendoStop(true).kendoAnimate(animation).attr('aria-hidden', false);\n                }\n            },\n            _location: function (isFixed) {\n                var that = this, element = that.element, options = that.options, wrapper, anchor = $(options.anchor), mobile = element[0] && element.hasClass('km-widget');\n                if (options.copyAnchorStyles) {\n                    if (mobile && styles[0] == 'font-size') {\n                        styles.shift();\n                    }\n                    element.css(kendo.getComputedStyles(anchor[0], styles));\n                }\n                that.wrapper = wrapper = kendo.wrap(element, options.autosize).css({\n                    overflow: HIDDEN,\n                    display: 'block',\n                    position: ABSOLUTE\n                });\n                if (support.mobileOS.android) {\n                    wrapper.css(TRANSFORM, 'translatez(0)');\n                }\n                wrapper.css(POSITION);\n                if ($(options.appendTo)[0] == document.body) {\n                    wrapper.css(TOP, '-10000px');\n                }\n                that._position(isFixed || {});\n                var offset = wrapper.offset();\n                return {\n                    width: kendo._outerWidth(wrapper),\n                    height: kendo._outerHeight(wrapper),\n                    left: offset.left,\n                    top: offset.top\n                };\n            },\n            _openAnimation: function () {\n                var animation = extend(true, {}, this.options.animation.open);\n                animation.effects = kendo.parseEffects(animation.effects, this.flipped);\n                return animation;\n            },\n            _hideDirClass: function () {\n                var anchor = $(this.options.anchor);\n                var direction = ((anchor.attr('class') || '').match(ACTIVEBORDERREGEXP) || [\n                    '',\n                    'down'\n                ])[1];\n                var dirClass = ACTIVEBORDER + '-' + direction;\n                anchor.removeClass(dirClass).children(ACTIVECHILDREN).removeClass(ACTIVE).removeClass(dirClass);\n                this.element.removeClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n            },\n            _showDirClass: function (animation) {\n                var direction = animation.effects.slideIn ? animation.effects.slideIn.direction : 'down';\n                var dirClass = ACTIVEBORDER + '-' + direction;\n                $(this.options.anchor).addClass(dirClass).children(ACTIVECHILDREN).addClass(ACTIVE).addClass(dirClass);\n                this.element.addClass(ACTIVEBORDER + '-' + kendo.directions[direction].reverse);\n            },\n            position: function () {\n                if (this.visible()) {\n                    this.flipped = this._position();\n                }\n            },\n            toggle: function () {\n                var that = this;\n                that[that.visible() ? CLOSE : OPEN]();\n            },\n            visible: function () {\n                return this.element.is(':' + VISIBLE);\n            },\n            close: function (skipEffects) {\n                var that = this, options = that.options, wrap, animation, openEffects, closeEffects;\n                if (that.visible()) {\n                    wrap = that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide();\n                    that._toggleResize(false);\n                    if (that._closing || that._trigger(CLOSE)) {\n                        that._toggleResize(true);\n                        return;\n                    }\n                    that.element.find('.k-popup').each(function () {\n                        var that = $(this), popup = that.data('kendoPopup');\n                        if (popup) {\n                            popup.close(skipEffects);\n                        }\n                    });\n                    DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n                    if (skipEffects) {\n                        animation = {\n                            hide: true,\n                            effects: {}\n                        };\n                    } else {\n                        animation = extend(true, {}, options.animation.close);\n                        openEffects = that.element.data(EFFECTS);\n                        closeEffects = animation.effects;\n                        if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\n                            animation.effects = openEffects;\n                            animation.reverse = true;\n                        }\n                        that._closing = true;\n                    }\n                    that.element.kendoStop(true).attr('aria-hidden', true);\n                    wrap.css({ overflow: HIDDEN }).attr('aria-hidden', true);\n                    that.element.kendoAnimate(animation);\n                    if (skipEffects) {\n                        that._animationClose();\n                    }\n                }\n            },\n            _trigger: function (ev) {\n                return this.trigger(ev, { type: ev });\n            },\n            _resize: function (e) {\n                var that = this;\n                if (support.resize.indexOf(e.type) !== -1) {\n                    clearTimeout(that._resizeTimeout);\n                    that._resizeTimeout = setTimeout(function () {\n                        that._position();\n                        that._resizeTimeout = null;\n                    }, 50);\n                } else {\n                    if (!that._hovered || that._activated && that.element.hasClass('k-list-container')) {\n                        that.close();\n                    }\n                }\n            },\n            _toggleResize: function (toggle) {\n                var method = toggle ? 'on' : 'off';\n                var eventNames = support.resize;\n                if (!(support.mobileOS.ios || support.mobileOS.android)) {\n                    eventNames += ' ' + SCROLL;\n                }\n                if (toggle && !this.scrollableParents) {\n                    this.scrollableParents = this._scrollableParents();\n                }\n                if (this.scrollableParents && this.scrollableParents.length) {\n                    this.scrollableParents[method](SCROLL, this._resizeProxy);\n                }\n                WINDOW[method](eventNames, this._resizeProxy);\n            },\n            _mousedown: function (e) {\n                var that = this, container = that.element[0], options = that.options, anchor = $(options.anchor)[0], toggleTarget = options.toggleTarget, target = kendo.eventTarget(e), popup = $(target).closest('.k-popup'), mobile = popup.parent().parent('.km-shim').length;\n                popup = popup[0];\n                if (!mobile && popup && popup !== that.element[0]) {\n                    return;\n                }\n                if ($(e.target).closest('a').data('rel') === 'popover') {\n                    return;\n                }\n                if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\n                    that.close();\n                }\n            },\n            _fit: function (position, size, viewPortSize) {\n                var output = 0;\n                if (position + size > viewPortSize) {\n                    output = viewPortSize - (position + size);\n                }\n                if (position < 0) {\n                    output = -position;\n                }\n                return output;\n            },\n            _flip: function (offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\n                var output = 0;\n                boxSize = boxSize || size;\n                if (position !== origin && position !== CENTER && origin !== CENTER) {\n                    if (offset + boxSize > viewPortSize) {\n                        output += -(anchorSize + size);\n                    }\n                    if (offset + output < 0) {\n                        output += anchorSize + size;\n                    }\n                }\n                return output;\n            },\n            _scrollableParents: function () {\n                return $(this.options.anchor).parentsUntil('body').filter(function (index, element) {\n                    return kendo.isScrollable(element);\n                });\n            },\n            _position: function (fixed) {\n                var that = this, element = that.element, wrapper = that.wrapper, options = that.options, viewport = $(options.viewport), zoomLevel = support.zoomLevel(), isWindow = !!(viewport[0] == window && window.innerWidth && zoomLevel <= 1.02), anchor = $(options.anchor), origins = options.origin.toLowerCase().split(' '), positions = options.position.toLowerCase().split(' '), collisions = that.collisions, siblingContainer, parents, parentZIndex, zIndex = 10002, idx = 0, docEl = document.documentElement, length, viewportOffset, viewportWidth, viewportHeight;\n                if (options.viewport === window) {\n                    viewportOffset = {\n                        top: window.pageYOffset || document.documentElement.scrollTop || 0,\n                        left: window.pageXOffset || document.documentElement.scrollLeft || 0\n                    };\n                } else {\n                    viewportOffset = viewport.offset();\n                }\n                if (isWindow) {\n                    viewportWidth = window.innerWidth;\n                    viewportHeight = window.innerHeight;\n                } else {\n                    viewportWidth = viewport.width();\n                    viewportHeight = viewport.height();\n                }\n                if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\n                    var sign = options.isRtl ? -1 : 1;\n                    viewportWidth -= sign * kendo.support.scrollbar();\n                }\n                siblingContainer = anchor.parents().filter(wrapper.siblings());\n                if (siblingContainer[0]) {\n                    parentZIndex = Math.max(Number(siblingContainer.css('zIndex')), 0);\n                    if (parentZIndex) {\n                        zIndex = parentZIndex + 10;\n                    } else {\n                        parents = anchor.parentsUntil(siblingContainer);\n                        for (length = parents.length; idx < length; idx++) {\n                            parentZIndex = Number($(parents[idx]).css('zIndex'));\n                            if (parentZIndex && zIndex < parentZIndex) {\n                                zIndex = parentZIndex + 10;\n                            }\n                        }\n                    }\n                }\n                wrapper.css('zIndex', zIndex);\n                if (fixed && fixed.isFixed) {\n                    wrapper.css({\n                        left: fixed.x,\n                        top: fixed.y\n                    });\n                } else {\n                    wrapper.css(that._align(origins, positions));\n                }\n                var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]), offset = getOffset(wrapper), anchorParent = anchor.offsetParent().parent('.k-animation-container,.k-popup,.k-group');\n                if (anchorParent.length) {\n                    pos = getOffset(wrapper, POSITION, true);\n                    offset = getOffset(wrapper);\n                }\n                offset.top -= viewportOffset.top;\n                offset.left -= viewportOffset.left;\n                if (!that.wrapper.data(LOCATION)) {\n                    wrapper.data(LOCATION, extend({}, pos));\n                }\n                var offsets = extend({}, offset), location = extend({}, pos), adjustSize = options.adjustSize;\n                if (collisions[0] === 'fit') {\n                    location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\n                }\n                if (collisions[1] === 'fit') {\n                    location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\n                }\n                var flipPos = extend({}, location);\n                var elementHeight = outerHeight(element);\n                var wrapperHeight = outerHeight(wrapper);\n                if (!wrapper.height() && elementHeight) {\n                    wrapperHeight = wrapperHeight + elementHeight;\n                }\n                if (collisions[0] === 'flip') {\n                    location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\n                }\n                if (collisions[1] === 'flip') {\n                    location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\n                }\n                element.css(POSITION, ABSOLUTE);\n                wrapper.css(location);\n                return location.left != flipPos.left || location.top != flipPos.top;\n            },\n            _align: function (origin, position) {\n                var that = this, element = that.wrapper, anchor = $(that.options.anchor), verticalOrigin = origin[0], horizontalOrigin = origin[1], verticalPosition = position[0], horizontalPosition = position[1], anchorOffset = getOffset(anchor), appendTo = $(that.options.appendTo), appendToOffset, width = outerWidth(element), height = outerHeight(element) || outerHeight(element.children().first()), anchorWidth = outerWidth(anchor), anchorHeight = outerHeight(anchor), top = anchorOffset.top, left = anchorOffset.left, round = Math.round;\n                if (appendTo[0] != document.body) {\n                    appendToOffset = getOffset(appendTo);\n                    top -= appendToOffset.top;\n                    left -= appendToOffset.left;\n                }\n                if (verticalOrigin === BOTTOM) {\n                    top += anchorHeight;\n                }\n                if (verticalOrigin === CENTER) {\n                    top += round(anchorHeight / 2);\n                }\n                if (verticalPosition === BOTTOM) {\n                    top -= height;\n                }\n                if (verticalPosition === CENTER) {\n                    top -= round(height / 2);\n                }\n                if (horizontalOrigin === RIGHT) {\n                    left += anchorWidth;\n                }\n                if (horizontalOrigin === CENTER) {\n                    left += round(anchorWidth / 2);\n                }\n                if (horizontalPosition === RIGHT) {\n                    left -= width;\n                }\n                if (horizontalPosition === CENTER) {\n                    left -= round(width / 2);\n                }\n                return {\n                    top: top,\n                    left: left\n                };\n            }\n        });\n        ui.plugin(Popup);\n        var stableSort = kendo.support.stableSort;\n        var tabKeyTrapNS = 'kendoTabKeyTrap';\n        var focusableNodesSelector = 'a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]';\n        var TabKeyTrap = Class.extend({\n            init: function (element) {\n                this.element = $(element);\n                this.element.autoApplyNS(tabKeyTrapNS);\n            },\n            trap: function () {\n                this.element.on('keydown', proxy(this._keepInTrap, this));\n            },\n            removeTrap: function () {\n                this.element.kendoDestroy(tabKeyTrapNS);\n            },\n            destroy: function () {\n                this.element.kendoDestroy(tabKeyTrapNS);\n                this.element = undefined;\n            },\n            shouldTrap: function () {\n                return true;\n            },\n            _keepInTrap: function (e) {\n                if (e.which !== 9 || !this.shouldTrap() || e.isDefaultPrevented()) {\n                    return;\n                }\n                var elements = this._focusableElements();\n                var sortedElements = this._sortFocusableElements(elements);\n                var next = this._nextFocusable(e, sortedElements);\n                this._focus(next);\n                e.preventDefault();\n            },\n            _focusableElements: function () {\n                var elements = this.element.find(focusableNodesSelector).filter(function (i, item) {\n                    return item.tabIndex >= 0 && $(item).is(':visible') && !$(item).is('[disabled]');\n                });\n                if (this.element.is('[tabindex]')) {\n                    elements.push(this.element[0]);\n                }\n                return elements;\n            },\n            _sortFocusableElements: function (elements) {\n                var sortedElements;\n                if (stableSort) {\n                    sortedElements = elements.sort(function (prev, next) {\n                        return prev.tabIndex - next.tabIndex;\n                    });\n                } else {\n                    var attrName = '__k_index';\n                    elements.each(function (i, item) {\n                        item.setAttribute(attrName, i);\n                    });\n                    sortedElements = elements.sort(function (prev, next) {\n                        return prev.tabIndex === next.tabIndex ? parseInt(prev.getAttribute(attrName), 10) - parseInt(next.getAttribute(attrName), 10) : prev.tabIndex - next.tabIndex;\n                    });\n                    elements.removeAttr(attrName);\n                }\n                return sortedElements;\n            },\n            _nextFocusable: function (e, elements) {\n                var count = elements.length;\n                var current = elements.index(e.target);\n                return elements.get((current + (e.shiftKey ? -1 : 1)) % count);\n            },\n            _focus: function (element) {\n                if (element.nodeName == 'IFRAME') {\n                    element.contentWindow.document.body.focus();\n                    return;\n                }\n                element.focus();\n                if (element.nodeName == 'INPUT' && element.setSelectionRange && this._haveSelectionRange(element)) {\n                    element.setSelectionRange(0, element.value.length);\n                }\n            },\n            _haveSelectionRange: function (element) {\n                var elementType = element.type.toLowerCase();\n                return elementType === 'text' || elementType === 'search' || elementType === 'url' || elementType === 'tel' || elementType === 'password';\n            }\n        });\n        ui.Popup.TabKeyTrap = TabKeyTrap;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.tooltip', [\n        'kendo.core',\n        'kendo.popup',\n        'kendo.fx'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'tooltip',\n        name: 'Tooltip',\n        category: 'web',\n        description: 'The Tooltip widget displays a popup hint for a given html element.',\n        depends: [\n            'core',\n            'popup'\n        ],\n        features: [{\n                id: 'tooltip-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, Popup = kendo.ui.Popup, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, extend = $.extend, proxy = $.proxy, DOCUMENT = $(document), isLocalUrl = kendo.isLocalUrl, ARIAIDSUFFIX = '_tt_active', DESCRIBEDBY = 'aria-describedby', SHOW = 'show', HIDE = 'hide', ERROR = 'error', CONTENTLOAD = 'contentLoad', REQUESTSTART = 'requestStart', KCONTENTFRAME = 'k-content-frame', TEMPLATE = '<div role=\"tooltip\" class=\"k-widget k-tooltip#if (!autoHide) {# k-tooltip-closable#}#\">#if (!autoHide) {# <div class=\"k-tooltip-button\"><a href=\"\\\\#\" class=\"k-icon k-i-close\" title=\"Close\"></a></div> #}#' + '<div class=\"k-tooltip-content\"></div>' + '#if (callout){ #<div class=\"k-callout k-callout-#=dir#\"></div>#}#' + '</div>', IFRAMETEMPLATE = kendo.template('<iframe frameborder=\\'0\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'), NS = '.kendoTooltip', POSITIONS = {\n                bottom: {\n                    origin: 'bottom center',\n                    position: 'top center'\n                },\n                top: {\n                    origin: 'top center',\n                    position: 'bottom center'\n                },\n                left: {\n                    origin: 'center left',\n                    position: 'center right',\n                    collision: 'fit flip'\n                },\n                right: {\n                    origin: 'center right',\n                    position: 'center left',\n                    collision: 'fit flip'\n                },\n                center: {\n                    position: 'center center',\n                    origin: 'center center'\n                }\n            }, REVERSE = {\n                'top': 'bottom',\n                'bottom': 'top',\n                'left': 'right',\n                'right': 'left',\n                'center': 'center'\n            }, DIRCLASSES = {\n                bottom: 'n',\n                top: 's',\n                left: 'e',\n                right: 'w',\n                center: 'n'\n            }, DIMENSIONS = {\n                'horizontal': {\n                    offset: 'top',\n                    size: 'outerHeight'\n                },\n                'vertical': {\n                    offset: 'left',\n                    size: 'outerWidth'\n                }\n            }, DEFAULTCONTENT = function (e) {\n                return e.target.data(kendo.ns + 'title');\n            };\n        function restoreTitle(element) {\n            while (element.length) {\n                if (restoreTitleAttributeForElement(element)) {\n                    break;\n                }\n                element = element.parent();\n            }\n        }\n        function restoreTitleAttributeForElement(element) {\n            var title = element.data(kendo.ns + 'title');\n            if (title) {\n                element.attr('title', title);\n                element.removeData(kendo.ns + 'title');\n                return true;\n            }\n        }\n        function saveTitleAttributeForElement(element) {\n            var title = element.attr('title');\n            if (title) {\n                element.data(kendo.ns + 'title', title);\n                element.attr('title', '');\n                return true;\n            }\n        }\n        function saveTitleAttributes(element) {\n            while (element.length && !element.is('body')) {\n                if (saveTitleAttributeForElement(element)) {\n                    break;\n                }\n                element = element.parent();\n            }\n        }\n        var Tooltip = Widget.extend({\n            init: function (element, options) {\n                var that = this, axis;\n                Widget.fn.init.call(that, element, options);\n                axis = that.options.position.match(/left|right/) ? 'horizontal' : 'vertical';\n                that.dimensions = DIMENSIONS[axis];\n                that._documentKeyDownHandler = proxy(that._documentKeyDown, that);\n                that.element.on(that.options.showOn + NS, that.options.filter, proxy(that._showOn, that));\n                if (this._isShownOnMouseEnter() || this._isShownOnClick()) {\n                    that.element.on('mouseenter' + NS, that.options.filter, proxy(that._mouseenter, that));\n                }\n                if (this.options.autoHide && this._isShownOnMouseEnter()) {\n                    that.element.on('mouseleave' + NS, that.options.filter, proxy(that._mouseleave, that));\n                }\n                if (this.options.autoHide && this._isShownOnFocus()) {\n                    that.element.on('blur' + NS, that.options.filter, proxy(that._blur, that));\n                }\n            },\n            options: {\n                name: 'Tooltip',\n                filter: '',\n                content: DEFAULTCONTENT,\n                showAfter: 100,\n                hideAfter: 100,\n                callout: true,\n                offset: 0,\n                position: 'bottom',\n                showOn: 'mouseenter',\n                autoHide: true,\n                width: null,\n                height: null,\n                animation: {\n                    open: {\n                        effects: 'fade:in',\n                        duration: 0\n                    },\n                    close: {\n                        duration: 40,\n                        hide: true\n                    }\n                }\n            },\n            events: [\n                SHOW,\n                HIDE,\n                CONTENTLOAD,\n                ERROR,\n                REQUESTSTART\n            ],\n            _isShownOnFocus: function () {\n                return this.options.showOn && this.options.showOn.match(/focus/);\n            },\n            _isShownOnMouseEnter: function () {\n                return this.options.showOn && this.options.showOn.match(/mouseenter/);\n            },\n            _isShownOnClick: function () {\n                return this.options.showOn && this.options.showOn.match(/click/);\n            },\n            _mouseenter: function (e) {\n                saveTitleAttributes($(e.currentTarget));\n            },\n            _showOn: function (e) {\n                var that = this;\n                var currentTarget = $(e.currentTarget);\n                if (that._isShownOnClick() && !that._isShownOnMouseEnter()) {\n                    that._show(currentTarget);\n                } else if (that._isShownOnFocus()) {\n                    saveTitleAttributes(currentTarget);\n                    that._show(currentTarget);\n                } else {\n                    clearTimeout(that.timeout);\n                    that.timeout = setTimeout(function () {\n                        that._show(currentTarget);\n                    }, that.options.showAfter);\n                }\n            },\n            _appendContent: function (target) {\n                var that = this, contentOptions = that.options.content, element = that.content, showIframe = that.options.iframe, iframe;\n                if (isPlainObject(contentOptions) && contentOptions.url) {\n                    if (!('iframe' in that.options)) {\n                        showIframe = !isLocalUrl(contentOptions.url);\n                    }\n                    that.trigger(REQUESTSTART, {\n                        options: contentOptions,\n                        target: target\n                    });\n                    if (!showIframe) {\n                        element.empty();\n                        kendo.ui.progress(element, true);\n                        that._ajaxRequest(contentOptions);\n                    } else {\n                        element.hide();\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = contentOptions.url || iframe.src;\n                        } else {\n                            element.html(IFRAMETEMPLATE({ content: contentOptions }));\n                        }\n                        element.find('.' + KCONTENTFRAME).off('load' + NS).on('load' + NS, function () {\n                            that.trigger(CONTENTLOAD);\n                            element.show();\n                        });\n                    }\n                } else if (contentOptions && isFunction(contentOptions)) {\n                    contentOptions = contentOptions({\n                        sender: this,\n                        target: target\n                    });\n                    element.html(contentOptions || '');\n                } else {\n                    element.html(contentOptions);\n                }\n                that.angular('compile', function () {\n                    return { elements: element };\n                });\n            },\n            _ajaxRequest: function (options) {\n                var that = this;\n                jQuery.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: function (xhr, status) {\n                        kendo.ui.progress(that.content, false);\n                        that.trigger(ERROR, {\n                            status: status,\n                            xhr: xhr\n                        });\n                    },\n                    success: proxy(function (data) {\n                        kendo.ui.progress(that.content, false);\n                        that.content.html(data);\n                        that.trigger(CONTENTLOAD);\n                    }, that)\n                }, options));\n            },\n            _documentKeyDown: function (e) {\n                if (e.keyCode === kendo.keys.ESC) {\n                    this.hide();\n                }\n            },\n            refresh: function () {\n                var that = this, popup = that.popup;\n                if (popup && popup.options.anchor) {\n                    that._appendContent(popup.options.anchor);\n                }\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n            },\n            show: function (target) {\n                target = target || this.element;\n                saveTitleAttributes(target);\n                this._show(target);\n            },\n            _show: function (target) {\n                var that = this, current = that.target();\n                if (!that.popup) {\n                    that._initPopup();\n                }\n                if (current && current[0] != target[0]) {\n                    that.popup.close();\n                    that.popup.element.kendoStop(true, true);\n                }\n                if (!current || current[0] != target[0]) {\n                    that._appendContent(target);\n                    that.popup.options.anchor = target;\n                }\n                that.popup.one('deactivate', function () {\n                    restoreTitle(target);\n                    target.removeAttr(DESCRIBEDBY);\n                    this.element.removeAttr('id').attr('aria-hidden', true);\n                    DOCUMENT.off('keydown' + NS, that._documentKeyDownHandler);\n                });\n                that.popup._hovered = true;\n                that.popup.open();\n            },\n            _initPopup: function () {\n                var that = this, options = that.options, wrapper = $(kendo.template(TEMPLATE)({\n                        callout: options.callout && options.position !== 'center',\n                        dir: DIRCLASSES[options.position],\n                        autoHide: options.autoHide\n                    }));\n                that.popup = new Popup(wrapper, extend({\n                    autosize: true,\n                    activate: function () {\n                        var anchor = this.options.anchor, ariaId = anchor[0].id || that.element[0].id;\n                        if (ariaId) {\n                            anchor.attr(DESCRIBEDBY, ariaId + ARIAIDSUFFIX);\n                            this.element.attr('id', ariaId + ARIAIDSUFFIX);\n                        }\n                        if (options.callout) {\n                            that._positionCallout();\n                        } else {\n                            that._offset(that.options.position, that.options.offset);\n                        }\n                        this.element.removeAttr('aria-hidden');\n                        DOCUMENT.on('keydown' + NS, that._documentKeyDownHandler);\n                        that.trigger(SHOW);\n                        that.popup._hovered = undefined;\n                    },\n                    close: function () {\n                        that.trigger(HIDE);\n                    },\n                    copyAnchorStyles: false,\n                    animation: options.animation\n                }, POSITIONS[options.position]));\n                wrapper.css({\n                    width: options.width,\n                    height: options.height\n                });\n                that.content = wrapper.find('.k-tooltip-content');\n                that.arrow = wrapper.find('.k-callout');\n                if (options.autoHide && this._isShownOnMouseEnter()) {\n                    wrapper.on('mouseleave' + NS, proxy(that._mouseleave, that));\n                } else {\n                    wrapper.on('click' + NS, '.k-tooltip-button', proxy(that._closeButtonClick, that));\n                }\n            },\n            _closeButtonClick: function (e) {\n                e.preventDefault();\n                this.hide();\n            },\n            _mouseleave: function (e) {\n                var that = this;\n                clearTimeout(that.timeout);\n                that.timeout = setTimeout(function () {\n                    that._closePopup(e.currentTarget);\n                }, that.options.hideAfter);\n            },\n            _blur: function (e) {\n                this._closePopup(e.currentTarget);\n            },\n            _closePopup: function (target) {\n                if (this.popup && !this.popup._hovered) {\n                    this.popup.close();\n                } else {\n                    restoreTitle($(target));\n                }\n            },\n            target: function () {\n                if (this.popup) {\n                    return this.popup.options.anchor;\n                }\n                return null;\n            },\n            _positionCallout: function () {\n                var that = this, position = that.options.position, dimensions = that.dimensions, offset = dimensions.offset, popup = that.popup, anchor = popup.options.anchor, anchorOffset = $(anchor).offset(), elementOffset = $(popup.element).offset(), cssClass = DIRCLASSES[popup.flipped ? REVERSE[position] : position], offsetAmount = anchorOffset[offset] - elementOffset[offset] + $(anchor)[dimensions.size]() / 2;\n                that._offset(position, that.options.offset);\n                that.arrow.removeClass('k-callout-n k-callout-s k-callout-w k-callout-e').addClass('k-callout-' + cssClass).css(offset, offsetAmount);\n            },\n            destroy: function () {\n                var popup = this.popup;\n                if (popup) {\n                    popup.element.off(NS);\n                    popup.destroy();\n                }\n                clearTimeout(this.timeout);\n                this.element.off(NS);\n                DOCUMENT.off('keydown' + NS, this._documentKeyDownHandler);\n                Widget.fn.destroy.call(this);\n            },\n            _offset: function (position, offsetAmount) {\n                var that = this, isTopLeft = position == 'top' || position == 'left', isFlipped = that.popup.flipped, direction = isTopLeft && isFlipped || !isTopLeft && !isFlipped ? 1 : -1, marginRule = isTopLeft ? 'margin-' + position : 'margin-' + REVERSE[position], offset = kendo._outerWidth(that.arrow) / 2 + offsetAmount;\n                that.popup.wrapper.css(marginRule, offset * direction + 'px');\n            }\n        });\n        kendo.ui.plugin(Tooltip);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/util', ['kendo.core'], f);\n}(function () {\n    (function ($) {\n        function createPromise() {\n            return $.Deferred();\n        }\n        function promiseAll(promises) {\n            return $.when.apply($, promises);\n        }\n        kendo.drawing.util = kendo.drawing.util || {};\n        kendo.deepExtend(kendo.drawing.util, {\n            createPromise: createPromise,\n            promiseAll: promiseAll\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.color', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'color',\n        name: 'Color utils',\n        category: 'framework',\n        advanced: true,\n        description: 'Color utilities used across components',\n        depends: ['core']\n    };\n    window.kendo = window.kendo || {};\n    var Class = kendo.Class;\n    var support = kendo.support;\n    var namedColors = {\n        aliceblue: 'f0f8ff',\n        antiquewhite: 'faebd7',\n        aqua: '00ffff',\n        aquamarine: '7fffd4',\n        azure: 'f0ffff',\n        beige: 'f5f5dc',\n        bisque: 'ffe4c4',\n        black: '000000',\n        blanchedalmond: 'ffebcd',\n        blue: '0000ff',\n        blueviolet: '8a2be2',\n        brown: 'a52a2a',\n        burlywood: 'deb887',\n        cadetblue: '5f9ea0',\n        chartreuse: '7fff00',\n        chocolate: 'd2691e',\n        coral: 'ff7f50',\n        cornflowerblue: '6495ed',\n        cornsilk: 'fff8dc',\n        crimson: 'dc143c',\n        cyan: '00ffff',\n        darkblue: '00008b',\n        darkcyan: '008b8b',\n        darkgoldenrod: 'b8860b',\n        darkgray: 'a9a9a9',\n        darkgrey: 'a9a9a9',\n        darkgreen: '006400',\n        darkkhaki: 'bdb76b',\n        darkmagenta: '8b008b',\n        darkolivegreen: '556b2f',\n        darkorange: 'ff8c00',\n        darkorchid: '9932cc',\n        darkred: '8b0000',\n        darksalmon: 'e9967a',\n        darkseagreen: '8fbc8f',\n        darkslateblue: '483d8b',\n        darkslategray: '2f4f4f',\n        darkslategrey: '2f4f4f',\n        darkturquoise: '00ced1',\n        darkviolet: '9400d3',\n        deeppink: 'ff1493',\n        deepskyblue: '00bfff',\n        dimgray: '696969',\n        dimgrey: '696969',\n        dodgerblue: '1e90ff',\n        firebrick: 'b22222',\n        floralwhite: 'fffaf0',\n        forestgreen: '228b22',\n        fuchsia: 'ff00ff',\n        gainsboro: 'dcdcdc',\n        ghostwhite: 'f8f8ff',\n        gold: 'ffd700',\n        goldenrod: 'daa520',\n        gray: '808080',\n        grey: '808080',\n        green: '008000',\n        greenyellow: 'adff2f',\n        honeydew: 'f0fff0',\n        hotpink: 'ff69b4',\n        indianred: 'cd5c5c',\n        indigo: '4b0082',\n        ivory: 'fffff0',\n        khaki: 'f0e68c',\n        lavender: 'e6e6fa',\n        lavenderblush: 'fff0f5',\n        lawngreen: '7cfc00',\n        lemonchiffon: 'fffacd',\n        lightblue: 'add8e6',\n        lightcoral: 'f08080',\n        lightcyan: 'e0ffff',\n        lightgoldenrodyellow: 'fafad2',\n        lightgray: 'd3d3d3',\n        lightgrey: 'd3d3d3',\n        lightgreen: '90ee90',\n        lightpink: 'ffb6c1',\n        lightsalmon: 'ffa07a',\n        lightseagreen: '20b2aa',\n        lightskyblue: '87cefa',\n        lightslategray: '778899',\n        lightslategrey: '778899',\n        lightsteelblue: 'b0c4de',\n        lightyellow: 'ffffe0',\n        lime: '00ff00',\n        limegreen: '32cd32',\n        linen: 'faf0e6',\n        magenta: 'ff00ff',\n        maroon: '800000',\n        mediumaquamarine: '66cdaa',\n        mediumblue: '0000cd',\n        mediumorchid: 'ba55d3',\n        mediumpurple: '9370d8',\n        mediumseagreen: '3cb371',\n        mediumslateblue: '7b68ee',\n        mediumspringgreen: '00fa9a',\n        mediumturquoise: '48d1cc',\n        mediumvioletred: 'c71585',\n        midnightblue: '191970',\n        mintcream: 'f5fffa',\n        mistyrose: 'ffe4e1',\n        moccasin: 'ffe4b5',\n        navajowhite: 'ffdead',\n        navy: '000080',\n        oldlace: 'fdf5e6',\n        olive: '808000',\n        olivedrab: '6b8e23',\n        orange: 'ffa500',\n        orangered: 'ff4500',\n        orchid: 'da70d6',\n        palegoldenrod: 'eee8aa',\n        palegreen: '98fb98',\n        paleturquoise: 'afeeee',\n        palevioletred: 'd87093',\n        papayawhip: 'ffefd5',\n        peachpuff: 'ffdab9',\n        peru: 'cd853f',\n        pink: 'ffc0cb',\n        plum: 'dda0dd',\n        powderblue: 'b0e0e6',\n        purple: '800080',\n        red: 'ff0000',\n        rosybrown: 'bc8f8f',\n        royalblue: '4169e1',\n        saddlebrown: '8b4513',\n        salmon: 'fa8072',\n        sandybrown: 'f4a460',\n        seagreen: '2e8b57',\n        seashell: 'fff5ee',\n        sienna: 'a0522d',\n        silver: 'c0c0c0',\n        skyblue: '87ceeb',\n        slateblue: '6a5acd',\n        slategray: '708090',\n        slategrey: '708090',\n        snow: 'fffafa',\n        springgreen: '00ff7f',\n        steelblue: '4682b4',\n        tan: 'd2b48c',\n        teal: '008080',\n        thistle: 'd8bfd8',\n        tomato: 'ff6347',\n        turquoise: '40e0d0',\n        violet: 'ee82ee',\n        wheat: 'f5deb3',\n        white: 'ffffff',\n        whitesmoke: 'f5f5f5',\n        yellow: 'ffff00',\n        yellowgreen: '9acd32'\n    };\n    var browser = support.browser;\n    var matchNamedColor = function (color) {\n        var colorNames = Object.keys(namedColors);\n        colorNames.push('transparent');\n        var regexp = new RegExp('^(' + colorNames.join('|') + ')(\\\\W|$)', 'i');\n        matchNamedColor = function (color) {\n            return regexp.exec(color);\n        };\n        return regexp.exec(color);\n    };\n    var BaseColor = Class.extend({\n        init: function () {\n        },\n        toHSV: function () {\n            return this;\n        },\n        toRGB: function () {\n            return this;\n        },\n        toHex: function () {\n            return this.toBytes().toHex();\n        },\n        toBytes: function () {\n            return this;\n        },\n        toCss: function () {\n            return '#' + this.toHex();\n        },\n        toCssRgba: function () {\n            var rgb = this.toBytes();\n            return 'rgba(' + rgb.r + ', ' + rgb.g + ', ' + rgb.b + ', ' + parseFloat(Number(this.a).toFixed(3)) + ')';\n        },\n        toDisplay: function () {\n            if (browser.msie && browser.version < 9) {\n                return this.toCss();\n            }\n            return this.toCssRgba();\n        },\n        equals: function (c) {\n            return c === this || c !== null && this.toCssRgba() === parseColor(c).toCssRgba();\n        },\n        diff: function (other) {\n            if (other === null) {\n                return NaN;\n            }\n            var c1 = this.toBytes();\n            var c2 = other.toBytes();\n            return Math.sqrt(Math.pow((c1.r - c2.r) * 0.3, 2) + Math.pow((c1.g - c2.g) * 0.59, 2) + Math.pow((c1.b - c2.b) * 0.11, 2));\n        },\n        clone: function () {\n            var c = this.toBytes();\n            if (c === this) {\n                c = new Bytes(c.r, c.g, c.b, c.a);\n            }\n            return c;\n        }\n    });\n    var RGB = BaseColor.extend({\n        init: function (r, g, b, a) {\n            BaseColor.fn.init.call(this);\n            this.r = r;\n            this.g = g;\n            this.b = b;\n            this.a = a;\n        },\n        toHSV: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var min = Math.min(r, g, b);\n            var max = Math.max(r, g, b);\n            var delta = max - min;\n            var v = max;\n            var h, s;\n            if (delta === 0) {\n                return new HSV(0, 0, v, this.a);\n            }\n            if (max !== 0) {\n                s = delta / max;\n                if (r === max) {\n                    h = (g - b) / delta;\n                } else if (g === max) {\n                    h = 2 + (b - r) / delta;\n                } else {\n                    h = 4 + (r - g) / delta;\n                }\n                h *= 60;\n                if (h < 0) {\n                    h += 360;\n                }\n            } else {\n                s = 0;\n                h = -1;\n            }\n            return new HSV(h, s, v, this.a);\n        },\n        toHSL: function () {\n            var ref = this;\n            var r = ref.r;\n            var g = ref.g;\n            var b = ref.b;\n            var max = Math.max(r, g, b);\n            var min = Math.min(r, g, b);\n            var h, s, l = (max + min) / 2;\n            if (max === min) {\n                h = s = 0;\n            } else {\n                var d = max - min;\n                s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n                switch (max) {\n                case r:\n                    h = (g - b) / d + (g < b ? 6 : 0);\n                    break;\n                case g:\n                    h = (b - r) / d + 2;\n                    break;\n                case b:\n                    h = (r - g) / d + 4;\n                    break;\n                default:\n                    break;\n                }\n            }\n            return new HSL(h * 60, s * 100, l * 100, this.a);\n        },\n        toBytes: function () {\n            return new Bytes(this.r * 255, this.g * 255, this.b * 255, this.a);\n        }\n    });\n    var Bytes = RGB.extend({\n        init: function (r, g, b, a) {\n            RGB.fn.init.call(this, Math.round(r), Math.round(g), Math.round(b), a);\n        },\n        toRGB: function () {\n            return new RGB(this.r / 255, this.g / 255, this.b / 255, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toHex: function () {\n            return hex(this.r, 2) + hex(this.g, 2) + hex(this.b, 2);\n        },\n        toBytes: function () {\n            return this;\n        }\n    });\n    function hex(n, width, pad) {\n        if (pad === void 0) {\n            pad = '0';\n        }\n        var result = n.toString(16);\n        while (width > result.length) {\n            result = pad + result;\n        }\n        return result;\n    }\n    var HSV = BaseColor.extend({\n        init: function (h, s, v, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.v = v;\n            this.a = a;\n        },\n        toRGB: function () {\n            var ref = this;\n            var h = ref.h;\n            var s = ref.s;\n            var v = ref.v;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = v;\n            } else {\n                h /= 60;\n                var i = Math.floor(h);\n                var f = h - i;\n                var p = v * (1 - s);\n                var q = v * (1 - s * f);\n                var t = v * (1 - s * (1 - f));\n                switch (i) {\n                case 0:\n                    r = v;\n                    g = t;\n                    b = p;\n                    break;\n                case 1:\n                    r = q;\n                    g = v;\n                    b = p;\n                    break;\n                case 2:\n                    r = p;\n                    g = v;\n                    b = t;\n                    break;\n                case 3:\n                    r = p;\n                    g = q;\n                    b = v;\n                    break;\n                case 4:\n                    r = t;\n                    g = p;\n                    b = v;\n                    break;\n                default:\n                    r = v;\n                    g = p;\n                    b = q;\n                    break;\n                }\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSL: function () {\n            return this.toRGB().toHSL();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    var HSL = BaseColor.extend({\n        init: function (h, s, l, a) {\n            BaseColor.fn.init.call(this);\n            this.h = h;\n            this.s = s;\n            this.l = l;\n            this.a = a;\n        },\n        toRGB: function () {\n            var h = this.h / 360;\n            var s = this.s / 100;\n            var l = this.l / 100;\n            var r, g, b;\n            if (s === 0) {\n                r = g = b = l;\n            } else {\n                var q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n                var p = 2 * l - q;\n                r = hue2rgb(p, q, h + 1 / 3);\n                g = hue2rgb(p, q, h);\n                b = hue2rgb(p, q, h - 1 / 3);\n            }\n            return new RGB(r, g, b, this.a);\n        },\n        toHSV: function () {\n            return this.toRGB().toHSV();\n        },\n        toBytes: function () {\n            return this.toRGB().toBytes();\n        }\n    });\n    function hue2rgb(p, q, s) {\n        var t = s;\n        if (t < 0) {\n            t += 1;\n        }\n        if (t > 1) {\n            t -= 1;\n        }\n        if (t < 1 / 6) {\n            return p + (q - p) * 6 * t;\n        }\n        if (t < 1 / 2) {\n            return q;\n        }\n        if (t < 2 / 3) {\n            return p + (q - p) * (2 / 3 - t) * 6;\n        }\n        return p;\n    }\n    function parseColor(value, safe) {\n        var m, ret;\n        if (value == null || value === 'none') {\n            return null;\n        }\n        if (value instanceof BaseColor) {\n            return value;\n        }\n        var color = value.toLowerCase();\n        if (m = matchNamedColor(color)) {\n            if (m[1] === 'transparent') {\n                color = new RGB(1, 1, 1, 0);\n            } else {\n                color = parseColor(namedColors[m[1]], safe);\n            }\n            color.match = [m[1]];\n            return color;\n        }\n        if (m = /^#?([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 16), parseInt(m[2], 16), parseInt(m[3], 16), 1);\n        } else if (m = /^#?([0-9a-f])([0-9a-f])([0-9a-f])\\b/i.exec(color)) {\n            ret = new Bytes(parseInt(m[1] + m[1], 16), parseInt(m[2] + m[2], 16), parseInt(m[3] + m[3], 16), 1);\n        } else if (m = /^rgb\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), 1);\n        } else if (m = /^rgba\\(\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9]+)\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new Bytes(parseInt(m[1], 10), parseInt(m[2], 10), parseInt(m[3], 10), parseFloat(m[4]));\n        } else if (m = /^rgb\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, 1);\n        } else if (m = /^rgba\\(\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9]*\\.?[0-9]+)%\\s*,\\s*([0-9.]+)\\s*\\)/.exec(color)) {\n            ret = new RGB(parseFloat(m[1]) / 100, parseFloat(m[2]) / 100, parseFloat(m[3]) / 100, parseFloat(m[4]));\n        }\n        if (ret) {\n            ret.match = m;\n        } else if (!safe) {\n            throw new Error('Cannot parse color: ' + color);\n        }\n        return ret;\n    }\n    var Color = Class.extend({\n        init: function (value) {\n            var this$1 = this;\n            if (arguments.length === 1) {\n                var formats = Color.formats;\n                var resolvedColor = this.resolveColor(value);\n                for (var idx = 0; idx < formats.length; idx++) {\n                    var formatRegex = formats[idx].re;\n                    var processor = formats[idx].process;\n                    var parts = formatRegex.exec(resolvedColor);\n                    if (parts) {\n                        var channels = processor(parts);\n                        this$1.r = channels[0];\n                        this$1.g = channels[1];\n                        this$1.b = channels[2];\n                    }\n                }\n            } else {\n                this.r = arguments[0];\n                this.g = arguments[1];\n                this.b = arguments[2];\n            }\n            this.r = this.normalizeByte(this.r);\n            this.g = this.normalizeByte(this.g);\n            this.b = this.normalizeByte(this.b);\n        },\n        toHex: function () {\n            var pad = this.padDigit;\n            var r = this.r.toString(16);\n            var g = this.g.toString(16);\n            var b = this.b.toString(16);\n            return '#' + pad(r) + pad(g) + pad(b);\n        },\n        resolveColor: function (value) {\n            var color = value || 'black';\n            if (color.charAt(0) === '#') {\n                color = color.substr(1, 6);\n            }\n            color = color.replace(/ /g, '');\n            color = color.toLowerCase();\n            color = Color.namedColors[color] || color;\n            return color;\n        },\n        normalizeByte: function (value) {\n            if (value < 0 || isNaN(value)) {\n                return 0;\n            }\n            return value > 255 ? 255 : value;\n        },\n        padDigit: function (value) {\n            return value.length === 1 ? '0' + value : value;\n        },\n        brightness: function (value) {\n            var round = Math.round;\n            this.r = round(this.normalizeByte(this.r * value));\n            this.g = round(this.normalizeByte(this.g * value));\n            this.b = round(this.normalizeByte(this.b * value));\n            return this;\n        },\n        percBrightness: function () {\n            return Math.sqrt(0.241 * this.r * this.r + 0.691 * this.g * this.g + 0.068 * this.b * this.b);\n        }\n    });\n    Color.fromBytes = function (r, g, b, a) {\n        return new Bytes(r, g, b, a != null ? a : 1);\n    };\n    Color.fromRGB = function (r, g, b, a) {\n        return new RGB(r, g, b, a != null ? a : 1);\n    };\n    Color.fromHSV = function (h, s, v, a) {\n        return new HSV(h, s, v, a != null ? a : 1);\n    };\n    Color.fromHSL = function (h, s, l, a) {\n        return new HSL(h, s, l, a != null ? a : 1);\n    };\n    Color.formats = [\n        {\n            re: /^rgb\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})\\)$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 10),\n                    parseInt(parts[2], 10),\n                    parseInt(parts[3], 10)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{2})(\\w{2})(\\w{2})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1], 16),\n                    parseInt(parts[2], 16),\n                    parseInt(parts[3], 16)\n                ];\n            }\n        },\n        {\n            re: /^(\\w{1})(\\w{1})(\\w{1})$/,\n            process: function (parts) {\n                return [\n                    parseInt(parts[1] + parts[1], 16),\n                    parseInt(parts[2] + parts[2], 16),\n                    parseInt(parts[3] + parts[3], 16)\n                ];\n            }\n        }\n    ];\n    Color.namedColors = namedColors;\n    kendo.deepExtend(kendo, {\n        parseColor: parseColor,\n        Color: Color\n    });\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('util/text-metrics', ['kendo.core'], f);\n}(function () {\n    (function ($) {\n        window.kendo.util = window.kendo.util || {};\n        var LRUCache = kendo.Class.extend({\n            init: function (size) {\n                this._size = size;\n                this._length = 0;\n                this._map = {};\n            },\n            put: function (key, value) {\n                var map = this._map;\n                var entry = {\n                    key: key,\n                    value: value\n                };\n                map[key] = entry;\n                if (!this._head) {\n                    this._head = this._tail = entry;\n                } else {\n                    this._tail.newer = entry;\n                    entry.older = this._tail;\n                    this._tail = entry;\n                }\n                if (this._length >= this._size) {\n                    map[this._head.key] = null;\n                    this._head = this._head.newer;\n                    this._head.older = null;\n                } else {\n                    this._length++;\n                }\n            },\n            get: function (key) {\n                var entry = this._map[key];\n                if (entry) {\n                    if (entry === this._head && entry !== this._tail) {\n                        this._head = entry.newer;\n                        this._head.older = null;\n                    }\n                    if (entry !== this._tail) {\n                        if (entry.older) {\n                            entry.older.newer = entry.newer;\n                            entry.newer.older = entry.older;\n                        }\n                        entry.older = this._tail;\n                        entry.newer = null;\n                        this._tail.newer = entry;\n                        this._tail = entry;\n                    }\n                    return entry.value;\n                }\n            }\n        });\n        var REPLACE_REGEX = /\\r?\\n|\\r|\\t/g;\n        var SPACE = ' ';\n        function normalizeText(text) {\n            return String(text).replace(REPLACE_REGEX, SPACE);\n        }\n        function objectKey(object) {\n            var parts = [];\n            for (var key in object) {\n                parts.push(key + object[key]);\n            }\n            return parts.sort().join('');\n        }\n        function hashKey(str) {\n            var hash = 2166136261;\n            for (var i = 0; i < str.length; ++i) {\n                hash += (hash << 1) + (hash << 4) + (hash << 7) + (hash << 8) + (hash << 24);\n                hash ^= str.charCodeAt(i);\n            }\n            return hash >>> 0;\n        }\n        function zeroSize() {\n            return {\n                width: 0,\n                height: 0,\n                baseline: 0\n            };\n        }\n        var DEFAULT_OPTIONS = { baselineMarkerSize: 1 };\n        var defaultMeasureBox;\n        if (typeof document !== 'undefined') {\n            defaultMeasureBox = document.createElement('div');\n            defaultMeasureBox.style.cssText = 'position: absolute !important; top: -4000px !important; width: auto !important; height: auto !important;' + 'padding: 0 !important; margin: 0 !important; border: 0 !important;' + 'line-height: normal !important; visibility: hidden !important; white-space: pre!important;';\n        }\n        var TextMetrics = kendo.Class.extend({\n            init: function (options) {\n                this._cache = new LRUCache(1000);\n                this.options = $.extend({}, DEFAULT_OPTIONS, options);\n            },\n            measure: function (text, style, options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                if (!text) {\n                    return zeroSize();\n                }\n                var styleKey = objectKey(style);\n                var cacheKey = hashKey(text + styleKey);\n                var cachedResult = this._cache.get(cacheKey);\n                if (cachedResult) {\n                    return cachedResult;\n                }\n                var size = zeroSize();\n                var measureBox = options.box || defaultMeasureBox;\n                var baselineMarker = this._baselineMarker().cloneNode(false);\n                for (var key in style) {\n                    var value = style[key];\n                    if (typeof value !== 'undefined') {\n                        measureBox.style[key] = value;\n                    }\n                }\n                var textStr = options.normalizeText !== false ? normalizeText(text) : String(text);\n                measureBox.textContent = textStr;\n                measureBox.appendChild(baselineMarker);\n                document.body.appendChild(measureBox);\n                if (textStr.length) {\n                    size.width = measureBox.offsetWidth - this.options.baselineMarkerSize;\n                    size.height = measureBox.offsetHeight;\n                    size.baseline = baselineMarker.offsetTop + this.options.baselineMarkerSize;\n                }\n                if (size.width > 0 && size.height > 0) {\n                    this._cache.put(cacheKey, size);\n                }\n                measureBox.parentNode.removeChild(measureBox);\n                return size;\n            },\n            _baselineMarker: function () {\n                var marker = document.createElement('div');\n                marker.style.cssText = 'display: inline-block; vertical-align: baseline;width: ' + this.options.baselineMarkerSize + 'px; height: ' + this.options.baselineMarkerSize + 'px;overflow: hidden;';\n                return marker;\n            }\n        });\n        TextMetrics.current = new TextMetrics();\n        function measureText(text, style, measureBox) {\n            return TextMetrics.current.measure(text, style, measureBox);\n        }\n        kendo.deepExtend(kendo.util, {\n            LRUCache: LRUCache,\n            TextMetrics: TextMetrics,\n            measureText: measureText,\n            objectKey: objectKey,\n            hashKey: hashKey,\n            normalizeText: normalizeText\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/kendo-drawing', [\n        'drawing/util',\n        'kendo.color',\n        'util/text-metrics'\n    ], f);\n}(function () {\n    (function ($) {\n        window.kendo = window.kendo || {};\n        var kendoDrawing = kendo.drawing;\n        var kendoDrawingUtil = kendoDrawing.util;\n        var Class = kendo.Class;\n        var kendoUtil = kendo.util;\n        var support = kendo.support;\n        var supportBrowser = support.browser;\n        var createPromise = kendoDrawingUtil.createPromise;\n        var promiseAll = kendoDrawingUtil.promiseAll;\n        var ObserversMixin = {\n            extend: function (proto) {\n                var this$1 = this;\n                for (var method in this) {\n                    if (method !== 'extend') {\n                        proto[method] = this$1[method];\n                    }\n                }\n            },\n            observers: function () {\n                this._observers = this._observers || [];\n                return this._observers;\n            },\n            addObserver: function (element) {\n                if (!this._observers) {\n                    this._observers = [element];\n                } else {\n                    this._observers.push(element);\n                }\n                return this;\n            },\n            removeObserver: function (element) {\n                var observers = this.observers();\n                var index = observers.indexOf(element);\n                if (index !== -1) {\n                    observers.splice(index, 1);\n                }\n                return this;\n            },\n            trigger: function (methodName, event) {\n                var observers = this._observers;\n                if (observers && !this._suspended) {\n                    for (var idx = 0; idx < observers.length; idx++) {\n                        var observer = observers[idx];\n                        if (observer[methodName]) {\n                            observer[methodName](event);\n                        }\n                    }\n                }\n                return this;\n            },\n            optionsChange: function (e) {\n                if (e === void 0) {\n                    e = {};\n                }\n                e.element = this;\n                this.trigger('optionsChange', e);\n            },\n            geometryChange: function () {\n                this.trigger('geometryChange', { element: this });\n            },\n            suspend: function () {\n                this._suspended = (this._suspended || 0) + 1;\n                return this;\n            },\n            resume: function () {\n                this._suspended = Math.max((this._suspended || 0) - 1, 0);\n                return this;\n            },\n            _observerField: function (field, value) {\n                if (this[field]) {\n                    this[field].removeObserver(this);\n                }\n                this[field] = value;\n                value.addObserver(this);\n            }\n        };\n        function append(first, second) {\n            first.push.apply(first, second);\n            return first;\n        }\n        var literals = {\n            1: 'i',\n            10: 'x',\n            100: 'c',\n            2: 'ii',\n            20: 'xx',\n            200: 'cc',\n            3: 'iii',\n            30: 'xxx',\n            300: 'ccc',\n            4: 'iv',\n            40: 'xl',\n            400: 'cd',\n            5: 'v',\n            50: 'l',\n            500: 'd',\n            6: 'vi',\n            60: 'lx',\n            600: 'dc',\n            7: 'vii',\n            70: 'lxx',\n            700: 'dcc',\n            8: 'viii',\n            80: 'lxxx',\n            800: 'dccc',\n            9: 'ix',\n            90: 'xc',\n            900: 'cm',\n            1000: 'm'\n        };\n        function arabicToRoman(n) {\n            var values = [\n                1000,\n                900,\n                800,\n                700,\n                600,\n                500,\n                400,\n                300,\n                200,\n                100,\n                90,\n                80,\n                70,\n                60,\n                50,\n                40,\n                30,\n                20,\n                10,\n                9,\n                8,\n                7,\n                6,\n                5,\n                4,\n                3,\n                2,\n                1\n            ];\n            var roman = '';\n            while (n > 0) {\n                if (n < values[0]) {\n                    values.shift();\n                } else {\n                    roman += literals[values[0]];\n                    n -= values[0];\n                }\n            }\n            return roman;\n        }\n        var UNDEFINED = 'undefined';\n        function defined(value) {\n            return typeof value !== UNDEFINED;\n        }\n        var defId = 1;\n        function definitionId() {\n            return 'kdef' + defId++;\n        }\n        var DEG_TO_RAD = Math.PI / 180;\n        var MAX_NUM = Number.MAX_VALUE;\n        var MIN_NUM = -Number.MAX_VALUE;\n        function deg(radians) {\n            return radians / DEG_TO_RAD;\n        }\n        var KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';\n        var fromCharCode = String.fromCharCode;\n        function encodeUTF8(input) {\n            var output = '';\n            for (var i = 0; i < input.length; i++) {\n                var c = input.charCodeAt(i);\n                if (c < 128) {\n                    output += fromCharCode(c);\n                } else if (c < 2048) {\n                    output += fromCharCode(192 | c >>> 6);\n                    output += fromCharCode(128 | c & 63);\n                } else if (c < 65536) {\n                    output += fromCharCode(224 | c >>> 12);\n                    output += fromCharCode(128 | c >>> 6 & 63);\n                    output += fromCharCode(128 | c & 63);\n                }\n            }\n            return output;\n        }\n        function encodeBase64(input) {\n            var output = '';\n            var i = 0;\n            var utfInput = encodeUTF8(input);\n            while (i < utfInput.length) {\n                var chr1 = utfInput.charCodeAt(i++);\n                var chr2 = utfInput.charCodeAt(i++);\n                var chr3 = utfInput.charCodeAt(i++);\n                var enc1 = chr1 >> 2;\n                var enc2 = (chr1 & 3) << 4 | chr2 >> 4;\n                var enc3 = (chr2 & 15) << 2 | chr3 >> 6;\n                var enc4 = chr3 & 63;\n                if (isNaN(chr2)) {\n                    enc3 = enc4 = 64;\n                } else if (isNaN(chr3)) {\n                    enc4 = 64;\n                }\n                output = output + KEY_STR.charAt(enc1) + KEY_STR.charAt(enc2) + KEY_STR.charAt(enc3) + KEY_STR.charAt(enc4);\n            }\n            return output;\n        }\n        function eventCoordinates(e) {\n            if (defined((e.x || {}).location)) {\n                return {\n                    x: e.x.location,\n                    y: e.y.location\n                };\n            }\n            return {\n                x: e.pageX || e.clientX || 0,\n                y: e.pageY || e.clientY || 0\n            };\n        }\n        function eventElement(e) {\n            if (e === void 0) {\n                e = {};\n            }\n            return e.touch ? e.touch.initialTouch : e.target;\n        }\n        function isTransparent(color) {\n            return color === '' || color === null || color === 'none' || color === 'transparent' || !defined(color);\n        }\n        function last(array) {\n            if (array) {\n                return array[array.length - 1];\n            }\n        }\n        function limitValue(value, min, max) {\n            return Math.max(Math.min(value, max), min);\n        }\n        function mergeSort(a, cmp) {\n            if (a.length < 2) {\n                return a.slice();\n            }\n            function merge(a, b) {\n                var r = [], ai = 0, bi = 0, i = 0;\n                while (ai < a.length && bi < b.length) {\n                    if (cmp(a[ai], b[bi]) <= 0) {\n                        r[i++] = a[ai++];\n                    } else {\n                        r[i++] = b[bi++];\n                    }\n                }\n                if (ai < a.length) {\n                    r.push.apply(r, a.slice(ai));\n                }\n                if (bi < b.length) {\n                    r.push.apply(r, b.slice(bi));\n                }\n                return r;\n            }\n            return function sort(a) {\n                if (a.length <= 1) {\n                    return a;\n                }\n                var m = Math.floor(a.length / 2);\n                var left = a.slice(0, m);\n                var right = a.slice(m);\n                left = sort(left);\n                right = sort(right);\n                return merge(left, right);\n            }(a);\n        }\n        function rad(degrees) {\n            return degrees * DEG_TO_RAD;\n        }\n        function pow(p) {\n            if (p) {\n                return Math.pow(10, p);\n            }\n            return 1;\n        }\n        function round(value, precision) {\n            var power = pow(precision);\n            return Math.round(value * power) / power;\n        }\n        function valueOrDefault(value, defaultValue) {\n            return defined(value) ? value : defaultValue;\n        }\n        function bindEvents(element, events) {\n            for (var eventName in events) {\n                var eventNames = eventName.trim().split(' ');\n                for (var idx = 0; idx < eventNames.length; idx++) {\n                    element.addEventListener(eventNames[idx], events[eventName], false);\n                }\n            }\n        }\n        function elementOffset(element) {\n            var box = element.getBoundingClientRect();\n            var documentElement = document.documentElement;\n            return {\n                top: box.top + (window.pageYOffset || documentElement.scrollTop) - (documentElement.clientTop || 0),\n                left: box.left + (window.pageXOffset || documentElement.scrollLeft) - (documentElement.clientLeft || 0)\n            };\n        }\n        function elementStyles(element, styles) {\n            var result = {};\n            var style = window.getComputedStyle(element) || {};\n            var stylesArray = Array.isArray(styles) ? styles : [styles];\n            for (var idx = 0; idx < stylesArray.length; idx++) {\n                var field = stylesArray[idx];\n                result[field] = style[field];\n            }\n            return result;\n        }\n        function getPixels(value) {\n            if (isNaN(value)) {\n                return value;\n            }\n            return value + 'px';\n        }\n        function elementSize(element, size) {\n            if (size) {\n                var width = size.width;\n                var height = size.height;\n                if (defined(width)) {\n                    element.style.width = getPixels(width);\n                }\n                if (defined(height)) {\n                    element.style.height = getPixels(height);\n                }\n            } else {\n                var size$1 = elementStyles(element, [\n                    'width',\n                    'height'\n                ]);\n                return {\n                    width: parseInt(size$1.width, 10),\n                    height: parseInt(size$1.height, 10)\n                };\n            }\n        }\n        function unbindEvents(element, events) {\n            if (events === void 0) {\n                events = {};\n            }\n            for (var name in events) {\n                var eventNames = name.trim().split(' ');\n                for (var idx = 0; idx < eventNames.length; idx++) {\n                    element.removeEventListener(eventNames[idx], events[name], false);\n                }\n            }\n        }\n        var util = {\n            append: append,\n            arabicToRoman: arabicToRoman,\n            createPromise: createPromise,\n            defined: defined,\n            definitionId: definitionId,\n            deg: deg,\n            encodeBase64: encodeBase64,\n            eventCoordinates: eventCoordinates,\n            eventElement: eventElement,\n            isTransparent: isTransparent,\n            last: last,\n            limitValue: limitValue,\n            mergeSort: mergeSort,\n            promiseAll: promiseAll,\n            rad: rad,\n            round: round,\n            valueOrDefault: valueOrDefault,\n            bindEvents: bindEvents,\n            elementOffset: elementOffset,\n            elementSize: elementSize,\n            elementStyles: elementStyles,\n            unbindEvents: unbindEvents,\n            DEG_TO_RAD: DEG_TO_RAD,\n            MAX_NUM: MAX_NUM,\n            MIN_NUM: MIN_NUM\n        };\n        var toString = {}.toString;\n        var OptionsStore = Class.extend({\n            init: function (options, prefix) {\n                var this$1 = this;\n                if (prefix === void 0) {\n                    prefix = '';\n                }\n                this.prefix = prefix;\n                for (var field in options) {\n                    var member = options[field];\n                    member = this$1._wrap(member, field);\n                    this$1[field] = member;\n                }\n            },\n            get: function (field) {\n                var parts = field.split('.');\n                var result = this;\n                while (parts.length && result) {\n                    var part = parts.shift();\n                    result = result[part];\n                }\n                return result;\n            },\n            set: function (field, value) {\n                var current = this.get(field);\n                if (current !== value) {\n                    this._set(field, this._wrap(value, field));\n                    this.optionsChange({\n                        field: this.prefix + field,\n                        value: value\n                    });\n                }\n            },\n            _set: function (field, value) {\n                var this$1 = this;\n                var composite = field.indexOf('.') >= 0;\n                var parentObj = this;\n                var fieldName = field;\n                if (composite) {\n                    var parts = fieldName.split('.');\n                    var prefix = this.prefix;\n                    while (parts.length > 1) {\n                        fieldName = parts.shift();\n                        prefix += fieldName + '.';\n                        var obj = parentObj[fieldName];\n                        if (!obj) {\n                            obj = new OptionsStore({}, prefix);\n                            obj.addObserver(this$1);\n                            parentObj[fieldName] = obj;\n                        }\n                        parentObj = obj;\n                    }\n                    fieldName = parts[0];\n                }\n                parentObj._clear(fieldName);\n                parentObj[fieldName] = value;\n            },\n            _clear: function (field) {\n                var current = this[field];\n                if (current && current.removeObserver) {\n                    current.removeObserver(this);\n                }\n            },\n            _wrap: function (object, field) {\n                var type = toString.call(object);\n                var wrapped = object;\n                if (wrapped !== null && defined(wrapped) && type === '[object Object]') {\n                    if (!(object instanceof OptionsStore) && !(object instanceof Class)) {\n                        wrapped = new OptionsStore(wrapped, this.prefix + field + '.');\n                    }\n                    wrapped.addObserver(this);\n                }\n                return wrapped;\n            }\n        });\n        ObserversMixin.extend(OptionsStore.prototype);\n        function setAccessor(field) {\n            return function (value) {\n                if (this[field] !== value) {\n                    this[field] = value;\n                    this.geometryChange();\n                }\n                return this;\n            };\n        }\n        function getAccessor(field) {\n            return function () {\n                return this[field];\n            };\n        }\n        function defineAccessors(fn, fields) {\n            for (var i = 0; i < fields.length; i++) {\n                var name = fields[i];\n                var capitalized = name.charAt(0).toUpperCase() + name.substring(1, name.length);\n                fn['set' + capitalized] = setAccessor(name);\n                fn['get' + capitalized] = getAccessor(name);\n            }\n        }\n        var Matrix = Class.extend({\n            init: function (a, b, c, d, e, f) {\n                if (a === void 0) {\n                    a = 0;\n                }\n                if (b === void 0) {\n                    b = 0;\n                }\n                if (c === void 0) {\n                    c = 0;\n                }\n                if (d === void 0) {\n                    d = 0;\n                }\n                if (e === void 0) {\n                    e = 0;\n                }\n                if (f === void 0) {\n                    f = 0;\n                }\n                this.a = a;\n                this.b = b;\n                this.c = c;\n                this.d = d;\n                this.e = e;\n                this.f = f;\n            },\n            multiplyCopy: function (matrix) {\n                return new Matrix(this.a * matrix.a + this.c * matrix.b, this.b * matrix.a + this.d * matrix.b, this.a * matrix.c + this.c * matrix.d, this.b * matrix.c + this.d * matrix.d, this.a * matrix.e + this.c * matrix.f + this.e, this.b * matrix.e + this.d * matrix.f + this.f);\n            },\n            invert: function () {\n                var ref = this;\n                var a = ref.a;\n                var b = ref.b;\n                var d = ref.c;\n                var e = ref.d;\n                var g = ref.e;\n                var h = ref.f;\n                var det = a * e - b * d;\n                if (det === 0) {\n                    return null;\n                }\n                return new Matrix(e / det, -b / det, -d / det, a / det, (d * h - e * g) / det, (b * g - a * h) / det);\n            },\n            clone: function () {\n                return new Matrix(this.a, this.b, this.c, this.d, this.e, this.f);\n            },\n            equals: function (other) {\n                if (!other) {\n                    return false;\n                }\n                return this.a === other.a && this.b === other.b && this.c === other.c && this.d === other.d && this.e === other.e && this.f === other.f;\n            },\n            round: function (precision) {\n                this.a = round(this.a, precision);\n                this.b = round(this.b, precision);\n                this.c = round(this.c, precision);\n                this.d = round(this.d, precision);\n                this.e = round(this.e, precision);\n                this.f = round(this.f, precision);\n                return this;\n            },\n            toArray: function (precision) {\n                var result = [\n                    this.a,\n                    this.b,\n                    this.c,\n                    this.d,\n                    this.e,\n                    this.f\n                ];\n                if (defined(precision)) {\n                    for (var i = 0; i < result.length; i++) {\n                        result[i] = round(result[i], precision);\n                    }\n                }\n                return result;\n            },\n            toString: function (precision, separator) {\n                if (separator === void 0) {\n                    separator = ',';\n                }\n                return this.toArray(precision).join(separator);\n            }\n        });\n        Matrix.translate = function (x, y) {\n            return new Matrix(1, 0, 0, 1, x, y);\n        };\n        Matrix.unit = function () {\n            return new Matrix(1, 0, 0, 1, 0, 0);\n        };\n        Matrix.rotate = function (angle, x, y) {\n            var matrix = new Matrix();\n            matrix.a = Math.cos(rad(angle));\n            matrix.b = Math.sin(rad(angle));\n            matrix.c = -matrix.b;\n            matrix.d = matrix.a;\n            matrix.e = x - x * matrix.a + y * matrix.b || 0;\n            matrix.f = y - y * matrix.a - x * matrix.b || 0;\n            return matrix;\n        };\n        Matrix.scale = function (scaleX, scaleY) {\n            return new Matrix(scaleX, 0, 0, scaleY, 0, 0);\n        };\n        Matrix.IDENTITY = Matrix.unit();\n        function toMatrix(transformation) {\n            if (transformation && typeof transformation.matrix === 'function') {\n                return transformation.matrix();\n            }\n            return transformation;\n        }\n        var Point = Class.extend({\n            init: function (x, y) {\n                this.x = x || 0;\n                this.y = y || 0;\n            },\n            equals: function (other) {\n                return other && other.x === this.x && other.y === this.y;\n            },\n            clone: function () {\n                return new Point(this.x, this.y);\n            },\n            rotate: function (angle, origin) {\n                var originPoint = Point.create(origin) || Point.ZERO;\n                return this.transform(Matrix.rotate(angle, originPoint.x, originPoint.y));\n            },\n            translate: function (x, y) {\n                this.x += x;\n                this.y += y;\n                this.geometryChange();\n                return this;\n            },\n            translateWith: function (point) {\n                return this.translate(point.x, point.y);\n            },\n            move: function (x, y) {\n                this.x = this.y = 0;\n                return this.translate(x, y);\n            },\n            scale: function (scaleX, scaleY) {\n                if (scaleY === void 0) {\n                    scaleY = scaleX;\n                }\n                this.x *= scaleX;\n                this.y *= scaleY;\n                this.geometryChange();\n                return this;\n            },\n            scaleCopy: function (scaleX, scaleY) {\n                return this.clone().scale(scaleX, scaleY);\n            },\n            transform: function (transformation) {\n                var matrix = toMatrix(transformation);\n                var ref = this;\n                var x = ref.x;\n                var y = ref.y;\n                this.x = matrix.a * x + matrix.c * y + matrix.e;\n                this.y = matrix.b * x + matrix.d * y + matrix.f;\n                this.geometryChange();\n                return this;\n            },\n            transformCopy: function (transformation) {\n                var point = this.clone();\n                if (transformation) {\n                    point.transform(transformation);\n                }\n                return point;\n            },\n            distanceTo: function (point) {\n                var dx = this.x - point.x;\n                var dy = this.y - point.y;\n                return Math.sqrt(dx * dx + dy * dy);\n            },\n            round: function (digits) {\n                this.x = round(this.x, digits);\n                this.y = round(this.y, digits);\n                this.geometryChange();\n                return this;\n            },\n            toArray: function (digits) {\n                var doRound = defined(digits);\n                var x = doRound ? round(this.x, digits) : this.x;\n                var y = doRound ? round(this.y, digits) : this.y;\n                return [\n                    x,\n                    y\n                ];\n            },\n            toString: function (digits, separator) {\n                if (separator === void 0) {\n                    separator = ' ';\n                }\n                var ref = this;\n                var x = ref.x;\n                var y = ref.y;\n                if (defined(digits)) {\n                    x = round(x, digits);\n                    y = round(y, digits);\n                }\n                return x + separator + y;\n            }\n        });\n        Point.create = function (arg0, arg1) {\n            if (defined(arg0)) {\n                if (arg0 instanceof Point) {\n                    return arg0;\n                } else if (arguments.length === 1 && arg0.length === 2) {\n                    return new Point(arg0[0], arg0[1]);\n                }\n                return new Point(arg0, arg1);\n            }\n        };\n        Point.min = function () {\n            var arguments$1 = arguments;\n            var minX = MAX_NUM;\n            var minY = MAX_NUM;\n            for (var i = 0; i < arguments.length; i++) {\n                var point = arguments$1[i];\n                minX = Math.min(point.x, minX);\n                minY = Math.min(point.y, minY);\n            }\n            return new Point(minX, minY);\n        };\n        Point.max = function () {\n            var arguments$1 = arguments;\n            var maxX = MIN_NUM;\n            var maxY = MIN_NUM;\n            for (var i = 0; i < arguments.length; i++) {\n                var point = arguments$1[i];\n                maxX = Math.max(point.x, maxX);\n                maxY = Math.max(point.y, maxY);\n            }\n            return new Point(maxX, maxY);\n        };\n        Point.minPoint = function () {\n            return new Point(MIN_NUM, MIN_NUM);\n        };\n        Point.maxPoint = function () {\n            return new Point(MAX_NUM, MAX_NUM);\n        };\n        if (Object.defineProperties) {\n            Object.defineProperties(Point, {\n                ZERO: {\n                    get: function () {\n                        return new Point(0, 0);\n                    }\n                }\n            });\n        }\n        defineAccessors(Point.prototype, [\n            'x',\n            'y'\n        ]);\n        ObserversMixin.extend(Point.prototype);\n        var Size = Class.extend({\n            init: function (width, height) {\n                this.width = width || 0;\n                this.height = height || 0;\n            },\n            equals: function (other) {\n                return other && other.width === this.width && other.height === this.height;\n            },\n            clone: function () {\n                return new Size(this.width, this.height);\n            },\n            toArray: function (digits) {\n                var doRound = defined(digits);\n                var width = doRound ? round(this.width, digits) : this.width;\n                var height = doRound ? round(this.height, digits) : this.height;\n                return [\n                    width,\n                    height\n                ];\n            }\n        });\n        Size.create = function (arg0, arg1) {\n            if (defined(arg0)) {\n                if (arg0 instanceof Size) {\n                    return arg0;\n                } else if (arguments.length === 1 && arg0.length === 2) {\n                    return new Size(arg0[0], arg0[1]);\n                }\n                return new Size(arg0, arg1);\n            }\n        };\n        if (Object.defineProperties) {\n            Object.defineProperties(Size, {\n                ZERO: {\n                    get: function () {\n                        return new Size(0, 0);\n                    }\n                }\n            });\n        }\n        defineAccessors(Size.prototype, [\n            'width',\n            'height'\n        ]);\n        ObserversMixin.extend(Size.prototype);\n        var Rect = Class.extend({\n            init: function (origin, size) {\n                if (origin === void 0) {\n                    origin = new Point();\n                }\n                if (size === void 0) {\n                    size = new Size();\n                }\n                this.setOrigin(origin);\n                this.setSize(size);\n            },\n            clone: function () {\n                return new Rect(this.origin.clone(), this.size.clone());\n            },\n            equals: function (other) {\n                return other && other.origin.equals(this.origin) && other.size.equals(this.size);\n            },\n            setOrigin: function (value) {\n                this._observerField('origin', Point.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getOrigin: function () {\n                return this.origin;\n            },\n            setSize: function (value) {\n                this._observerField('size', Size.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getSize: function () {\n                return this.size;\n            },\n            width: function () {\n                return this.size.width;\n            },\n            height: function () {\n                return this.size.height;\n            },\n            topLeft: function () {\n                return this.origin.clone();\n            },\n            bottomRight: function () {\n                return this.origin.clone().translate(this.width(), this.height());\n            },\n            topRight: function () {\n                return this.origin.clone().translate(this.width(), 0);\n            },\n            bottomLeft: function () {\n                return this.origin.clone().translate(0, this.height());\n            },\n            center: function () {\n                return this.origin.clone().translate(this.width() / 2, this.height() / 2);\n            },\n            bbox: function (matrix) {\n                var tl = this.topLeft().transformCopy(matrix);\n                var tr = this.topRight().transformCopy(matrix);\n                var br = this.bottomRight().transformCopy(matrix);\n                var bl = this.bottomLeft().transformCopy(matrix);\n                return Rect.fromPoints(tl, tr, br, bl);\n            },\n            transformCopy: function (m) {\n                return Rect.fromPoints(this.topLeft().transform(m), this.bottomRight().transform(m));\n            },\n            expand: function (x, y) {\n                if (y === void 0) {\n                    y = x;\n                }\n                this.size.width += 2 * x;\n                this.size.height += 2 * y;\n                this.origin.translate(-x, -y);\n                return this;\n            },\n            expandCopy: function (x, y) {\n                return this.clone().expand(x, y);\n            },\n            containsPoint: function (point) {\n                var origin = this.origin;\n                var bottomRight = this.bottomRight();\n                return !(point.x < origin.x || point.y < origin.y || bottomRight.x < point.x || bottomRight.y < point.y);\n            },\n            _isOnPath: function (point, width) {\n                var rectOuter = this.expandCopy(width, width);\n                var rectInner = this.expandCopy(-width, -width);\n                return rectOuter.containsPoint(point) && !rectInner.containsPoint(point);\n            }\n        });\n        Rect.fromPoints = function () {\n            var topLeft = Point.min.apply(null, arguments);\n            var bottomRight = Point.max.apply(null, arguments);\n            var size = new Size(bottomRight.x - topLeft.x, bottomRight.y - topLeft.y);\n            return new Rect(topLeft, size);\n        };\n        Rect.union = function (a, b) {\n            return Rect.fromPoints(Point.min(a.topLeft(), b.topLeft()), Point.max(a.bottomRight(), b.bottomRight()));\n        };\n        Rect.intersect = function (a, b) {\n            var rect1 = {\n                left: a.topLeft().x,\n                top: a.topLeft().y,\n                right: a.bottomRight().x,\n                bottom: a.bottomRight().y\n            };\n            var rect2 = {\n                left: b.topLeft().x,\n                top: b.topLeft().y,\n                right: b.bottomRight().x,\n                bottom: b.bottomRight().y\n            };\n            if (rect1.left <= rect2.right && rect2.left <= rect1.right && rect1.top <= rect2.bottom && rect2.top <= rect1.bottom) {\n                return Rect.fromPoints(new Point(Math.max(rect1.left, rect2.left), Math.max(rect1.top, rect2.top)), new Point(Math.min(rect1.right, rect2.right), Math.min(rect1.bottom, rect2.bottom)));\n            }\n        };\n        ObserversMixin.extend(Rect.prototype);\n        var Transformation = Class.extend({\n            init: function (matrix) {\n                if (matrix === void 0) {\n                    matrix = Matrix.unit();\n                }\n                this._matrix = matrix;\n            },\n            clone: function () {\n                return new Transformation(this._matrix.clone());\n            },\n            equals: function (other) {\n                return other && other._matrix.equals(this._matrix);\n            },\n            translate: function (x, y) {\n                this._matrix = this._matrix.multiplyCopy(Matrix.translate(x, y));\n                this._optionsChange();\n                return this;\n            },\n            scale: function (scaleX, scaleY, origin) {\n                if (scaleY === void 0) {\n                    scaleY = scaleX;\n                }\n                if (origin === void 0) {\n                    origin = null;\n                }\n                var originPoint = origin;\n                if (originPoint) {\n                    originPoint = Point.create(originPoint);\n                    this._matrix = this._matrix.multiplyCopy(Matrix.translate(originPoint.x, originPoint.y));\n                }\n                this._matrix = this._matrix.multiplyCopy(Matrix.scale(scaleX, scaleY));\n                if (originPoint) {\n                    this._matrix = this._matrix.multiplyCopy(Matrix.translate(-originPoint.x, -originPoint.y));\n                }\n                this._optionsChange();\n                return this;\n            },\n            rotate: function (angle, origin) {\n                var originPoint = Point.create(origin) || Point.ZERO;\n                this._matrix = this._matrix.multiplyCopy(Matrix.rotate(angle, originPoint.x, originPoint.y));\n                this._optionsChange();\n                return this;\n            },\n            multiply: function (transformation) {\n                var matrix = toMatrix(transformation);\n                this._matrix = this._matrix.multiplyCopy(matrix);\n                this._optionsChange();\n                return this;\n            },\n            matrix: function (value) {\n                if (value) {\n                    this._matrix = value;\n                    this._optionsChange();\n                    return this;\n                }\n                return this._matrix;\n            },\n            _optionsChange: function () {\n                this.optionsChange({\n                    field: 'transform',\n                    value: this\n                });\n            }\n        });\n        ObserversMixin.extend(Transformation.prototype);\n        function transform(matrix) {\n            if (matrix === null) {\n                return null;\n            }\n            if (matrix instanceof Transformation) {\n                return matrix;\n            }\n            return new Transformation(matrix);\n        }\n        var Element$1 = Class.extend({\n            init: function (options) {\n                this._initOptions(options);\n            },\n            _initOptions: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                var clip = options.clip;\n                var transform$$1 = options.transform;\n                if (transform$$1) {\n                    options.transform = transform(transform$$1);\n                }\n                if (clip && !clip.id) {\n                    clip.id = definitionId();\n                }\n                this.options = new OptionsStore(options);\n                this.options.addObserver(this);\n            },\n            transform: function (value) {\n                if (defined(value)) {\n                    this.options.set('transform', transform(value));\n                } else {\n                    return this.options.get('transform');\n                }\n            },\n            parentTransform: function () {\n                var element = this;\n                var parentMatrix;\n                while (element.parent) {\n                    element = element.parent;\n                    var transformation = element.transform();\n                    if (transformation) {\n                        parentMatrix = transformation.matrix().multiplyCopy(parentMatrix || Matrix.unit());\n                    }\n                }\n                if (parentMatrix) {\n                    return transform(parentMatrix);\n                }\n            },\n            currentTransform: function (parentTransform) {\n                if (parentTransform === void 0) {\n                    parentTransform = this.parentTransform();\n                }\n                var elementTransform = this.transform();\n                var elementMatrix = toMatrix(elementTransform);\n                var parentMatrix = toMatrix(parentTransform);\n                var combinedMatrix;\n                if (elementMatrix && parentMatrix) {\n                    combinedMatrix = parentMatrix.multiplyCopy(elementMatrix);\n                } else {\n                    combinedMatrix = elementMatrix || parentMatrix;\n                }\n                if (combinedMatrix) {\n                    return transform(combinedMatrix);\n                }\n            },\n            visible: function (value) {\n                if (defined(value)) {\n                    this.options.set('visible', value);\n                    return this;\n                }\n                return this.options.get('visible') !== false;\n            },\n            clip: function (value) {\n                var options = this.options;\n                if (defined(value)) {\n                    if (value && !value.id) {\n                        value.id = definitionId();\n                    }\n                    options.set('clip', value);\n                    return this;\n                }\n                return options.get('clip');\n            },\n            opacity: function (value) {\n                if (defined(value)) {\n                    this.options.set('opacity', value);\n                    return this;\n                }\n                return valueOrDefault(this.options.get('opacity'), 1);\n            },\n            clippedBBox: function (transformation) {\n                var bbox = this._clippedBBox(transformation);\n                if (bbox) {\n                    var clip = this.clip();\n                    return clip ? Rect.intersect(bbox, clip.bbox(transformation)) : bbox;\n                }\n            },\n            containsPoint: function (point, parentTransform) {\n                if (this.visible()) {\n                    var transform$$1 = this.currentTransform(parentTransform);\n                    var transformedPoint = point;\n                    if (transform$$1) {\n                        transformedPoint = point.transformCopy(transform$$1.matrix().invert());\n                    }\n                    return this._hasFill() && this._containsPoint(transformedPoint) || this._isOnPath && this._hasStroke() && this._isOnPath(transformedPoint);\n                }\n                return false;\n            },\n            _hasFill: function () {\n                var fill = this.options.fill;\n                return fill && !isTransparent(fill.color);\n            },\n            _hasStroke: function () {\n                var stroke = this.options.stroke;\n                return stroke && stroke.width > 0 && !isTransparent(stroke.color);\n            },\n            _clippedBBox: function (transformation) {\n                return this.bbox(transformation);\n            }\n        });\n        Element$1.prototype.nodeType = 'Element';\n        ObserversMixin.extend(Element$1.prototype);\n        function ellipseExtremeAngles(center, rx, ry, matrix) {\n            var extremeX = 0;\n            var extremeY = 0;\n            if (matrix) {\n                extremeX = Math.atan2(matrix.c * ry, matrix.a * rx);\n                if (matrix.b !== 0) {\n                    extremeY = Math.atan2(matrix.d * ry, matrix.b * rx);\n                }\n            }\n            return {\n                x: extremeX,\n                y: extremeY\n            };\n        }\n        var PI_DIV_2 = Math.PI / 2;\n        var Circle$2 = Class.extend({\n            init: function (center, radius) {\n                if (center === void 0) {\n                    center = new Point();\n                }\n                if (radius === void 0) {\n                    radius = 0;\n                }\n                this.setCenter(center);\n                this.setRadius(radius);\n            },\n            setCenter: function (value) {\n                this._observerField('center', Point.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getCenter: function () {\n                return this.center;\n            },\n            equals: function (other) {\n                return other && other.center.equals(this.center) && other.radius === this.radius;\n            },\n            clone: function () {\n                return new Circle$2(this.center.clone(), this.radius);\n            },\n            pointAt: function (angle) {\n                return this._pointAt(rad(angle));\n            },\n            bbox: function (matrix) {\n                var this$1 = this;\n                var extremeAngles = ellipseExtremeAngles(this.center, this.radius, this.radius, matrix);\n                var minPoint = Point.maxPoint();\n                var maxPoint = Point.minPoint();\n                for (var i = 0; i < 4; i++) {\n                    var currentPointX = this$1._pointAt(extremeAngles.x + i * PI_DIV_2).transformCopy(matrix);\n                    var currentPointY = this$1._pointAt(extremeAngles.y + i * PI_DIV_2).transformCopy(matrix);\n                    var currentPoint = new Point(currentPointX.x, currentPointY.y);\n                    minPoint = Point.min(minPoint, currentPoint);\n                    maxPoint = Point.max(maxPoint, currentPoint);\n                }\n                return Rect.fromPoints(minPoint, maxPoint);\n            },\n            _pointAt: function (angle) {\n                var ref = this;\n                var center = ref.center;\n                var radius = ref.radius;\n                return new Point(center.x + radius * Math.cos(angle), center.y + radius * Math.sin(angle));\n            },\n            containsPoint: function (point) {\n                var ref = this;\n                var center = ref.center;\n                var radius = ref.radius;\n                var inCircle = Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2) <= Math.pow(radius, 2);\n                return inCircle;\n            },\n            _isOnPath: function (point, width) {\n                var ref = this;\n                var center = ref.center;\n                var radius = ref.radius;\n                var pointDistance = center.distanceTo(point);\n                return radius - width <= pointDistance && pointDistance <= radius + width;\n            }\n        });\n        defineAccessors(Circle$2.prototype, ['radius']);\n        ObserversMixin.extend(Circle$2.prototype);\n        var GRADIENT = 'Gradient';\n        var Paintable = {\n            extend: function (proto) {\n                proto.fill = this.fill;\n                proto.stroke = this.stroke;\n            },\n            fill: function (color, opacity) {\n                var options = this.options;\n                if (defined(color)) {\n                    if (color && color.nodeType !== GRADIENT) {\n                        var newFill = { color: color };\n                        if (defined(opacity)) {\n                            newFill.opacity = opacity;\n                        }\n                        options.set('fill', newFill);\n                    } else {\n                        options.set('fill', color);\n                    }\n                    return this;\n                }\n                return options.get('fill');\n            },\n            stroke: function (color, width, opacity) {\n                if (defined(color)) {\n                    this.options.set('stroke.color', color);\n                    if (defined(width)) {\n                        this.options.set('stroke.width', width);\n                    }\n                    if (defined(opacity)) {\n                        this.options.set('stroke.opacity', opacity);\n                    }\n                    return this;\n                }\n                return this.options.get('stroke');\n            }\n        };\n        var IDENTITY_MATRIX_HASH = Matrix.IDENTITY.toString();\n        var Measurable = {\n            extend: function (proto) {\n                proto.bbox = this.bbox;\n                proto.geometryChange = this.geometryChange;\n            },\n            bbox: function (transformation) {\n                var combinedMatrix = toMatrix(this.currentTransform(transformation));\n                var matrixHash = combinedMatrix ? combinedMatrix.toString() : IDENTITY_MATRIX_HASH;\n                var bbox;\n                if (this._bboxCache && this._matrixHash === matrixHash) {\n                    bbox = this._bboxCache.clone();\n                } else {\n                    bbox = this._bbox(combinedMatrix);\n                    this._bboxCache = bbox ? bbox.clone() : null;\n                    this._matrixHash = matrixHash;\n                }\n                var strokeWidth = this.options.get('stroke.width');\n                if (strokeWidth && bbox) {\n                    bbox.expand(strokeWidth / 2);\n                }\n                return bbox;\n            },\n            geometryChange: function () {\n                delete this._bboxCache;\n                this.trigger('geometryChange', { element: this });\n            }\n        };\n        function geometryAccessor(name) {\n            var fieldName = '_' + name;\n            return function (value) {\n                if (defined(value)) {\n                    this._observerField(fieldName, value);\n                    this.geometryChange();\n                    return this;\n                }\n                return this[fieldName];\n            };\n        }\n        function defineGeometryAccessors(fn, names) {\n            for (var i = 0; i < names.length; i++) {\n                fn[names[i]] = geometryAccessor(names[i]);\n            }\n        }\n        var DEFAULT_STROKE = '#000';\n        var Circle = Element$1.extend({\n            init: function (geometry, options) {\n                if (geometry === void 0) {\n                    geometry = new Circle$2();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.geometry(geometry);\n                if (!defined(this.options.stroke)) {\n                    this.stroke(DEFAULT_STROKE);\n                }\n            },\n            rawBBox: function () {\n                return this._geometry.bbox();\n            },\n            _bbox: function (matrix) {\n                return this._geometry.bbox(matrix);\n            },\n            _containsPoint: function (point) {\n                return this.geometry().containsPoint(point);\n            },\n            _isOnPath: function (point) {\n                return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n            }\n        });\n        Circle.prototype.nodeType = 'Circle';\n        Paintable.extend(Circle.prototype);\n        Measurable.extend(Circle.prototype);\n        defineGeometryAccessors(Circle.prototype, ['geometry']);\n        var PRECISION = 10;\n        function close(a, b, tolerance) {\n            if (tolerance === void 0) {\n                tolerance = PRECISION;\n            }\n            return round(Math.abs(a - b), tolerance) === 0;\n        }\n        function closeOrLess(a, b, tolerance) {\n            return a < b || close(a, b, tolerance);\n        }\n        function lineIntersection(p0, p1, p2, p3) {\n            var s1x = p1.x - p0.x;\n            var s2x = p3.x - p2.x;\n            var s1y = p1.y - p0.y;\n            var s2y = p3.y - p2.y;\n            var nx = p0.x - p2.x;\n            var ny = p0.y - p2.y;\n            var d = s1x * s2y - s2x * s1y;\n            var s = (s1x * ny - s1y * nx) / d;\n            var t = (s2x * ny - s2y * nx) / d;\n            if (s >= 0 && s <= 1 && t >= 0 && t <= 1) {\n                return new Point(p0.x + t * s1x, p0.y + t * s1y);\n            }\n        }\n        var MAX_INTERVAL = 45;\n        var pow$1 = Math.pow;\n        var Arc$2 = Class.extend({\n            init: function (center, options) {\n                if (center === void 0) {\n                    center = new Point();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                this.setCenter(center);\n                this.radiusX = options.radiusX;\n                this.radiusY = options.radiusY || options.radiusX;\n                this.startAngle = options.startAngle;\n                this.endAngle = options.endAngle;\n                this.anticlockwise = options.anticlockwise || false;\n                this.xRotation = options.xRotation;\n            },\n            clone: function () {\n                return new Arc$2(this.center, {\n                    radiusX: this.radiusX,\n                    radiusY: this.radiusY,\n                    startAngle: this.startAngle,\n                    endAngle: this.endAngle,\n                    anticlockwise: this.anticlockwise\n                });\n            },\n            setCenter: function (value) {\n                this._observerField('center', Point.create(value));\n                this.geometryChange();\n                return this;\n            },\n            getCenter: function () {\n                return this.center;\n            },\n            pointAt: function (angle) {\n                var center = this.center;\n                var radian = rad(angle);\n                return new Point(center.x + this.radiusX * Math.cos(radian), center.y + this.radiusY * Math.sin(radian));\n            },\n            curvePoints: function () {\n                var this$1 = this;\n                var startAngle = this.startAngle;\n                var dir = this.anticlockwise ? -1 : 1;\n                var curvePoints = [this.pointAt(startAngle)];\n                var interval = this._arcInterval();\n                var intervalAngle = interval.endAngle - interval.startAngle;\n                var subIntervalsCount = Math.ceil(intervalAngle / MAX_INTERVAL);\n                var subIntervalAngle = intervalAngle / subIntervalsCount;\n                var currentAngle = startAngle;\n                var transformation;\n                if (this.xRotation) {\n                    transformation = transform().rotate(this.xRotation, this.center);\n                }\n                for (var i = 1; i <= subIntervalsCount; i++) {\n                    var nextAngle = currentAngle + dir * subIntervalAngle;\n                    var points = this$1._intervalCurvePoints(currentAngle, nextAngle, transformation);\n                    curvePoints.push(points.cp1, points.cp2, points.p2);\n                    currentAngle = nextAngle;\n                }\n                return curvePoints;\n            },\n            bbox: function (matrix) {\n                var this$1 = this;\n                var interval = this._arcInterval();\n                var startAngle = interval.startAngle;\n                var endAngle = interval.endAngle;\n                var extremeAngles = ellipseExtremeAngles(this.center, this.radiusX, this.radiusY, matrix);\n                var extremeX = deg(extremeAngles.x);\n                var extremeY = deg(extremeAngles.y);\n                var endPoint = this.pointAt(endAngle).transformCopy(matrix);\n                var currentAngleX = bboxStartAngle(extremeX, startAngle);\n                var currentAngleY = bboxStartAngle(extremeY, startAngle);\n                var currentPoint = this.pointAt(startAngle).transformCopy(matrix);\n                var minPoint = Point.min(currentPoint, endPoint);\n                var maxPoint = Point.max(currentPoint, endPoint);\n                while (currentAngleX < endAngle || currentAngleY < endAngle) {\n                    var currentPointX = void 0;\n                    if (currentAngleX < endAngle) {\n                        currentPointX = this$1.pointAt(currentAngleX).transformCopy(matrix);\n                        currentAngleX += 90;\n                    }\n                    var currentPointY = void 0;\n                    if (currentAngleY < endAngle) {\n                        currentPointY = this$1.pointAt(currentAngleY).transformCopy(matrix);\n                        currentAngleY += 90;\n                    }\n                    currentPoint = new Point(currentPointX.x, currentPointY.y);\n                    minPoint = Point.min(minPoint, currentPoint);\n                    maxPoint = Point.max(maxPoint, currentPoint);\n                }\n                return Rect.fromPoints(minPoint, maxPoint);\n            },\n            _arcInterval: function () {\n                var ref = this;\n                var startAngle = ref.startAngle;\n                var endAngle = ref.endAngle;\n                var anticlockwise = ref.anticlockwise;\n                if (anticlockwise) {\n                    var oldStart = startAngle;\n                    startAngle = endAngle;\n                    endAngle = oldStart;\n                }\n                if (startAngle > endAngle || anticlockwise && startAngle === endAngle) {\n                    endAngle += 360;\n                }\n                return {\n                    startAngle: startAngle,\n                    endAngle: endAngle\n                };\n            },\n            _intervalCurvePoints: function (startAngle, endAngle, transformation) {\n                var p1 = this.pointAt(startAngle);\n                var p2 = this.pointAt(endAngle);\n                var p1Derivative = this._derivativeAt(startAngle);\n                var p2Derivative = this._derivativeAt(endAngle);\n                var t = (rad(endAngle) - rad(startAngle)) / 3;\n                var cp1 = new Point(p1.x + t * p1Derivative.x, p1.y + t * p1Derivative.y);\n                var cp2 = new Point(p2.x - t * p2Derivative.x, p2.y - t * p2Derivative.y);\n                if (transformation) {\n                    p1.transform(transformation);\n                    p2.transform(transformation);\n                    cp1.transform(transformation);\n                    cp2.transform(transformation);\n                }\n                return {\n                    p1: p1,\n                    cp1: cp1,\n                    cp2: cp2,\n                    p2: p2\n                };\n            },\n            _derivativeAt: function (angle) {\n                var radian = rad(angle);\n                return new Point(-this.radiusX * Math.sin(radian), this.radiusY * Math.cos(radian));\n            },\n            containsPoint: function (point) {\n                var interval = this._arcInterval();\n                var intervalAngle = interval.endAngle - interval.startAngle;\n                var ref = this;\n                var center = ref.center;\n                var radiusX = ref.radiusX;\n                var radiusY = ref.radiusY;\n                var distance = center.distanceTo(point);\n                var angleRad = Math.atan2(point.y - center.y, point.x - center.x);\n                var pointRadius = radiusX * radiusY / Math.sqrt(pow$1(radiusX, 2) * pow$1(Math.sin(angleRad), 2) + pow$1(radiusY, 2) * pow$1(Math.cos(angleRad), 2));\n                var startPoint = this.pointAt(this.startAngle).round(PRECISION);\n                var endPoint = this.pointAt(this.endAngle).round(PRECISION);\n                var intersection = lineIntersection(center, point.round(PRECISION), startPoint, endPoint);\n                var containsPoint;\n                if (intervalAngle < 180) {\n                    containsPoint = intersection && closeOrLess(center.distanceTo(intersection), distance) && closeOrLess(distance, pointRadius);\n                } else {\n                    var angle = calculateAngle(center.x, center.y, radiusX, radiusY, point.x, point.y);\n                    if (angle !== 360) {\n                        angle = (360 + angle) % 360;\n                    }\n                    var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n                    containsPoint = inAngleRange && closeOrLess(distance, pointRadius) || !inAngleRange && (!intersection || intersection.equals(point));\n                }\n                return containsPoint;\n            },\n            _isOnPath: function (point, width) {\n                var interval = this._arcInterval();\n                var center = this.center;\n                var angle = calculateAngle(center.x, center.y, this.radiusX, this.radiusY, point.x, point.y);\n                if (angle !== 360) {\n                    angle = (360 + angle) % 360;\n                }\n                var inAngleRange = interval.startAngle <= angle && angle <= interval.endAngle;\n                return inAngleRange && this.pointAt(angle).distanceTo(point) <= width;\n            }\n        });\n        Arc$2.fromPoints = function (start, end, rx, ry, largeArc, swipe, rotation) {\n            var arcParameters = normalizeArcParameters({\n                x1: start.x,\n                y1: start.y,\n                x2: end.x,\n                y2: end.y,\n                rx: rx,\n                ry: ry,\n                largeArc: largeArc,\n                swipe: swipe,\n                rotation: rotation\n            });\n            return new Arc$2(arcParameters.center, {\n                startAngle: arcParameters.startAngle,\n                endAngle: arcParameters.endAngle,\n                radiusX: arcParameters.radiusX,\n                radiusY: arcParameters.radiusY,\n                xRotation: arcParameters.xRotation,\n                anticlockwise: swipe === 0\n            });\n        };\n        defineAccessors(Arc$2.prototype, [\n            'radiusX',\n            'radiusY',\n            'startAngle',\n            'endAngle',\n            'anticlockwise'\n        ]);\n        ObserversMixin.extend(Arc$2.prototype);\n        function calculateAngle(cx, cy, rx, ry, x, y) {\n            var cos = round((x - cx) / rx, 3);\n            var sin = round((y - cy) / ry, 3);\n            return round(deg(Math.atan2(sin, cos)));\n        }\n        function normalizeArcParameters(parameters) {\n            var x1 = parameters.x1;\n            var y1 = parameters.y1;\n            var x2 = parameters.x2;\n            var y2 = parameters.y2;\n            var rx = parameters.rx;\n            var ry = parameters.ry;\n            var largeArc = parameters.largeArc;\n            var swipe = parameters.swipe;\n            var rotation = parameters.rotation;\n            if (rotation === void 0) {\n                rotation = 0;\n            }\n            var radians = rad(rotation);\n            var cosine = Math.cos(radians);\n            var sine = Math.sin(radians);\n            var xT = cosine * (x1 - x2) / 2 + sine * (y1 - y2) / 2;\n            var yT = -sine * (x1 - x2) / 2 + cosine * (y1 - y2) / 2;\n            var sign = largeArc !== swipe ? 1 : -1;\n            var xt2 = Math.pow(xT, 2);\n            var yt2 = Math.pow(yT, 2);\n            var rx2 = Math.pow(rx, 2);\n            var ry2 = Math.pow(ry, 2);\n            var delta = xt2 / rx2 + yt2 / ry2;\n            if (delta > 1) {\n                delta = Math.sqrt(xt2 / rx2 + yt2 / ry2);\n                rx = delta * rx;\n                rx2 = Math.pow(rx, 2);\n                ry = delta * ry;\n                ry2 = Math.pow(ry, 2);\n            }\n            var constT = sign * Math.sqrt((rx2 * ry2 - rx2 * yt2 - ry2 * xt2) / (rx2 * yt2 + ry2 * xt2));\n            if (isNaN(constT)) {\n                constT = 0;\n            }\n            var cxT = constT * (rx * yT) / ry;\n            var cyT = -constT * (ry * xT) / rx;\n            var cx = cosine * cxT - sine * cyT + (x1 + x2) / 2;\n            var cy = sine * cxT + cosine * cyT + (y1 + y2) / 2;\n            var uX = (xT - cxT) / rx;\n            var uY = (yT - cyT) / ry;\n            var vX = -(xT + cxT) / rx;\n            var vY = -(yT + cyT) / ry;\n            var startAngle = (uY >= 0 ? 1 : -1) * deg(Math.acos(uX / Math.sqrt(uX * uX + uY * uY)));\n            var angleCosine = round((uX * vX + uY * vY) / (Math.sqrt(uX * uX + uY * uY) * Math.sqrt(vX * vX + vY * vY)), 10);\n            var angle = (uX * vY - uY * vX >= 0 ? 1 : -1) * deg(Math.acos(angleCosine));\n            if (!swipe && angle > 0) {\n                angle -= 360;\n            }\n            if (swipe && angle < 0) {\n                angle += 360;\n            }\n            var endAngle = startAngle + angle;\n            var signEndAngle = endAngle >= 0 ? 1 : -1;\n            endAngle = Math.abs(endAngle) % 360 * signEndAngle;\n            return {\n                center: new Point(cx, cy),\n                startAngle: startAngle,\n                endAngle: endAngle,\n                radiusX: rx,\n                radiusY: ry,\n                xRotation: rotation\n            };\n        }\n        function bboxStartAngle(angle, start) {\n            var startAngle = angle;\n            while (startAngle < start) {\n                startAngle += 90;\n            }\n            return startAngle;\n        }\n        var push = [].push;\n        var pop = [].pop;\n        var splice = [].splice;\n        var shift = [].shift;\n        var slice = [].slice;\n        var unshift = [].unshift;\n        var ElementsArray = Class.extend({\n            init: function (array) {\n                if (array === void 0) {\n                    array = [];\n                }\n                this.length = 0;\n                this._splice(0, array.length, array);\n            },\n            elements: function (value) {\n                if (value) {\n                    this._splice(0, this.length, value);\n                    this._change();\n                    return this;\n                }\n                return this.slice(0);\n            },\n            push: function () {\n                var elements = arguments;\n                var result = push.apply(this, elements);\n                this._add(elements);\n                return result;\n            },\n            slice: function () {\n                return slice.call(this);\n            },\n            pop: function () {\n                var length = this.length;\n                var result = pop.apply(this);\n                if (length) {\n                    this._remove([result]);\n                }\n                return result;\n            },\n            splice: function (index, howMany) {\n                var elements = slice.call(arguments, 2);\n                var result = this._splice(index, howMany, elements);\n                this._change();\n                return result;\n            },\n            shift: function () {\n                var length = this.length;\n                var result = shift.apply(this);\n                if (length) {\n                    this._remove([result]);\n                }\n                return result;\n            },\n            unshift: function () {\n                var elements = arguments;\n                var result = unshift.apply(this, elements);\n                this._add(elements);\n                return result;\n            },\n            indexOf: function (element) {\n                var this$1 = this;\n                var length = this.length;\n                for (var idx = 0; idx < length; idx++) {\n                    if (this$1[idx] === element) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            _splice: function (index, howMany, elements) {\n                var result = splice.apply(this, [\n                    index,\n                    howMany\n                ].concat(elements));\n                this._clearObserver(result);\n                this._setObserver(elements);\n                return result;\n            },\n            _add: function (elements) {\n                this._setObserver(elements);\n                this._change();\n            },\n            _remove: function (elements) {\n                this._clearObserver(elements);\n                this._change();\n            },\n            _setObserver: function (elements) {\n                var this$1 = this;\n                for (var idx = 0; idx < elements.length; idx++) {\n                    elements[idx].addObserver(this$1);\n                }\n            },\n            _clearObserver: function (elements) {\n                var this$1 = this;\n                for (var idx = 0; idx < elements.length; idx++) {\n                    elements[idx].removeObserver(this$1);\n                }\n            },\n            _change: function () {\n            }\n        });\n        ObserversMixin.extend(ElementsArray.prototype);\n        var GeometryElementsArray = ElementsArray.extend({\n            _change: function () {\n                this.geometryChange();\n            }\n        });\n        function pointAccessor(name) {\n            var fieldName = '_' + name;\n            return function (value) {\n                if (defined(value)) {\n                    this._observerField(fieldName, Point.create(value));\n                    this.geometryChange();\n                    return this;\n                }\n                return this[fieldName];\n            };\n        }\n        function definePointAccessors(fn, names) {\n            for (var i = 0; i < names.length; i++) {\n                fn[names[i]] = pointAccessor(names[i]);\n            }\n        }\n        function isOutOfEndPoint(endPoint, controlPoint, point) {\n            var angle = deg(Math.atan2(controlPoint.y - endPoint.y, controlPoint.x - endPoint.x));\n            var rotatedPoint = point.transformCopy(transform().rotate(-angle, endPoint));\n            return rotatedPoint.x < endPoint.x;\n        }\n        function calculateCurveAt(t, field, points) {\n            var t1 = 1 - t;\n            return Math.pow(t1, 3) * points[0][field] + 3 * Math.pow(t1, 2) * t * points[1][field] + 3 * Math.pow(t, 2) * t1 * points[2][field] + Math.pow(t, 3) * points[3][field];\n        }\n        function toCubicPolynomial(points, field) {\n            return [\n                -points[0][field] + 3 * points[1][field] - 3 * points[2][field] + points[3][field],\n                3 * (points[0][field] - 2 * points[1][field] + points[2][field]),\n                3 * (-points[0][field] + points[1][field]),\n                points[0][field]\n            ];\n        }\n        var ComplexNumber = Class.extend({\n            init: function (real, img) {\n                if (real === void 0) {\n                    real = 0;\n                }\n                if (img === void 0) {\n                    img = 0;\n                }\n                this.real = real;\n                this.img = img;\n            },\n            add: function (cNumber) {\n                return new ComplexNumber(round(this.real + cNumber.real, PRECISION), round(this.img + cNumber.img, PRECISION));\n            },\n            addConstant: function (value) {\n                return new ComplexNumber(this.real + value, this.img);\n            },\n            negate: function () {\n                return new ComplexNumber(-this.real, -this.img);\n            },\n            multiply: function (cNumber) {\n                return new ComplexNumber(this.real * cNumber.real - this.img * cNumber.img, this.real * cNumber.img + this.img * cNumber.real);\n            },\n            multiplyConstant: function (value) {\n                return new ComplexNumber(this.real * value, this.img * value);\n            },\n            nthRoot: function (n) {\n                var rad$$1 = Math.atan2(this.img, this.real);\n                var r = Math.sqrt(Math.pow(this.img, 2) + Math.pow(this.real, 2));\n                var nthR = Math.pow(r, 1 / n);\n                return new ComplexNumber(nthR * Math.cos(rad$$1 / n), nthR * Math.sin(rad$$1 / n));\n            },\n            equals: function (cNumber) {\n                return this.real === cNumber.real && this.img === cNumber.img;\n            },\n            isReal: function () {\n                return this.img === 0;\n            }\n        });\n        function numberSign(x) {\n            return x < 0 ? -1 : 1;\n        }\n        function solveQuadraticEquation(a, b, c) {\n            var squareRoot = Math.sqrt(Math.pow(b, 2) - 4 * a * c);\n            return [\n                (-b + squareRoot) / (2 * a),\n                (-b - squareRoot) / (2 * a)\n            ];\n        }\n        function solveCubicEquation(a, b, c, d) {\n            if (a === 0) {\n                return solveQuadraticEquation(b, c, d);\n            }\n            var p = (3 * a * c - Math.pow(b, 2)) / (3 * Math.pow(a, 2));\n            var q = (2 * Math.pow(b, 3) - 9 * a * b * c + 27 * Math.pow(a, 2) * d) / (27 * Math.pow(a, 3));\n            var Q = Math.pow(p / 3, 3) + Math.pow(q / 2, 2);\n            var i = new ComplexNumber(0, 1);\n            var b3a = -b / (3 * a);\n            var x1, x2, y1, y2, y3, z1, z2;\n            if (Q < 0) {\n                x1 = new ComplexNumber(-q / 2, Math.sqrt(-Q)).nthRoot(3);\n                x2 = new ComplexNumber(-q / 2, -Math.sqrt(-Q)).nthRoot(3);\n            } else {\n                x1 = -q / 2 + Math.sqrt(Q);\n                x1 = new ComplexNumber(numberSign(x1) * Math.pow(Math.abs(x1), 1 / 3));\n                x2 = -q / 2 - Math.sqrt(Q);\n                x2 = new ComplexNumber(numberSign(x2) * Math.pow(Math.abs(x2), 1 / 3));\n            }\n            y1 = x1.add(x2);\n            z1 = x1.add(x2).multiplyConstant(-1 / 2);\n            z2 = x1.add(x2.negate()).multiplyConstant(Math.sqrt(3) / 2);\n            y2 = z1.add(i.multiply(z2));\n            y3 = z1.add(i.negate().multiply(z2));\n            var result = [];\n            if (y1.isReal()) {\n                result.push(round(y1.real + b3a, PRECISION));\n            }\n            if (y2.isReal()) {\n                result.push(round(y2.real + b3a, PRECISION));\n            }\n            if (y3.isReal()) {\n                result.push(round(y3.real + b3a, PRECISION));\n            }\n            return result;\n        }\n        function hasRootsInRange(points, point, field, rootField, range) {\n            var polynomial = toCubicPolynomial(points, rootField);\n            var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point[rootField]);\n            var intersection;\n            for (var idx = 0; idx < roots.length; idx++) {\n                if (0 <= roots[idx] && roots[idx] <= 1) {\n                    intersection = calculateCurveAt(roots[idx], field, points);\n                    if (Math.abs(intersection - point[field]) <= range) {\n                        return true;\n                    }\n                }\n            }\n        }\n        function curveIntersectionsCount(points, point, bbox) {\n            var polynomial = toCubicPolynomial(points, 'x');\n            var roots = solveCubicEquation(polynomial[0], polynomial[1], polynomial[2], polynomial[3] - point.x);\n            var rayIntersection, intersectsRay;\n            var count = 0;\n            for (var i = 0; i < roots.length; i++) {\n                rayIntersection = calculateCurveAt(roots[i], 'y', points);\n                intersectsRay = close(rayIntersection, point.y) || rayIntersection > point.y;\n                if (intersectsRay && ((roots[i] === 0 || roots[i] === 1) && bbox.bottomRight().x > point.x || 0 < roots[i] && roots[i] < 1)) {\n                    count++;\n                }\n            }\n            return count;\n        }\n        function lineIntersectionsCount(a, b, point) {\n            var intersects;\n            if (a.x !== b.x) {\n                var minX = Math.min(a.x, b.x);\n                var maxX = Math.max(a.x, b.x);\n                var minY = Math.min(a.y, b.y);\n                var maxY = Math.max(a.y, b.y);\n                var inRange = minX <= point.x && point.x < maxX;\n                if (minY === maxY) {\n                    intersects = point.y <= minY && inRange;\n                } else {\n                    intersects = inRange && (maxY - minY) * ((a.x - b.x) * (a.y - b.y) > 0 ? point.x - minX : maxX - point.x) / (maxX - minX) + minY - point.y >= 0;\n                }\n            }\n            return intersects ? 1 : 0;\n        }\n        var Segment = Class.extend({\n            init: function (anchor, controlIn, controlOut) {\n                this.anchor(anchor || new Point());\n                this.controlIn(controlIn);\n                this.controlOut(controlOut);\n            },\n            bboxTo: function (toSegment, matrix) {\n                var segmentAnchor = this.anchor().transformCopy(matrix);\n                var toSegmentAnchor = toSegment.anchor().transformCopy(matrix);\n                var rect;\n                if (this.controlOut() && toSegment.controlIn()) {\n                    rect = this._curveBoundingBox(segmentAnchor, this.controlOut().transformCopy(matrix), toSegment.controlIn().transformCopy(matrix), toSegmentAnchor);\n                } else {\n                    rect = this._lineBoundingBox(segmentAnchor, toSegmentAnchor);\n                }\n                return rect;\n            },\n            _lineBoundingBox: function (p1, p2) {\n                return Rect.fromPoints(p1, p2);\n            },\n            _curveBoundingBox: function (p1, cp1, cp2, p2) {\n                var points = [\n                    p1,\n                    cp1,\n                    cp2,\n                    p2\n                ];\n                var extremesX = this._curveExtremesFor(points, 'x');\n                var extremesY = this._curveExtremesFor(points, 'y');\n                var xLimits = arrayLimits([\n                    extremesX.min,\n                    extremesX.max,\n                    p1.x,\n                    p2.x\n                ]);\n                var yLimits = arrayLimits([\n                    extremesY.min,\n                    extremesY.max,\n                    p1.y,\n                    p2.y\n                ]);\n                return Rect.fromPoints(new Point(xLimits.min, yLimits.min), new Point(xLimits.max, yLimits.max));\n            },\n            _curveExtremesFor: function (points, field) {\n                var extremes = this._curveExtremes(points[0][field], points[1][field], points[2][field], points[3][field]);\n                return {\n                    min: calculateCurveAt(extremes.min, field, points),\n                    max: calculateCurveAt(extremes.max, field, points)\n                };\n            },\n            _curveExtremes: function (x1, x2, x3, x4) {\n                var a = x1 - 3 * x2 + 3 * x3 - x4;\n                var b = -2 * (x1 - 2 * x2 + x3);\n                var c = x1 - x2;\n                var sqrt = Math.sqrt(b * b - 4 * a * c);\n                var t1 = 0;\n                var t2 = 1;\n                if (a === 0) {\n                    if (b !== 0) {\n                        t1 = t2 = -c / b;\n                    }\n                } else if (!isNaN(sqrt)) {\n                    t1 = (-b + sqrt) / (2 * a);\n                    t2 = (-b - sqrt) / (2 * a);\n                }\n                var min = Math.max(Math.min(t1, t2), 0);\n                if (min < 0 || min > 1) {\n                    min = 0;\n                }\n                var max = Math.min(Math.max(t1, t2), 1);\n                if (max > 1 || max < 0) {\n                    max = 1;\n                }\n                return {\n                    min: min,\n                    max: max\n                };\n            },\n            _intersectionsTo: function (segment, point) {\n                var intersectionsCount;\n                if (this.controlOut() && segment.controlIn()) {\n                    intersectionsCount = curveIntersectionsCount([\n                        this.anchor(),\n                        this.controlOut(),\n                        segment.controlIn(),\n                        segment.anchor()\n                    ], point, this.bboxTo(segment));\n                } else {\n                    intersectionsCount = lineIntersectionsCount(this.anchor(), segment.anchor(), point);\n                }\n                return intersectionsCount;\n            },\n            _isOnCurveTo: function (segment, point, width, endSegment) {\n                var bbox = this.bboxTo(segment).expand(width, width);\n                if (bbox.containsPoint(point)) {\n                    var p1 = this.anchor();\n                    var p2 = this.controlOut();\n                    var p3 = segment.controlIn();\n                    var p4 = segment.anchor();\n                    if (endSegment === 'start' && p1.distanceTo(point) <= width) {\n                        return !isOutOfEndPoint(p1, p2, point);\n                    } else if (endSegment === 'end' && p4.distanceTo(point) <= width) {\n                        return !isOutOfEndPoint(p4, p3, point);\n                    }\n                    var points = [\n                        p1,\n                        p2,\n                        p3,\n                        p4\n                    ];\n                    if (hasRootsInRange(points, point, 'x', 'y', width) || hasRootsInRange(points, point, 'y', 'x', width)) {\n                        return true;\n                    }\n                    var rotation = transform().rotate(45, point);\n                    var rotatedPoints = [\n                        p1.transformCopy(rotation),\n                        p2.transformCopy(rotation),\n                        p3.transformCopy(rotation),\n                        p4.transformCopy(rotation)\n                    ];\n                    return hasRootsInRange(rotatedPoints, point, 'x', 'y', width) || hasRootsInRange(rotatedPoints, point, 'y', 'x', width);\n                }\n            },\n            _isOnLineTo: function (segment, point, width) {\n                var p1 = this.anchor();\n                var p2 = segment.anchor();\n                var angle = deg(Math.atan2(p2.y - p1.y, p2.x - p1.x));\n                var rect = new Rect([\n                    p1.x,\n                    p1.y - width / 2\n                ], [\n                    p1.distanceTo(p2),\n                    width\n                ]);\n                return rect.containsPoint(point.transformCopy(transform().rotate(-angle, p1)));\n            },\n            _isOnPathTo: function (segment, point, width, endSegment) {\n                var isOnPath;\n                if (this.controlOut() && segment.controlIn()) {\n                    isOnPath = this._isOnCurveTo(segment, point, width / 2, endSegment);\n                } else {\n                    isOnPath = this._isOnLineTo(segment, point, width);\n                }\n                return isOnPath;\n            }\n        });\n        definePointAccessors(Segment.prototype, [\n            'anchor',\n            'controlIn',\n            'controlOut'\n        ]);\n        ObserversMixin.extend(Segment.prototype);\n        function arrayLimits(arr) {\n            var length = arr.length;\n            var min = MAX_NUM;\n            var max = MIN_NUM;\n            for (var i = 0; i < length; i++) {\n                max = Math.max(max, arr[i]);\n                min = Math.min(min, arr[i]);\n            }\n            return {\n                min: min,\n                max: max\n            };\n        }\n        function elementsBoundingBox(elements, applyTransform, transformation) {\n            var boundingBox;\n            for (var i = 0; i < elements.length; i++) {\n                var element = elements[i];\n                if (element.visible()) {\n                    var elementBoundingBox = applyTransform ? element.bbox(transformation) : element.rawBBox();\n                    if (elementBoundingBox) {\n                        if (boundingBox) {\n                            boundingBox = Rect.union(boundingBox, elementBoundingBox);\n                        } else {\n                            boundingBox = elementBoundingBox;\n                        }\n                    }\n                }\n            }\n            return boundingBox;\n        }\n        function elementsClippedBoundingBox(elements, transformation) {\n            var boundingBox;\n            for (var i = 0; i < elements.length; i++) {\n                var element = elements[i];\n                if (element.visible()) {\n                    var elementBoundingBox = element.clippedBBox(transformation);\n                    if (elementBoundingBox) {\n                        if (boundingBox) {\n                            boundingBox = Rect.union(boundingBox, elementBoundingBox);\n                        } else {\n                            boundingBox = elementBoundingBox;\n                        }\n                    }\n                }\n            }\n            return boundingBox;\n        }\n        var MultiPath = Element$1.extend({\n            init: function (options) {\n                Element$1.fn.init.call(this, options);\n                this.paths = new GeometryElementsArray();\n                this.paths.addObserver(this);\n                if (!defined(this.options.stroke)) {\n                    this.stroke('#000');\n                }\n            },\n            moveTo: function (x, y) {\n                var path = new Path();\n                path.moveTo(x, y);\n                this.paths.push(path);\n                return this;\n            },\n            lineTo: function (x, y) {\n                if (this.paths.length > 0) {\n                    last(this.paths).lineTo(x, y);\n                }\n                return this;\n            },\n            curveTo: function (controlOut, controlIn, point) {\n                if (this.paths.length > 0) {\n                    last(this.paths).curveTo(controlOut, controlIn, point);\n                }\n                return this;\n            },\n            arc: function (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n                if (this.paths.length > 0) {\n                    last(this.paths).arc(startAngle, endAngle, radiusX, radiusY, anticlockwise);\n                }\n                return this;\n            },\n            arcTo: function (end, rx, ry, largeArc, swipe, rotation) {\n                if (this.paths.length > 0) {\n                    last(this.paths).arcTo(end, rx, ry, largeArc, swipe, rotation);\n                }\n                return this;\n            },\n            close: function () {\n                if (this.paths.length > 0) {\n                    last(this.paths).close();\n                }\n                return this;\n            },\n            _bbox: function (matrix) {\n                return elementsBoundingBox(this.paths, true, matrix);\n            },\n            rawBBox: function () {\n                return elementsBoundingBox(this.paths, false);\n            },\n            _containsPoint: function (point) {\n                var paths = this.paths;\n                for (var idx = 0; idx < paths.length; idx++) {\n                    if (paths[idx]._containsPoint(point)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _isOnPath: function (point) {\n                var paths = this.paths;\n                var width = this.options.stroke.width;\n                for (var idx = 0; idx < paths.length; idx++) {\n                    if (paths[idx]._isOnPath(point, width)) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _clippedBBox: function (transformation) {\n                return elementsClippedBoundingBox(this.paths, this.currentTransform(transformation));\n            }\n        });\n        MultiPath.prototype.nodeType = 'MultiPath';\n        Paintable.extend(MultiPath.prototype);\n        Measurable.extend(MultiPath.prototype);\n        var ShapeMap = {\n            l: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 2) {\n                    var point = new Point(parameters[i], parameters[i + 1]);\n                    if (options.isRelative) {\n                        point.translateWith(position);\n                    }\n                    path.lineTo(point.x, point.y);\n                    position.x = point.x;\n                    position.y = point.y;\n                }\n            },\n            c: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 6) {\n                    var controlOut = new Point(parameters[i], parameters[i + 1]);\n                    var controlIn = new Point(parameters[i + 2], parameters[i + 3]);\n                    var point = new Point(parameters[i + 4], parameters[i + 5]);\n                    if (options.isRelative) {\n                        controlIn.translateWith(position);\n                        controlOut.translateWith(position);\n                        point.translateWith(position);\n                    }\n                    path.curveTo(controlOut, controlIn, point);\n                    position.x = point.x;\n                    position.y = point.y;\n                }\n            },\n            v: function (path, options) {\n                var value = options.isRelative ? 0 : options.position.x;\n                toLineParamaters(options.parameters, true, value);\n                this.l(path, options);\n            },\n            h: function (path, options) {\n                var value = options.isRelative ? 0 : options.position.y;\n                toLineParamaters(options.parameters, false, value);\n                this.l(path, options);\n            },\n            a: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 7) {\n                    var radiusX = parameters[i];\n                    var radiusY = parameters[i + 1];\n                    var rotation = parameters[i + 2];\n                    var largeArc = parameters[i + 3];\n                    var swipe = parameters[i + 4];\n                    var endPoint = new Point(parameters[i + 5], parameters[i + 6]);\n                    if (options.isRelative) {\n                        endPoint.translateWith(position);\n                    }\n                    if (position.x !== endPoint.x || position.y !== endPoint.y) {\n                        path.arcTo(endPoint, radiusX, radiusY, largeArc, swipe, rotation);\n                        position.x = endPoint.x;\n                        position.y = endPoint.y;\n                    }\n                }\n            },\n            s: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                var previousCommand = options.previousCommand;\n                var lastControlIn;\n                if (previousCommand === 's' || previousCommand === 'c') {\n                    lastControlIn = last(last(path.paths).segments).controlIn();\n                }\n                for (var i = 0; i < parameters.length; i += 4) {\n                    var controlIn = new Point(parameters[i], parameters[i + 1]);\n                    var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n                    var controlOut = void 0;\n                    if (options.isRelative) {\n                        controlIn.translateWith(position);\n                        endPoint.translateWith(position);\n                    }\n                    if (lastControlIn) {\n                        controlOut = reflectionPoint(lastControlIn, position);\n                    } else {\n                        controlOut = position.clone();\n                    }\n                    lastControlIn = controlIn;\n                    path.curveTo(controlOut, controlIn, endPoint);\n                    position.x = endPoint.x;\n                    position.y = endPoint.y;\n                }\n            },\n            q: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                for (var i = 0; i < parameters.length; i += 4) {\n                    var controlPoint = new Point(parameters[i], parameters[i + 1]);\n                    var endPoint = new Point(parameters[i + 2], parameters[i + 3]);\n                    if (options.isRelative) {\n                        controlPoint.translateWith(position);\n                        endPoint.translateWith(position);\n                    }\n                    var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n                    path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n                    position.x = endPoint.x;\n                    position.y = endPoint.y;\n                }\n            },\n            t: function (path, options) {\n                var parameters = options.parameters;\n                var position = options.position;\n                var previousCommand = options.previousCommand;\n                var controlPoint;\n                if (previousCommand === 'q' || previousCommand === 't') {\n                    var lastSegment = last(last(path.paths).segments);\n                    controlPoint = lastSegment.controlIn().clone().translateWith(position.scaleCopy(-1 / 3)).scale(3 / 2);\n                }\n                for (var i = 0; i < parameters.length; i += 2) {\n                    var endPoint = new Point(parameters[i], parameters[i + 1]);\n                    if (options.isRelative) {\n                        endPoint.translateWith(position);\n                    }\n                    if (controlPoint) {\n                        controlPoint = reflectionPoint(controlPoint, position);\n                    } else {\n                        controlPoint = position.clone();\n                    }\n                    var cubicControlPoints = quadraticToCubicControlPoints(position, controlPoint, endPoint);\n                    path.curveTo(cubicControlPoints.controlOut, cubicControlPoints.controlIn, endPoint);\n                    position.x = endPoint.x;\n                    position.y = endPoint.y;\n                }\n            }\n        };\n        function toLineParamaters(parameters, isVertical, value) {\n            var insertPosition = isVertical ? 0 : 1;\n            for (var i = 0; i < parameters.length; i += 2) {\n                parameters.splice(i + insertPosition, 0, value);\n            }\n        }\n        function reflectionPoint(point, center) {\n            if (point && center) {\n                return center.scaleCopy(2).translate(-point.x, -point.y);\n            }\n        }\n        var third = 1 / 3;\n        function quadraticToCubicControlPoints(position, controlPoint, endPoint) {\n            var scaledPoint = controlPoint.clone().scale(2 / 3);\n            return {\n                controlOut: scaledPoint.clone().translateWith(position.scaleCopy(third)),\n                controlIn: scaledPoint.translateWith(endPoint.scaleCopy(third))\n            };\n        }\n        var SEGMENT_REGEX = /([a-df-z]{1})([^a-df-z]*)(z)?/gi;\n        var SPLIT_REGEX = /[,\\s]?([+\\-]?(?:\\d*\\.\\d+|\\d+)(?:[eE][+\\-]?\\d+)?)/g;\n        var MOVE = 'm';\n        var CLOSE = 'z';\n        function parseParameters(str) {\n            var parameters = [];\n            str.replace(SPLIT_REGEX, function (match, number) {\n                parameters.push(parseFloat(number));\n            });\n            return parameters;\n        }\n        var PathParser = Class.extend({\n            parse: function (str, options) {\n                var multiPath = new MultiPath(options);\n                var position = new Point();\n                var previousCommand;\n                str.replace(SEGMENT_REGEX, function (match, element, params, closePath) {\n                    var command = element.toLowerCase();\n                    var isRelative = command === element;\n                    var parameters = parseParameters(params.trim());\n                    if (command === MOVE) {\n                        if (isRelative) {\n                            position.x += parameters[0];\n                            position.y += parameters[1];\n                        } else {\n                            position.x = parameters[0];\n                            position.y = parameters[1];\n                        }\n                        multiPath.moveTo(position.x, position.y);\n                        if (parameters.length > 2) {\n                            command = 'l';\n                            parameters.splice(0, 2);\n                        }\n                    }\n                    if (ShapeMap[command]) {\n                        ShapeMap[command](multiPath, {\n                            parameters: parameters,\n                            position: position,\n                            isRelative: isRelative,\n                            previousCommand: previousCommand\n                        });\n                        if (closePath && closePath.toLowerCase() === CLOSE) {\n                            multiPath.close();\n                        }\n                    } else if (command !== MOVE) {\n                        throw new Error('Error while parsing SVG path. Unsupported command: ' + command);\n                    }\n                    previousCommand = command;\n                });\n                return multiPath;\n            }\n        });\n        PathParser.current = new PathParser();\n        var Path = Element$1.extend({\n            init: function (options) {\n                Element$1.fn.init.call(this, options);\n                this.segments = new GeometryElementsArray();\n                this.segments.addObserver(this);\n                if (!defined(this.options.stroke)) {\n                    this.stroke('#000');\n                    if (!defined(this.options.stroke.lineJoin)) {\n                        this.options.set('stroke.lineJoin', 'miter');\n                    }\n                }\n            },\n            moveTo: function (x, y) {\n                this.suspend();\n                this.segments.elements([]);\n                this.resume();\n                this.lineTo(x, y);\n                return this;\n            },\n            lineTo: function (x, y) {\n                var point = defined(y) ? new Point(x, y) : x;\n                var segment = new Segment(point);\n                this.segments.push(segment);\n                return this;\n            },\n            curveTo: function (controlOut, controlIn, point) {\n                if (this.segments.length > 0) {\n                    var lastSegment = last(this.segments);\n                    var segment = new Segment(point, controlIn);\n                    this.suspend();\n                    lastSegment.controlOut(controlOut);\n                    this.resume();\n                    this.segments.push(segment);\n                }\n                return this;\n            },\n            arc: function (startAngle, endAngle, radiusX, radiusY, anticlockwise) {\n                if (this.segments.length > 0) {\n                    var lastSegment = last(this.segments);\n                    var anchor = lastSegment.anchor();\n                    var start = rad(startAngle);\n                    var center = new Point(anchor.x - radiusX * Math.cos(start), anchor.y - radiusY * Math.sin(start));\n                    var arc = new Arc$2(center, {\n                        startAngle: startAngle,\n                        endAngle: endAngle,\n                        radiusX: radiusX,\n                        radiusY: radiusY,\n                        anticlockwise: anticlockwise\n                    });\n                    this._addArcSegments(arc);\n                }\n                return this;\n            },\n            arcTo: function (end, rx, ry, largeArc, swipe, rotation) {\n                if (this.segments.length > 0) {\n                    var lastSegment = last(this.segments);\n                    var anchor = lastSegment.anchor();\n                    var arc = Arc$2.fromPoints(anchor, end, rx, ry, largeArc, swipe, rotation);\n                    this._addArcSegments(arc);\n                }\n                return this;\n            },\n            _addArcSegments: function (arc) {\n                var this$1 = this;\n                this.suspend();\n                var curvePoints = arc.curvePoints();\n                for (var i = 1; i < curvePoints.length; i += 3) {\n                    this$1.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n                }\n                this.resume();\n                this.geometryChange();\n            },\n            close: function () {\n                this.options.closed = true;\n                this.geometryChange();\n                return this;\n            },\n            rawBBox: function () {\n                return this._bbox();\n            },\n            _containsPoint: function (point) {\n                var segments = this.segments;\n                var length = segments.length;\n                var intersectionsCount = 0;\n                var previous, current;\n                for (var idx = 1; idx < length; idx++) {\n                    previous = segments[idx - 1];\n                    current = segments[idx];\n                    intersectionsCount += previous._intersectionsTo(current, point);\n                }\n                if (this.options.closed || !segments[0].anchor().equals(segments[length - 1].anchor())) {\n                    intersectionsCount += lineIntersectionsCount(segments[0].anchor(), segments[length - 1].anchor(), point);\n                }\n                return intersectionsCount % 2 !== 0;\n            },\n            _isOnPath: function (point, width) {\n                var segments = this.segments;\n                var length = segments.length;\n                var pathWidth = width || this.options.stroke.width;\n                if (length > 1) {\n                    if (segments[0]._isOnPathTo(segments[1], point, pathWidth, 'start')) {\n                        return true;\n                    }\n                    for (var idx = 2; idx <= length - 2; idx++) {\n                        if (segments[idx - 1]._isOnPathTo(segments[idx], point, pathWidth)) {\n                            return true;\n                        }\n                    }\n                    if (segments[length - 2]._isOnPathTo(segments[length - 1], point, pathWidth, 'end')) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _bbox: function (matrix) {\n                var segments = this.segments;\n                var length = segments.length;\n                var boundingBox;\n                if (length === 1) {\n                    var anchor = segments[0].anchor().transformCopy(matrix);\n                    boundingBox = new Rect(anchor, Size.ZERO);\n                } else if (length > 0) {\n                    for (var i = 1; i < length; i++) {\n                        var segmentBox = segments[i - 1].bboxTo(segments[i], matrix);\n                        if (boundingBox) {\n                            boundingBox = Rect.union(boundingBox, segmentBox);\n                        } else {\n                            boundingBox = segmentBox;\n                        }\n                    }\n                }\n                return boundingBox;\n            }\n        });\n        Path.fromRect = function (rect, options) {\n            return new Path(options).moveTo(rect.topLeft()).lineTo(rect.topRight()).lineTo(rect.bottomRight()).lineTo(rect.bottomLeft()).close();\n        };\n        Path.fromPoints = function (points, options) {\n            if (points) {\n                var path = new Path(options);\n                for (var i = 0; i < points.length; i++) {\n                    var point = Point.create(points[i]);\n                    if (point) {\n                        if (i === 0) {\n                            path.moveTo(point);\n                        } else {\n                            path.lineTo(point);\n                        }\n                    }\n                }\n                return path;\n            }\n        };\n        Path.fromArc = function (arc, options) {\n            var path = new Path(options);\n            var startAngle = arc.startAngle;\n            var start = arc.pointAt(startAngle);\n            path.moveTo(start.x, start.y);\n            path.arc(startAngle, arc.endAngle, arc.radiusX, arc.radiusY, arc.anticlockwise);\n            return path;\n        };\n        Path.prototype.nodeType = 'Path';\n        Paintable.extend(Path.prototype);\n        Measurable.extend(Path.prototype);\n        Path.parse = function (str, options) {\n            return PathParser.current.parse(str, options);\n        };\n        var DEFAULT_STROKE$1 = '#000';\n        var Arc = Element$1.extend({\n            init: function (geometry, options) {\n                if (geometry === void 0) {\n                    geometry = new Arc$2();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.geometry(geometry);\n                if (!defined(this.options.stroke)) {\n                    this.stroke(DEFAULT_STROKE$1);\n                }\n            },\n            _bbox: function (matrix) {\n                return this._geometry.bbox(matrix);\n            },\n            rawBBox: function () {\n                return this.geometry().bbox();\n            },\n            toPath: function () {\n                var path = new Path();\n                var curvePoints = this.geometry().curvePoints();\n                if (curvePoints.length > 0) {\n                    path.moveTo(curvePoints[0].x, curvePoints[0].y);\n                    for (var i = 1; i < curvePoints.length; i += 3) {\n                        path.curveTo(curvePoints[i], curvePoints[i + 1], curvePoints[i + 2]);\n                    }\n                }\n                return path;\n            },\n            _containsPoint: function (point) {\n                return this.geometry().containsPoint(point);\n            },\n            _isOnPath: function (point) {\n                return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n            }\n        });\n        Arc.prototype.nodeType = 'Arc';\n        Paintable.extend(Arc.prototype);\n        Measurable.extend(Arc.prototype);\n        defineGeometryAccessors(Arc.prototype, ['geometry']);\n        var DEFAULT_FONT = '12px sans-serif';\n        var DEFAULT_FILL = '#000';\n        var Text = Element$1.extend({\n            init: function (content, position, options) {\n                if (position === void 0) {\n                    position = new Point();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.content(content);\n                this.position(position);\n                if (!this.options.font) {\n                    this.options.font = DEFAULT_FONT;\n                }\n                if (!defined(this.options.fill)) {\n                    this.fill(DEFAULT_FILL);\n                }\n            },\n            content: function (value) {\n                if (defined(value)) {\n                    this.options.set('content', value);\n                    return this;\n                }\n                return this.options.get('content');\n            },\n            measure: function () {\n                var metrics = kendoUtil.measureText(this.content(), { font: this.options.get('font') });\n                return metrics;\n            },\n            rect: function () {\n                var size = this.measure();\n                var pos = this.position().clone();\n                return new Rect(pos, [\n                    size.width,\n                    size.height\n                ]);\n            },\n            bbox: function (transformation) {\n                var combinedMatrix = toMatrix(this.currentTransform(transformation));\n                return this.rect().bbox(combinedMatrix);\n            },\n            rawBBox: function () {\n                return this.rect().bbox();\n            },\n            _containsPoint: function (point) {\n                return this.rect().containsPoint(point);\n            }\n        });\n        Text.prototype.nodeType = 'Text';\n        Paintable.extend(Text.prototype);\n        definePointAccessors(Text.prototype, ['position']);\n        var Image$1 = Element$1.extend({\n            init: function (src, rect, options) {\n                if (rect === void 0) {\n                    rect = new Rect();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.src(src);\n                this.rect(rect);\n            },\n            src: function (value) {\n                if (defined(value)) {\n                    this.options.set('src', value);\n                    return this;\n                }\n                return this.options.get('src');\n            },\n            bbox: function (transformation) {\n                var combinedMatrix = toMatrix(this.currentTransform(transformation));\n                return this._rect.bbox(combinedMatrix);\n            },\n            rawBBox: function () {\n                return this._rect.bbox();\n            },\n            _containsPoint: function (point) {\n                return this._rect.containsPoint(point);\n            },\n            _hasFill: function () {\n                return this.src();\n            }\n        });\n        Image$1.prototype.nodeType = 'Image';\n        defineGeometryAccessors(Image$1.prototype, ['rect']);\n        var Traversable = {\n            extend: function (proto, childrenField) {\n                proto.traverse = function (callback) {\n                    var children = this[childrenField];\n                    for (var i = 0; i < children.length; i++) {\n                        var child = children[i];\n                        if (child.traverse) {\n                            child.traverse(callback);\n                        } else {\n                            callback(child);\n                        }\n                    }\n                    return this;\n                };\n            }\n        };\n        var Group = Element$1.extend({\n            init: function (options) {\n                Element$1.fn.init.call(this, options);\n                this.children = [];\n            },\n            childrenChange: function (action, items, index) {\n                this.trigger('childrenChange', {\n                    action: action,\n                    items: items,\n                    index: index\n                });\n            },\n            append: function () {\n                append(this.children, arguments);\n                this._reparent(arguments, this);\n                this.childrenChange('add', arguments);\n                return this;\n            },\n            insert: function (index, element) {\n                this.children.splice(index, 0, element);\n                element.parent = this;\n                this.childrenChange('add', [element], index);\n                return this;\n            },\n            insertAt: function (element, index) {\n                return this.insert(index, element);\n            },\n            remove: function (element) {\n                var index = this.children.indexOf(element);\n                if (index >= 0) {\n                    this.children.splice(index, 1);\n                    element.parent = null;\n                    this.childrenChange('remove', [element], index);\n                }\n                return this;\n            },\n            removeAt: function (index) {\n                if (0 <= index && index < this.children.length) {\n                    var element = this.children[index];\n                    this.children.splice(index, 1);\n                    element.parent = null;\n                    this.childrenChange('remove', [element], index);\n                }\n                return this;\n            },\n            clear: function () {\n                var items = this.children;\n                this.children = [];\n                this._reparent(items, null);\n                this.childrenChange('remove', items, 0);\n                return this;\n            },\n            bbox: function (transformation) {\n                return elementsBoundingBox(this.children, true, this.currentTransform(transformation));\n            },\n            rawBBox: function () {\n                return elementsBoundingBox(this.children, false);\n            },\n            _clippedBBox: function (transformation) {\n                return elementsClippedBoundingBox(this.children, this.currentTransform(transformation));\n            },\n            currentTransform: function (transformation) {\n                return Element$1.prototype.currentTransform.call(this, transformation) || null;\n            },\n            containsPoint: function (point, parentTransform) {\n                if (this.visible()) {\n                    var children = this.children;\n                    var transform = this.currentTransform(parentTransform);\n                    for (var idx = 0; idx < children.length; idx++) {\n                        if (children[idx].containsPoint(point, transform)) {\n                            return true;\n                        }\n                    }\n                }\n                return false;\n            },\n            _reparent: function (elements, newParent) {\n                var this$1 = this;\n                for (var i = 0; i < elements.length; i++) {\n                    var child = elements[i];\n                    var parent = child.parent;\n                    if (parent && parent !== this$1 && parent.remove) {\n                        parent.remove(child);\n                    }\n                    child.parent = newParent;\n                }\n            }\n        });\n        Group.prototype.nodeType = 'Group';\n        Traversable.extend(Group.prototype, 'children');\n        function translateToPoint(point, bbox, element) {\n            var transofrm = element.transform() || transform();\n            var matrix = transofrm.matrix();\n            matrix.e += point.x - bbox.origin.x;\n            matrix.f += point.y - bbox.origin.y;\n            transofrm.matrix(matrix);\n            element.transform(transofrm);\n        }\n        function alignStart(size, rect, align, axis, sizeField) {\n            var start;\n            if (align === 'start') {\n                start = rect.origin[axis];\n            } else if (align === 'end') {\n                start = rect.origin[axis] + rect.size[sizeField] - size;\n            } else {\n                start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\n            }\n            return start;\n        }\n        function alignStartReverse(size, rect, align, axis, sizeField) {\n            var start;\n            if (align === 'start') {\n                start = rect.origin[axis] + rect.size[sizeField] - size;\n            } else if (align === 'end') {\n                start = rect.origin[axis];\n            } else {\n                start = rect.origin[axis] + (rect.size[sizeField] - size) / 2;\n            }\n            return start;\n        }\n        var DEFAULT_OPTIONS = {\n            alignContent: 'start',\n            justifyContent: 'start',\n            alignItems: 'start',\n            spacing: 0,\n            orientation: 'horizontal',\n            lineSpacing: 0,\n            wrap: true,\n            revers: false\n        };\n        var forEach = function (elements, callback) {\n            elements.forEach(callback);\n        };\n        var forEachReverse = function (elements, callback) {\n            var length = elements.length;\n            for (var idx = length - 1; idx >= 0; idx--) {\n                callback(elements[idx], idx);\n            }\n        };\n        var Layout = Group.extend({\n            init: function (rect, options) {\n                Group.fn.init.call(this, $.extend({}, DEFAULT_OPTIONS, options));\n                this._rect = rect;\n                this._fieldMap = {};\n            },\n            rect: function (value) {\n                if (value) {\n                    this._rect = value;\n                    return this;\n                }\n                return this._rect;\n            },\n            _initMap: function () {\n                var options = this.options;\n                var fieldMap = this._fieldMap;\n                if (options.orientation === 'horizontal') {\n                    fieldMap.sizeField = 'width';\n                    fieldMap.groupsSizeField = 'height';\n                    fieldMap.groupAxis = 'x';\n                    fieldMap.groupsAxis = 'y';\n                } else {\n                    fieldMap.sizeField = 'height';\n                    fieldMap.groupsSizeField = 'width';\n                    fieldMap.groupAxis = 'y';\n                    fieldMap.groupsAxis = 'x';\n                }\n                if (options.reverse) {\n                    this.forEach = forEachReverse;\n                    this.justifyAlign = alignStartReverse;\n                } else {\n                    this.forEach = forEach;\n                    this.justifyAlign = alignStart;\n                }\n            },\n            reflow: function () {\n                var this$1 = this;\n                if (!this._rect || this.children.length === 0) {\n                    return;\n                }\n                this._initMap();\n                if (this.options.transform) {\n                    this.transform(null);\n                }\n                var options = this.options;\n                var rect = this._rect;\n                var ref = this._initGroups();\n                var groups = ref.groups;\n                var groupsSize = ref.groupsSize;\n                var ref$1 = this._fieldMap;\n                var sizeField = ref$1.sizeField;\n                var groupsSizeField = ref$1.groupsSizeField;\n                var groupAxis = ref$1.groupAxis;\n                var groupsAxis = ref$1.groupsAxis;\n                var groupOrigin = new Point();\n                var elementOrigin = new Point();\n                var size = new Size();\n                var groupStart = alignStart(groupsSize, rect, options.alignContent, groupsAxis, groupsSizeField);\n                var elementStart, group, groupBox;\n                var arrangeElements = function (bbox, idx) {\n                    var element = group.elements[idx];\n                    elementOrigin[groupAxis] = elementStart;\n                    elementOrigin[groupsAxis] = alignStart(bbox.size[groupsSizeField], groupBox, options.alignItems, groupsAxis, groupsSizeField);\n                    translateToPoint(elementOrigin, bbox, element);\n                    elementStart += bbox.size[sizeField] + options.spacing;\n                };\n                for (var groupIdx = 0; groupIdx < groups.length; groupIdx++) {\n                    group = groups[groupIdx];\n                    groupOrigin[groupAxis] = elementStart = this$1.justifyAlign(group.size, rect, options.justifyContent, groupAxis, sizeField);\n                    groupOrigin[groupsAxis] = groupStart;\n                    size[sizeField] = group.size;\n                    size[groupsSizeField] = group.lineSize;\n                    groupBox = new Rect(groupOrigin, size);\n                    this$1.forEach(group.bboxes, arrangeElements);\n                    groupStart += group.lineSize + options.lineSpacing;\n                }\n                if (!options.wrap && group.size > rect.size[sizeField]) {\n                    var scale = rect.size[sizeField] / groupBox.size[sizeField];\n                    var scaledStart = groupBox.topLeft().scale(scale, scale);\n                    var scaledSize = groupBox.size[groupsSizeField] * scale;\n                    var newStart = alignStart(scaledSize, rect, options.alignContent, groupsAxis, groupsSizeField);\n                    var transform$$1 = transform();\n                    if (groupAxis === 'x') {\n                        transform$$1.translate(rect.origin.x - scaledStart.x, newStart - scaledStart.y);\n                    } else {\n                        transform$$1.translate(newStart - scaledStart.x, rect.origin.y - scaledStart.y);\n                    }\n                    transform$$1.scale(scale, scale);\n                    this.transform(transform$$1);\n                }\n            },\n            _initGroups: function () {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var children = ref.children;\n                var lineSpacing = options.lineSpacing;\n                var wrap = options.wrap;\n                var spacing = options.spacing;\n                var sizeField = this._fieldMap.sizeField;\n                var group = this._newGroup();\n                var groups = [];\n                var addGroup = function () {\n                    groups.push(group);\n                    groupsSize += group.lineSize + lineSpacing;\n                };\n                var groupsSize = -lineSpacing;\n                for (var idx = 0; idx < children.length; idx++) {\n                    var element = children[idx];\n                    var bbox = children[idx].clippedBBox();\n                    if (element.visible() && bbox) {\n                        if (wrap && group.size + bbox.size[sizeField] + spacing > this$1._rect.size[sizeField]) {\n                            if (group.bboxes.length === 0) {\n                                this$1._addToGroup(group, bbox, element);\n                                addGroup();\n                                group = this$1._newGroup();\n                            } else {\n                                addGroup();\n                                group = this$1._newGroup();\n                                this$1._addToGroup(group, bbox, element);\n                            }\n                        } else {\n                            this$1._addToGroup(group, bbox, element);\n                        }\n                    }\n                }\n                if (group.bboxes.length) {\n                    addGroup();\n                }\n                return {\n                    groups: groups,\n                    groupsSize: groupsSize\n                };\n            },\n            _addToGroup: function (group, bbox, element) {\n                group.size += bbox.size[this._fieldMap.sizeField] + this.options.spacing;\n                group.lineSize = Math.max(bbox.size[this._fieldMap.groupsSizeField], group.lineSize);\n                group.bboxes.push(bbox);\n                group.elements.push(element);\n            },\n            _newGroup: function () {\n                return {\n                    lineSize: 0,\n                    size: -this.options.spacing,\n                    bboxes: [],\n                    elements: []\n                };\n            }\n        });\n        var Rect$2 = Element$1.extend({\n            init: function (geometry, options) {\n                if (geometry === void 0) {\n                    geometry = new Rect();\n                }\n                if (options === void 0) {\n                    options = {};\n                }\n                Element$1.fn.init.call(this, options);\n                this.geometry(geometry);\n                if (!defined(this.options.stroke)) {\n                    this.stroke('#000');\n                }\n            },\n            _bbox: function (matrix) {\n                return this._geometry.bbox(matrix);\n            },\n            rawBBox: function () {\n                return this._geometry.bbox();\n            },\n            _containsPoint: function (point) {\n                return this._geometry.containsPoint(point);\n            },\n            _isOnPath: function (point) {\n                return this.geometry()._isOnPath(point, this.options.stroke.width / 2);\n            }\n        });\n        Rect$2.prototype.nodeType = 'Rect';\n        Paintable.extend(Rect$2.prototype);\n        Measurable.extend(Rect$2.prototype);\n        defineGeometryAccessors(Rect$2.prototype, ['geometry']);\n        function alignElements(elements, rect, alignment, axis, sizeField) {\n            for (var idx = 0; idx < elements.length; idx++) {\n                var bbox = elements[idx].clippedBBox();\n                if (bbox) {\n                    var point = bbox.origin.clone();\n                    point[axis] = alignStart(bbox.size[sizeField], rect, alignment || 'start', axis, sizeField);\n                    translateToPoint(point, bbox, elements[idx]);\n                }\n            }\n        }\n        function align(elements, rect, alignment) {\n            alignElements(elements, rect, alignment, 'x', 'width');\n        }\n        function vAlign(elements, rect, alignment) {\n            alignElements(elements, rect, alignment, 'y', 'height');\n        }\n        function stackElements(elements, stackAxis, otherAxis, sizeField) {\n            if (elements.length > 1) {\n                var origin = new Point();\n                var previousBBox = elements[0].bbox;\n                for (var idx = 1; idx < elements.length; idx++) {\n                    var element = elements[idx].element;\n                    var bbox = elements[idx].bbox;\n                    origin[stackAxis] = previousBBox.origin[stackAxis] + previousBBox.size[sizeField];\n                    origin[otherAxis] = bbox.origin[otherAxis];\n                    translateToPoint(origin, bbox, element);\n                    bbox.origin[stackAxis] = origin[stackAxis];\n                    previousBBox = bbox;\n                }\n            }\n        }\n        function createStackElements(elements) {\n            var stackElements = [];\n            for (var idx = 0; idx < elements.length; idx++) {\n                var element = elements[idx];\n                var bbox = element.clippedBBox();\n                if (bbox) {\n                    stackElements.push({\n                        element: element,\n                        bbox: bbox\n                    });\n                }\n            }\n            return stackElements;\n        }\n        function stack(elements) {\n            stackElements(createStackElements(elements), 'x', 'y', 'width');\n        }\n        function vStack(elements) {\n            stackElements(createStackElements(elements), 'y', 'x', 'height');\n        }\n        function getStacks(elements, rect, sizeField) {\n            var maxSize = rect.size[sizeField];\n            var stacks = [];\n            var stack = [];\n            var stackSize = 0;\n            var element, bbox;\n            var addElementToStack = function () {\n                stack.push({\n                    element: element,\n                    bbox: bbox\n                });\n            };\n            for (var idx = 0; idx < elements.length; idx++) {\n                element = elements[idx];\n                bbox = element.clippedBBox();\n                if (bbox) {\n                    var size = bbox.size[sizeField];\n                    if (stackSize + size > maxSize) {\n                        if (stack.length) {\n                            stacks.push(stack);\n                            stack = [];\n                            addElementToStack();\n                            stackSize = size;\n                        } else {\n                            addElementToStack();\n                            stacks.push(stack);\n                            stack = [];\n                            stackSize = 0;\n                        }\n                    } else {\n                        addElementToStack();\n                        stackSize += size;\n                    }\n                }\n            }\n            if (stack.length) {\n                stacks.push(stack);\n            }\n            return stacks;\n        }\n        function wrapElements(elements, rect, axis, otherAxis, sizeField) {\n            var stacks = getStacks(elements, rect, sizeField);\n            var origin = rect.origin.clone();\n            var result = [];\n            for (var idx = 0; idx < stacks.length; idx++) {\n                var stack = stacks[idx];\n                var startElement = stack[0];\n                origin[otherAxis] = startElement.bbox.origin[otherAxis];\n                translateToPoint(origin, startElement.bbox, startElement.element);\n                startElement.bbox.origin[axis] = origin[axis];\n                stackElements(stack, axis, otherAxis, sizeField);\n                result.push([]);\n                for (var elementIdx = 0; elementIdx < stack.length; elementIdx++) {\n                    result[idx].push(stack[elementIdx].element);\n                }\n            }\n            return result;\n        }\n        function wrap(elements, rect) {\n            return wrapElements(elements, rect, 'x', 'y', 'width');\n        }\n        function vWrap(elements, rect) {\n            return wrapElements(elements, rect, 'y', 'x', 'height');\n        }\n        function fit(element, rect) {\n            var bbox = element.clippedBBox();\n            if (bbox) {\n                var elementSize = bbox.size;\n                var rectSize = rect.size;\n                if (rectSize.width < elementSize.width || rectSize.height < elementSize.height) {\n                    var scale = Math.min(rectSize.width / elementSize.width, rectSize.height / elementSize.height);\n                    var transform$$1 = element.transform() || transform();\n                    transform$$1.scale(scale, scale);\n                    element.transform(transform$$1);\n                }\n            }\n        }\n        var StopsArray = ElementsArray.extend({\n            _change: function () {\n                this.optionsChange({ field: 'stops' });\n            }\n        });\n        function optionsAccessor(name) {\n            return function (value) {\n                if (defined(value)) {\n                    this.options.set(name, value);\n                    return this;\n                }\n                return this.options.get(name);\n            };\n        }\n        function defineOptionsAccessors(fn, names) {\n            for (var i = 0; i < names.length; i++) {\n                fn[names[i]] = optionsAccessor(names[i]);\n            }\n        }\n        var GradientStop = Class.extend({\n            init: function (offset, color, opacity) {\n                this.options = new OptionsStore({\n                    offset: offset,\n                    color: color,\n                    opacity: defined(opacity) ? opacity : 1\n                });\n                this.options.addObserver(this);\n            }\n        });\n        GradientStop.create = function (arg) {\n            if (defined(arg)) {\n                var stop;\n                if (arg instanceof GradientStop) {\n                    stop = arg;\n                } else if (arg.length > 1) {\n                    stop = new GradientStop(arg[0], arg[1], arg[2]);\n                } else {\n                    stop = new GradientStop(arg.offset, arg.color, arg.opacity);\n                }\n                return stop;\n            }\n        };\n        defineOptionsAccessors(GradientStop.prototype, [\n            'offset',\n            'color',\n            'opacity'\n        ]);\n        ObserversMixin.extend(GradientStop.prototype);\n        var Gradient = Class.extend({\n            init: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                this.stops = new StopsArray(this._createStops(options.stops));\n                this.stops.addObserver(this);\n                this._userSpace = options.userSpace;\n                this.id = definitionId();\n            },\n            userSpace: function (value) {\n                if (defined(value)) {\n                    this._userSpace = value;\n                    this.optionsChange();\n                    return this;\n                }\n                return this._userSpace;\n            },\n            _createStops: function (stops) {\n                if (stops === void 0) {\n                    stops = [];\n                }\n                var result = [];\n                for (var idx = 0; idx < stops.length; idx++) {\n                    result.push(GradientStop.create(stops[idx]));\n                }\n                return result;\n            },\n            addStop: function (offset, color, opacity) {\n                this.stops.push(new GradientStop(offset, color, opacity));\n            },\n            removeStop: function (stop) {\n                var index = this.stops.indexOf(stop);\n                if (index >= 0) {\n                    this.stops.splice(index, 1);\n                }\n            }\n        });\n        Gradient.prototype.nodeType = 'Gradient';\n        ObserversMixin.extend(Gradient.prototype);\n        $.extend(Gradient.prototype, {\n            optionsChange: function (e) {\n                this.trigger('optionsChange', {\n                    field: 'gradient' + (e ? '.' + e.field : ''),\n                    value: this\n                });\n            },\n            geometryChange: function () {\n                this.optionsChange();\n            }\n        });\n        var LinearGradient = Gradient.extend({\n            init: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                Gradient.fn.init.call(this, options);\n                this.start(options.start || new Point());\n                this.end(options.end || new Point(1, 0));\n            }\n        });\n        definePointAccessors(LinearGradient.prototype, [\n            'start',\n            'end'\n        ]);\n        var RadialGradient = Gradient.extend({\n            init: function (options) {\n                if (options === void 0) {\n                    options = {};\n                }\n                Gradient.fn.init.call(this, options);\n                this.center(options.center || new Point());\n                this._radius = defined(options.radius) ? options.radius : 1;\n                this._fallbackFill = options.fallbackFill;\n            },\n            radius: function (value) {\n                if (defined(value)) {\n                    this._radius = value;\n                    this.geometryChange();\n                    return this;\n                }\n                return this._radius;\n            },\n            fallbackFill: function (value) {\n                if (defined(value)) {\n                    this._fallbackFill = value;\n                    this.optionsChange();\n                    return this;\n                }\n                return this._fallbackFill;\n            }\n        });\n        definePointAccessors(RadialGradient.prototype, ['center']);\n        function swing(position) {\n            return 0.5 - Math.cos(position * Math.PI) / 2;\n        }\n        function linear(position) {\n            return position;\n        }\n        function easeOutElastic(position, time, start, diff) {\n            var s = 1.70158, p = 0, a = diff;\n            if (position === 0) {\n                return start;\n            }\n            if (position === 1) {\n                return start + diff;\n            }\n            if (!p) {\n                p = 0.5;\n            }\n            if (a < Math.abs(diff)) {\n                a = diff;\n                s = p / 4;\n            } else {\n                s = p / (2 * Math.PI) * Math.asin(diff / a);\n            }\n            return a * Math.pow(2, -10 * position) * Math.sin((Number(position) - s) * (1.1 * Math.PI) / p) + diff + start;\n        }\n        var easingFunctions = {\n            swing: swing,\n            linear: linear,\n            easeOutElastic: easeOutElastic\n        };\n        var AnimationFactory = Class.extend({\n            init: function () {\n                this._items = [];\n            },\n            register: function (name, type) {\n                this._items.push({\n                    name: name,\n                    type: type\n                });\n            },\n            create: function (element, options) {\n                var items = this._items;\n                var match;\n                if (options && options.type) {\n                    var type = options.type.toLowerCase();\n                    for (var i = 0; i < items.length; i++) {\n                        if (items[i].name.toLowerCase() === type) {\n                            match = items[i];\n                            break;\n                        }\n                    }\n                }\n                if (match) {\n                    return new match.type(element, options);\n                }\n            }\n        });\n        AnimationFactory.current = new AnimationFactory();\n        var now = Date.now || function () {\n            return new Date().getTime();\n        };\n        var Animation = Class.extend({\n            init: function (element, options) {\n                this.options = $.extend({}, this.options, options);\n                this.element = element;\n            },\n            setup: function () {\n            },\n            step: function () {\n            },\n            play: function () {\n                var this$1 = this;\n                var options = this.options;\n                var duration = options.duration;\n                var delay = options.delay;\n                if (delay === void 0) {\n                    delay = 0;\n                }\n                var easing = easingFunctions[options.easing];\n                var start = now() + delay;\n                var finish = start + duration;\n                if (duration === 0) {\n                    this.step(1);\n                    this.abort();\n                } else {\n                    setTimeout(function () {\n                        var loop = function () {\n                            if (this$1._stopped) {\n                                return;\n                            }\n                            var wallTime = now();\n                            var time = limitValue(wallTime - start, 0, duration);\n                            var position = time / duration;\n                            var easingPosition = easing(position, time, 0, 1, duration);\n                            this$1.step(easingPosition);\n                            if (wallTime < finish) {\n                                kendo.animationFrame(loop);\n                            } else {\n                                this$1.abort();\n                            }\n                        };\n                        loop();\n                    }, delay);\n                }\n            },\n            abort: function () {\n                this._stopped = true;\n            },\n            destroy: function () {\n                this.abort();\n            }\n        });\n        Animation.prototype.options = {\n            duration: 500,\n            easing: 'swing'\n        };\n        Animation.create = function (type, element, options) {\n            return AnimationFactory.current.create(type, element, options);\n        };\n        var SurfaceFactory = Class.extend({\n            init: function () {\n                this._items = [];\n            },\n            register: function (name, type, order) {\n                var items = this._items;\n                var first = items[0];\n                var entry = {\n                    name: name,\n                    type: type,\n                    order: order\n                };\n                if (!first || order < first.order) {\n                    items.unshift(entry);\n                } else {\n                    items.push(entry);\n                }\n            },\n            create: function (element, options) {\n                var items = this._items;\n                var match = items[0];\n                if (options && options.type) {\n                    var preferred = options.type.toLowerCase();\n                    for (var i = 0; i < items.length; i++) {\n                        if (items[i].name === preferred) {\n                            match = items[i];\n                            break;\n                        }\n                    }\n                }\n                if (match) {\n                    return new match.type(element, options);\n                }\n                kendo.logToConsole('Warning: Unable to create Kendo UI Drawing Surface. Possible causes:\\n' + '- The browser does not support SVG and Canvas. User agent: ' + navigator.userAgent);\n            }\n        });\n        SurfaceFactory.current = new SurfaceFactory();\n        var events = [\n            'click',\n            'mouseenter',\n            'mouseleave',\n            'mousemove',\n            'resize'\n        ];\n        var Surface = kendo.Observable.extend({\n            init: function (element, options) {\n                kendo.Observable.fn.init.call(this);\n                this.options = $.extend({}, options);\n                this.element = element;\n                this.element._kendoExportVisual = this.exportVisual.bind(this);\n                this._click = this._handler('click');\n                this._mouseenter = this._handler('mouseenter');\n                this._mouseleave = this._handler('mouseleave');\n                this._mousemove = this._handler('mousemove');\n                this._visual = new Group();\n                elementSize(element, this.options);\n                this.bind(events, this.options);\n                this._enableTracking();\n            },\n            draw: function (element) {\n                this._visual.children.push(element);\n            },\n            clear: function () {\n                this._visual.children = [];\n            },\n            destroy: function () {\n                this._visual = null;\n                this.element._kendoExportVisual = null;\n                this.unbind();\n            },\n            eventTarget: function (e) {\n                var this$1 = this;\n                var domNode = eventElement(e);\n                var node;\n                while (!node && domNode) {\n                    node = domNode._kendoNode;\n                    if (domNode === this$1.element) {\n                        break;\n                    }\n                    domNode = domNode.parentElement;\n                }\n                if (node) {\n                    return node.srcElement;\n                }\n            },\n            exportVisual: function () {\n                return this._visual;\n            },\n            getSize: function () {\n                return elementSize(this.element);\n            },\n            currentSize: function (size) {\n                if (size) {\n                    this._size = size;\n                } else {\n                    return this._size;\n                }\n            },\n            setSize: function (size) {\n                elementSize(this.element, size);\n                this.currentSize(size);\n                this._resize();\n            },\n            resize: function (force) {\n                var size = this.getSize();\n                var currentSize = this.currentSize();\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this.currentSize(size);\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            size: function (value) {\n                if (!value) {\n                    return this.getSize();\n                }\n                this.setSize(value);\n            },\n            suspendTracking: function () {\n                this._suspendedTracking = true;\n            },\n            resumeTracking: function () {\n                this._suspendedTracking = false;\n            },\n            _enableTracking: function () {\n            },\n            _resize: function () {\n            },\n            _handler: function (eventName) {\n                var this$1 = this;\n                return function (e) {\n                    var node = this$1.eventTarget(e);\n                    if (node && !this$1._suspendedTracking) {\n                        this$1.trigger(eventName, {\n                            element: node,\n                            originalEvent: e,\n                            type: eventName\n                        });\n                    }\n                };\n            },\n            _elementOffset: function () {\n                var element = this.element;\n                var ref = elementStyles(element, [\n                    'paddingLeft',\n                    'paddingTop'\n                ]);\n                var paddingLeft = ref.paddingLeft;\n                var paddingTop = ref.paddingTop;\n                var ref$1 = elementOffset(element);\n                var left = ref$1.left;\n                var top = ref$1.top;\n                return {\n                    left: left + parseInt(paddingLeft, 10),\n                    top: top + parseInt(paddingTop, 10)\n                };\n            },\n            _surfacePoint: function (e) {\n                var offset = this._elementOffset();\n                var coord = eventCoordinates(e);\n                var x = coord.x - offset.left;\n                var y = coord.y - offset.top;\n                return new Point(x, y);\n            }\n        });\n        Surface.create = function (element, options) {\n            return SurfaceFactory.current.create(element, options);\n        };\n        Surface.support = {};\n        var BaseNode = Class.extend({\n            init: function (srcElement) {\n                this.childNodes = [];\n                this.parent = null;\n                if (srcElement) {\n                    this.srcElement = srcElement;\n                    this.observe();\n                }\n            },\n            destroy: function () {\n                var this$1 = this;\n                if (this.srcElement) {\n                    this.srcElement.removeObserver(this);\n                }\n                var children = this.childNodes;\n                for (var i = 0; i < children.length; i++) {\n                    this$1.childNodes[i].destroy();\n                }\n                this.parent = null;\n            },\n            load: function () {\n            },\n            observe: function () {\n                if (this.srcElement) {\n                    this.srcElement.addObserver(this);\n                }\n            },\n            append: function (node) {\n                this.childNodes.push(node);\n                node.parent = this;\n            },\n            insertAt: function (node, pos) {\n                this.childNodes.splice(pos, 0, node);\n                node.parent = this;\n            },\n            remove: function (index, count) {\n                var this$1 = this;\n                var end = index + count;\n                for (var i = index; i < end; i++) {\n                    this$1.childNodes[i].removeSelf();\n                }\n                this.childNodes.splice(index, count);\n            },\n            removeSelf: function () {\n                this.clear();\n                this.destroy();\n            },\n            clear: function () {\n                this.remove(0, this.childNodes.length);\n            },\n            invalidate: function () {\n                if (this.parent) {\n                    this.parent.invalidate();\n                }\n            },\n            geometryChange: function () {\n                this.invalidate();\n            },\n            optionsChange: function () {\n                this.invalidate();\n            },\n            childrenChange: function (e) {\n                if (e.action === 'add') {\n                    this.load(e.items, e.index);\n                } else if (e.action === 'remove') {\n                    this.remove(e.index, e.items.length);\n                }\n                this.invalidate();\n            }\n        });\n        function renderAttr(name, value) {\n            return defined(value) && value !== null ? ' ' + name + '=\"' + value + '\" ' : '';\n        }\n        function renderAllAttr(attrs) {\n            var output = '';\n            for (var i = 0; i < attrs.length; i++) {\n                output += renderAttr(attrs[i][0], attrs[i][1]);\n            }\n            return output;\n        }\n        function renderStyle(attrs) {\n            var output = '';\n            for (var i = 0; i < attrs.length; i++) {\n                var value = attrs[i][1];\n                if (defined(value)) {\n                    output += attrs[i][0] + ':' + value + ';';\n                }\n            }\n            if (output !== '') {\n                return output;\n            }\n        }\n        var NODE_MAP = {};\n        var SVG_NS = 'http://www.w3.org/2000/svg';\n        var NONE = 'none';\n        var renderSVG = function (container, svg) {\n            container.innerHTML = svg;\n        };\n        if (typeof document !== 'undefined') {\n            var testFragment = '<svg xmlns=\\'' + SVG_NS + '\\'></svg>';\n            var testContainer = document.createElement('div');\n            var hasParser = typeof DOMParser !== 'undefined';\n            testContainer.innerHTML = testFragment;\n            if (hasParser && testContainer.firstChild.namespaceURI !== SVG_NS) {\n                renderSVG = function (container, svg) {\n                    var parser = new DOMParser();\n                    var chartDoc = parser.parseFromString(svg, 'text/xml');\n                    var importedDoc = document.adoptNode(chartDoc.documentElement);\n                    container.innerHTML = '';\n                    container.appendChild(importedDoc);\n                };\n            }\n        }\n        var renderSVG$1 = renderSVG;\n        var TRANSFORM = 'transform';\n        var DefinitionMap = {\n            clip: 'clip-path',\n            fill: 'fill'\n        };\n        function isDefinition(type, value) {\n            return type === 'clip' || type === 'fill' && (!value || value.nodeType === 'Gradient');\n        }\n        function baseUrl() {\n            var base = document.getElementsByTagName('base')[0];\n            var href = document.location.href;\n            var url = '';\n            if (base && !supportBrowser.msie) {\n                var hashIndex = href.indexOf('#');\n                if (hashIndex !== -1) {\n                    href = href.substring(0, hashIndex);\n                }\n                url = href;\n            }\n            return url;\n        }\n        var Node = BaseNode.extend({\n            init: function (srcElement, options) {\n                BaseNode.fn.init.call(this, srcElement);\n                this.definitions = {};\n                this.options = options;\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element._kendoNode = null;\n                    this.element = null;\n                }\n                this.clearDefinitions();\n                BaseNode.fn.destroy.call(this);\n            },\n            load: function (elements, pos) {\n                var this$1 = this;\n                for (var i = 0; i < elements.length; i++) {\n                    var srcElement = elements[i];\n                    var children = srcElement.children;\n                    var childNode = new NODE_MAP[srcElement.nodeType](srcElement, this$1.options);\n                    if (defined(pos)) {\n                        this$1.insertAt(childNode, pos);\n                    } else {\n                        this$1.append(childNode);\n                    }\n                    childNode.createDefinitions();\n                    if (children && children.length > 0) {\n                        childNode.load(children);\n                    }\n                    var element = this$1.element;\n                    if (element) {\n                        childNode.attachTo(element, pos);\n                    }\n                }\n            },\n            root: function () {\n                var root = this;\n                while (root.parent) {\n                    root = root.parent;\n                }\n                return root;\n            },\n            attachTo: function (domElement, pos) {\n                var container = document.createElement('div');\n                renderSVG$1(container, '<svg xmlns=\\'' + SVG_NS + '\\' version=\\'1.1\\'>' + this.render() + '</svg>');\n                var element = container.firstChild.firstChild;\n                if (element) {\n                    if (defined(pos)) {\n                        domElement.insertBefore(element, domElement.childNodes[pos] || null);\n                    } else {\n                        domElement.appendChild(element);\n                    }\n                    this.setElement(element);\n                }\n            },\n            setElement: function (element) {\n                if (this.element) {\n                    this.element._kendoNode = null;\n                }\n                this.element = element;\n                this.element._kendoNode = this;\n                var nodes = this.childNodes;\n                for (var i = 0; i < nodes.length; i++) {\n                    var childElement = element.childNodes[i];\n                    nodes[i].setElement(childElement);\n                }\n            },\n            clear: function () {\n                this.clearDefinitions();\n                if (this.element) {\n                    this.element.innerHTML = '';\n                }\n                var children = this.childNodes;\n                for (var i = 0; i < children.length; i++) {\n                    children[i].destroy();\n                }\n                this.childNodes = [];\n            },\n            removeSelf: function () {\n                if (this.element) {\n                    var parentNode = this.element.parentNode;\n                    if (parentNode) {\n                        parentNode.removeChild(this.element);\n                    }\n                    this.element = null;\n                }\n                BaseNode.fn.removeSelf.call(this);\n            },\n            template: function () {\n                return this.renderChildren();\n            },\n            render: function () {\n                return this.template();\n            },\n            renderChildren: function () {\n                var nodes = this.childNodes;\n                var output = '';\n                for (var i = 0; i < nodes.length; i++) {\n                    output += nodes[i].render();\n                }\n                return output;\n            },\n            optionsChange: function (e) {\n                var field = e.field;\n                var value = e.value;\n                if (field === 'visible') {\n                    this.css('display', value ? '' : NONE);\n                } else if (DefinitionMap[field] && isDefinition(field, value)) {\n                    this.updateDefinition(field, value);\n                } else if (field === 'opacity') {\n                    this.attr('opacity', value);\n                } else if (field === 'cursor') {\n                    this.css('cursor', value);\n                } else if (field === 'id') {\n                    if (value) {\n                        this.attr('id', value);\n                    } else {\n                        this.removeAttr('id');\n                    }\n                }\n                BaseNode.fn.optionsChange.call(this, e);\n            },\n            attr: function (name, value) {\n                if (this.element) {\n                    this.element.setAttribute(name, value);\n                }\n            },\n            allAttr: function (attrs) {\n                var this$1 = this;\n                for (var i = 0; i < attrs.length; i++) {\n                    this$1.attr(attrs[i][0], attrs[i][1]);\n                }\n            },\n            css: function (name, value) {\n                if (this.element) {\n                    this.element.style[name] = value;\n                }\n            },\n            allCss: function (styles) {\n                var this$1 = this;\n                for (var i = 0; i < styles.length; i++) {\n                    this$1.css(styles[i][0], styles[i][1]);\n                }\n            },\n            removeAttr: function (name) {\n                if (this.element) {\n                    this.element.removeAttribute(name);\n                }\n            },\n            mapTransform: function (transform) {\n                var attrs = [];\n                if (transform) {\n                    attrs.push([\n                        TRANSFORM,\n                        'matrix(' + transform.matrix().toString(6) + ')'\n                    ]);\n                }\n                return attrs;\n            },\n            renderTransform: function () {\n                return renderAllAttr(this.mapTransform(this.srcElement.transform()));\n            },\n            transformChange: function (value) {\n                if (value) {\n                    this.allAttr(this.mapTransform(value));\n                } else {\n                    this.removeAttr(TRANSFORM);\n                }\n            },\n            mapStyle: function () {\n                var options = this.srcElement.options;\n                var style = [[\n                        'cursor',\n                        options.cursor\n                    ]];\n                if (options.visible === false) {\n                    style.push([\n                        'display',\n                        NONE\n                    ]);\n                }\n                return style;\n            },\n            renderStyle: function () {\n                return renderAttr('style', renderStyle(this.mapStyle(true)));\n            },\n            renderOpacity: function () {\n                return renderAttr('opacity', this.srcElement.options.opacity);\n            },\n            renderId: function () {\n                return renderAttr('id', this.srcElement.options.id);\n            },\n            createDefinitions: function () {\n                var srcElement = this.srcElement;\n                var definitions = this.definitions;\n                if (srcElement) {\n                    var options = srcElement.options;\n                    var hasDefinitions;\n                    for (var field in DefinitionMap) {\n                        var definition = options.get(field);\n                        if (definition && isDefinition(field, definition)) {\n                            definitions[field] = definition;\n                            hasDefinitions = true;\n                        }\n                    }\n                    if (hasDefinitions) {\n                        this.definitionChange({\n                            action: 'add',\n                            definitions: definitions\n                        });\n                    }\n                }\n            },\n            definitionChange: function (e) {\n                if (this.parent) {\n                    this.parent.definitionChange(e);\n                }\n            },\n            updateDefinition: function (type, value) {\n                var definitions = this.definitions;\n                var current = definitions[type];\n                var attr = DefinitionMap[type];\n                var definition = {};\n                if (current) {\n                    definition[type] = current;\n                    this.definitionChange({\n                        action: 'remove',\n                        definitions: definition\n                    });\n                    delete definitions[type];\n                }\n                if (!value) {\n                    if (current) {\n                        this.removeAttr(attr);\n                    }\n                } else {\n                    definition[type] = value;\n                    this.definitionChange({\n                        action: 'add',\n                        definitions: definition\n                    });\n                    definitions[type] = value;\n                    this.attr(attr, this.refUrl(value.id));\n                }\n            },\n            clearDefinitions: function () {\n                var definitions = this.definitions;\n                this.definitionChange({\n                    action: 'remove',\n                    definitions: definitions\n                });\n                this.definitions = {};\n            },\n            renderDefinitions: function () {\n                return renderAllAttr(this.mapDefinitions());\n            },\n            mapDefinitions: function () {\n                var this$1 = this;\n                var definitions = this.definitions;\n                var attrs = [];\n                for (var field in definitions) {\n                    attrs.push([\n                        DefinitionMap[field],\n                        this$1.refUrl(definitions[field].id)\n                    ]);\n                }\n                return attrs;\n            },\n            refUrl: function (id) {\n                var skipBaseHref = (this.options || {}).skipBaseHref;\n                var baseHref = this.baseUrl().replace(/'/g, '\\\\\\'');\n                var base = skipBaseHref ? '' : baseHref;\n                return 'url(' + base + '#' + id + ')';\n            },\n            baseUrl: function () {\n                return baseUrl();\n            }\n        });\n        var GradientStopNode = Node.extend({\n            template: function () {\n                return '<stop ' + this.renderOffset() + ' ' + this.renderStyle() + ' />';\n            },\n            renderOffset: function () {\n                return renderAttr('offset', this.srcElement.offset());\n            },\n            mapStyle: function () {\n                var srcElement = this.srcElement;\n                return [\n                    [\n                        'stop-color',\n                        srcElement.color()\n                    ],\n                    [\n                        'stop-opacity',\n                        srcElement.opacity()\n                    ]\n                ];\n            },\n            optionsChange: function (e) {\n                if (e.field === 'offset') {\n                    this.attr(e.field, e.value);\n                } else if (e.field === 'color' || e.field === 'opacity') {\n                    this.css('stop-' + e.field, e.value);\n                }\n            }\n        });\n        var GradientNode = Node.extend({\n            init: function (srcElement) {\n                Node.fn.init.call(this, srcElement);\n                this.id = srcElement.id;\n                this.loadStops();\n            },\n            loadStops: function () {\n                var this$1 = this;\n                var stops = this.srcElement.stops;\n                var element = this.element;\n                for (var idx = 0; idx < stops.length; idx++) {\n                    var stopNode = new GradientStopNode(stops[idx]);\n                    this$1.append(stopNode);\n                    if (element) {\n                        stopNode.attachTo(element);\n                    }\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'gradient.stops') {\n                    BaseNode.prototype.clear.call(this);\n                    this.loadStops();\n                } else if (e.field === 'gradient') {\n                    this.allAttr(this.mapCoordinates());\n                }\n            },\n            renderCoordinates: function () {\n                return renderAllAttr(this.mapCoordinates());\n            },\n            mapSpace: function () {\n                return [\n                    'gradientUnits',\n                    this.srcElement.userSpace() ? 'userSpaceOnUse' : 'objectBoundingBox'\n                ];\n            }\n        });\n        var LinearGradientNode = GradientNode.extend({\n            template: function () {\n                return '<linearGradient id=\\'' + this.id + '\\' ' + this.renderCoordinates() + '>' + this.renderChildren() + '</linearGradient>';\n            },\n            mapCoordinates: function () {\n                var srcElement = this.srcElement;\n                var start = srcElement.start();\n                var end = srcElement.end();\n                var attrs = [\n                    [\n                        'x1',\n                        start.x\n                    ],\n                    [\n                        'y1',\n                        start.y\n                    ],\n                    [\n                        'x2',\n                        end.x\n                    ],\n                    [\n                        'y2',\n                        end.y\n                    ],\n                    this.mapSpace()\n                ];\n                return attrs;\n            }\n        });\n        var RadialGradientNode = GradientNode.extend({\n            template: function () {\n                return '<radialGradient id=\\'' + this.id + '\\' ' + this.renderCoordinates() + '>' + this.renderChildren() + '</radialGradient>';\n            },\n            mapCoordinates: function () {\n                var srcElement = this.srcElement;\n                var center = srcElement.center();\n                var radius = srcElement.radius();\n                var attrs = [\n                    [\n                        'cx',\n                        center.x\n                    ],\n                    [\n                        'cy',\n                        center.y\n                    ],\n                    [\n                        'r',\n                        radius\n                    ],\n                    this.mapSpace()\n                ];\n                return attrs;\n            }\n        });\n        var ClipNode = Node.extend({\n            init: function (srcElement) {\n                Node.fn.init.call(this);\n                this.srcElement = srcElement;\n                this.id = srcElement.id;\n                this.load([srcElement]);\n            },\n            template: function () {\n                return '<clipPath id=\\'' + this.id + '\\'>' + this.renderChildren() + '</clipPath>';\n            }\n        });\n        var DefinitionNode = Node.extend({\n            init: function () {\n                Node.fn.init.call(this);\n                this.definitionMap = {};\n            },\n            attachTo: function (domElement) {\n                this.element = domElement;\n            },\n            template: function () {\n                return '<defs>' + this.renderChildren() + '</defs>';\n            },\n            definitionChange: function (e) {\n                var definitions = e.definitions;\n                var action = e.action;\n                if (action === 'add') {\n                    this.addDefinitions(definitions);\n                } else if (action === 'remove') {\n                    this.removeDefinitions(definitions);\n                }\n            },\n            createDefinition: function (type, item) {\n                var nodeType;\n                if (type === 'clip') {\n                    nodeType = ClipNode;\n                } else if (type === 'fill') {\n                    if (item instanceof LinearGradient) {\n                        nodeType = LinearGradientNode;\n                    } else if (item instanceof RadialGradient) {\n                        nodeType = RadialGradientNode;\n                    }\n                }\n                return new nodeType(item);\n            },\n            addDefinitions: function (definitions) {\n                var this$1 = this;\n                for (var field in definitions) {\n                    this$1.addDefinition(field, definitions[field]);\n                }\n            },\n            addDefinition: function (type, srcElement) {\n                var ref = this;\n                var element = ref.element;\n                var definitionMap = ref.definitionMap;\n                var id = srcElement.id;\n                var mapItem = definitionMap[id];\n                if (!mapItem) {\n                    var node = this.createDefinition(type, srcElement);\n                    definitionMap[id] = {\n                        element: node,\n                        count: 1\n                    };\n                    this.append(node);\n                    if (element) {\n                        node.attachTo(this.element);\n                    }\n                } else {\n                    mapItem.count++;\n                }\n            },\n            removeDefinitions: function (definitions) {\n                var this$1 = this;\n                for (var field in definitions) {\n                    this$1.removeDefinition(definitions[field]);\n                }\n            },\n            removeDefinition: function (srcElement) {\n                var definitionMap = this.definitionMap;\n                var id = srcElement.id;\n                var mapItem = definitionMap[id];\n                if (mapItem) {\n                    mapItem.count--;\n                    if (mapItem.count === 0) {\n                        this.remove(this.childNodes.indexOf(mapItem.element), 1);\n                        delete definitionMap[id];\n                    }\n                }\n            }\n        });\n        var RootNode = Node.extend({\n            init: function (options) {\n                Node.fn.init.call(this);\n                this.options = options;\n                this.defs = new DefinitionNode();\n            },\n            attachTo: function (domElement) {\n                this.element = domElement;\n                this.defs.attachTo(domElement.firstElementChild);\n            },\n            clear: function () {\n                BaseNode.prototype.clear.call(this);\n            },\n            template: function () {\n                return this.defs.render() + this.renderChildren();\n            },\n            definitionChange: function (e) {\n                this.defs.definitionChange(e);\n            }\n        });\n        var RTL = 'rtl';\n        function alignToScreen(element) {\n            var ctm;\n            try {\n                ctm = element.getScreenCTM ? element.getScreenCTM() : null;\n            } catch (e) {\n            }\n            if (ctm) {\n                var left = -ctm.e % 1;\n                var top = -ctm.f % 1;\n                var style = element.style;\n                if (left !== 0 || top !== 0) {\n                    style.left = left + 'px';\n                    style.top = top + 'px';\n                }\n            }\n        }\n        var Surface$1 = Surface.extend({\n            init: function (element, options) {\n                Surface.fn.init.call(this, element, options);\n                this._root = new RootNode($.extend({ rtl: elementStyles(element, 'direction').direction === RTL }, this.options));\n                renderSVG$1(this.element, this._template());\n                this._rootElement = this.element.firstElementChild;\n                alignToScreen(this._rootElement);\n                this._root.attachTo(this._rootElement);\n                bindEvents(this.element, {\n                    click: this._click,\n                    mouseover: this._mouseenter,\n                    mouseout: this._mouseleave,\n                    mousemove: this._mousemove\n                });\n                this.resize();\n            },\n            destroy: function () {\n                if (this._root) {\n                    this._root.destroy();\n                    this._root = null;\n                    this._rootElement = null;\n                    unbindEvents(this.element, {\n                        click: this._click,\n                        mouseover: this._mouseenter,\n                        mouseout: this._mouseleave,\n                        mousemove: this._mousemove\n                    });\n                }\n                Surface.fn.destroy.call(this);\n            },\n            translate: function (offset) {\n                var viewBox = Math.round(offset.x) + ' ' + Math.round(offset.y) + ' ' + this._size.width + ' ' + this._size.height;\n                this._offset = offset;\n                this._rootElement.setAttribute('viewBox', viewBox);\n            },\n            draw: function (element) {\n                Surface.fn.draw.call(this, element);\n                this._root.load([element]);\n            },\n            clear: function () {\n                Surface.fn.clear.call(this);\n                this._root.clear();\n            },\n            svg: function () {\n                return '<?xml version=\\'1.0\\' ?>' + this._template();\n            },\n            exportVisual: function () {\n                var ref = this;\n                var visual = ref._visual;\n                var offset = ref._offset;\n                if (offset) {\n                    var wrap = new Group();\n                    wrap.children.push(visual);\n                    wrap.transform(transform().translate(-offset.x, -offset.y));\n                    visual = wrap;\n                }\n                return visual;\n            },\n            _resize: function () {\n                if (this._offset) {\n                    this.translate(this._offset);\n                }\n            },\n            _template: function () {\n                return '<svg style=\\'width: 100%; height: 100%; overflow: hidden;\\' xmlns=\\'' + SVG_NS + '\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\' version=\\'1.1\\'>' + this._root.render() + '</svg>';\n            }\n        });\n        Surface$1.prototype.type = 'svg';\n        if (typeof document !== 'undefined' && document.implementation.hasFeature('http://www.w3.org/TR/SVG11/feature#BasicStructure', '1.1')) {\n            Surface.support.svg = true;\n            SurfaceFactory.current.register('svg', Surface$1, 10);\n        }\n        var GroupNode = Node.extend({\n            template: function () {\n                return '<g' + (this.renderId() + this.renderTransform() + this.renderStyle() + this.renderOpacity() + this.renderDefinitions()) + '>' + this.renderChildren() + '</g>';\n            },\n            optionsChange: function (e) {\n                if (e.field === 'transform') {\n                    this.transformChange(e.value);\n                }\n                Node.fn.optionsChange.call(this, e);\n            }\n        });\n        NODE_MAP.Group = GroupNode;\n        var DASH_ARRAYS = {\n            dot: [\n                1.5,\n                3.5\n            ],\n            dash: [\n                4,\n                3.5\n            ],\n            longdash: [\n                8,\n                3.5\n            ],\n            dashdot: [\n                3.5,\n                3.5,\n                1.5,\n                3.5\n            ],\n            longdashdot: [\n                8,\n                3.5,\n                1.5,\n                3.5\n            ],\n            longdashdotdot: [\n                8,\n                3.5,\n                1.5,\n                3.5,\n                1.5,\n                3.5\n            ]\n        };\n        var SOLID = 'solid';\n        var BUTT = 'butt';\n        var ATTRIBUTE_MAP = {\n            'fill.opacity': 'fill-opacity',\n            'stroke.color': 'stroke',\n            'stroke.width': 'stroke-width',\n            'stroke.opacity': 'stroke-opacity'\n        };\n        var SPACE = ' ';\n        var PathNode = Node.extend({\n            geometryChange: function () {\n                this.attr('d', this.renderData());\n                this.invalidate();\n            },\n            optionsChange: function (e) {\n                switch (e.field) {\n                case 'fill':\n                    if (e.value) {\n                        this.allAttr(this.mapFill(e.value));\n                    } else {\n                        this.removeAttr('fill');\n                    }\n                    break;\n                case 'fill.color':\n                    this.allAttr(this.mapFill({ color: e.value }));\n                    break;\n                case 'stroke':\n                    if (e.value) {\n                        this.allAttr(this.mapStroke(e.value));\n                    } else {\n                        this.removeAttr('stroke');\n                    }\n                    break;\n                case 'transform':\n                    this.transformChange(e.value);\n                    break;\n                default:\n                    var name = ATTRIBUTE_MAP[e.field];\n                    if (name) {\n                        this.attr(name, e.value);\n                    }\n                    break;\n                }\n                Node.fn.optionsChange.call(this, e);\n            },\n            content: function () {\n                if (this.element) {\n                    this.element.textContent = this.srcElement.content();\n                }\n            },\n            renderData: function () {\n                return this.printPath(this.srcElement);\n            },\n            printPath: function (path) {\n                var this$1 = this;\n                var segments = path.segments;\n                var length = segments.length;\n                if (length > 0) {\n                    var parts = [];\n                    var output, currentType;\n                    for (var i = 1; i < length; i++) {\n                        var segmentType = this$1.segmentType(segments[i - 1], segments[i]);\n                        if (segmentType !== currentType) {\n                            currentType = segmentType;\n                            parts.push(segmentType);\n                        }\n                        if (segmentType === 'L') {\n                            parts.push(this$1.printPoints(segments[i].anchor()));\n                        } else {\n                            parts.push(this$1.printPoints(segments[i - 1].controlOut(), segments[i].controlIn(), segments[i].anchor()));\n                        }\n                    }\n                    output = 'M' + this.printPoints(segments[0].anchor()) + SPACE + parts.join(SPACE);\n                    if (path.options.closed) {\n                        output += 'Z';\n                    }\n                    return output;\n                }\n            },\n            printPoints: function () {\n                var points = arguments;\n                var length = points.length;\n                var result = [];\n                for (var i = 0; i < length; i++) {\n                    result.push(points[i].toString(3));\n                }\n                return result.join(' ');\n            },\n            segmentType: function (segmentStart, segmentEnd) {\n                return segmentStart.controlOut() && segmentEnd.controlIn() ? 'C' : 'L';\n            },\n            mapStroke: function (stroke) {\n                var attrs = [];\n                if (stroke && !isTransparent(stroke.color)) {\n                    attrs.push([\n                        'stroke',\n                        stroke.color\n                    ]);\n                    attrs.push([\n                        'stroke-width',\n                        stroke.width\n                    ]);\n                    attrs.push([\n                        'stroke-linecap',\n                        this.renderLinecap(stroke)\n                    ]);\n                    attrs.push([\n                        'stroke-linejoin',\n                        stroke.lineJoin\n                    ]);\n                    if (defined(stroke.opacity)) {\n                        attrs.push([\n                            'stroke-opacity',\n                            stroke.opacity\n                        ]);\n                    }\n                    if (defined(stroke.dashType)) {\n                        attrs.push([\n                            'stroke-dasharray',\n                            this.renderDashType(stroke)\n                        ]);\n                    }\n                } else {\n                    attrs.push([\n                        'stroke',\n                        NONE\n                    ]);\n                }\n                return attrs;\n            },\n            renderStroke: function () {\n                return renderAllAttr(this.mapStroke(this.srcElement.options.stroke));\n            },\n            renderDashType: function (stroke) {\n                var dashType = stroke.dashType;\n                var width = stroke.width;\n                if (width === void 0) {\n                    width = 1;\n                }\n                if (dashType && dashType !== SOLID) {\n                    var dashArray = DASH_ARRAYS[dashType.toLowerCase()];\n                    var result = [];\n                    for (var i = 0; i < dashArray.length; i++) {\n                        result.push(dashArray[i] * width);\n                    }\n                    return result.join(' ');\n                }\n            },\n            renderLinecap: function (stroke) {\n                var dashType = stroke.dashType;\n                var lineCap = stroke.lineCap;\n                return dashType && dashType !== 'solid' ? BUTT : lineCap;\n            },\n            mapFill: function (fill) {\n                var attrs = [];\n                if (!(fill && fill.nodeType === 'Gradient')) {\n                    if (fill && !isTransparent(fill.color)) {\n                        attrs.push([\n                            'fill',\n                            fill.color\n                        ]);\n                        if (defined(fill.opacity)) {\n                            attrs.push([\n                                'fill-opacity',\n                                fill.opacity\n                            ]);\n                        }\n                    } else {\n                        attrs.push([\n                            'fill',\n                            NONE\n                        ]);\n                    }\n                }\n                return attrs;\n            },\n            renderFill: function () {\n                return renderAllAttr(this.mapFill(this.srcElement.options.fill));\n            },\n            template: function () {\n                return '<path ' + this.renderId() + ' ' + this.renderStyle() + ' ' + this.renderOpacity() + ' ' + renderAttr('d', this.renderData()) + '' + this.renderStroke() + this.renderFill() + this.renderDefinitions() + this.renderTransform() + '></path>';\n            }\n        });\n        NODE_MAP.Path = PathNode;\n        var ArcNode = PathNode.extend({\n            renderData: function () {\n                return this.printPath(this.srcElement.toPath());\n            }\n        });\n        NODE_MAP.Arc = ArcNode;\n        var CircleNode = PathNode.extend({\n            geometryChange: function () {\n                var center = this.center();\n                this.attr('cx', center.x);\n                this.attr('cy', center.y);\n                this.attr('r', this.radius());\n                this.invalidate();\n            },\n            center: function () {\n                return this.srcElement.geometry().center;\n            },\n            radius: function () {\n                return this.srcElement.geometry().radius;\n            },\n            template: function () {\n                return '<circle ' + this.renderId() + ' ' + this.renderStyle() + ' ' + this.renderOpacity() + 'cx=\\'' + this.center().x + '\\' cy=\\'' + this.center().y + '\\' r=\\'' + this.radius() + '\\'' + this.renderStroke() + ' ' + this.renderFill() + ' ' + this.renderDefinitions() + this.renderTransform() + ' ></circle>';\n            }\n        });\n        NODE_MAP.Circle = CircleNode;\n        var RectNode = PathNode.extend({\n            geometryChange: function () {\n                var geometry = this.srcElement.geometry();\n                this.attr('x', geometry.origin.x);\n                this.attr('y', geometry.origin.y);\n                this.attr('width', geometry.size.width);\n                this.attr('height', geometry.size.height);\n                this.invalidate();\n            },\n            size: function () {\n                return this.srcElement.geometry().size;\n            },\n            origin: function () {\n                return this.srcElement.geometry().origin;\n            },\n            template: function () {\n                return '<rect ' + this.renderId() + ' ' + this.renderStyle() + ' ' + this.renderOpacity() + ' x=\\'' + this.origin().x + '\\' y=\\'' + this.origin().y + '\\' ' + 'width=\\'' + this.size().width + '\\' height=\\'' + this.size().height + '\\' ' + this.renderStroke() + ' ' + this.renderFill() + ' ' + this.renderDefinitions() + ' ' + this.renderTransform() + ' />';\n            }\n        });\n        NODE_MAP.Rect = RectNode;\n        var ImageNode = PathNode.extend({\n            geometryChange: function () {\n                this.allAttr(this.mapPosition());\n                this.invalidate();\n            },\n            optionsChange: function (e) {\n                if (e.field === 'src') {\n                    this.allAttr(this.mapSource());\n                }\n                PathNode.fn.optionsChange.call(this, e);\n            },\n            mapPosition: function () {\n                var rect = this.srcElement.rect();\n                var tl = rect.topLeft();\n                return [\n                    [\n                        'x',\n                        tl.x\n                    ],\n                    [\n                        'y',\n                        tl.y\n                    ],\n                    [\n                        'width',\n                        rect.width() + 'px'\n                    ],\n                    [\n                        'height',\n                        rect.height() + 'px'\n                    ]\n                ];\n            },\n            renderPosition: function () {\n                return renderAllAttr(this.mapPosition());\n            },\n            mapSource: function (encode) {\n                var src = this.srcElement.src();\n                if (encode) {\n                    src = kendo.htmlEncode(src);\n                }\n                return [[\n                        'xlink:href',\n                        src\n                    ]];\n            },\n            renderSource: function () {\n                return renderAllAttr(this.mapSource(true));\n            },\n            template: function () {\n                return '<image preserveAspectRatio=\\'none\\' ' + this.renderId() + ' ' + this.renderStyle() + ' ' + this.renderTransform() + ' ' + this.renderOpacity() + this.renderPosition() + ' ' + this.renderSource() + ' ' + this.renderDefinitions() + '>' + '</image>';\n            }\n        });\n        NODE_MAP.Image = ImageNode;\n        var ENTITY_REGEX = /&(?:[a-zA-Z]+|#\\d+);/g;\n        function decodeEntities(text) {\n            if (!text || typeof text !== 'string' || !ENTITY_REGEX.test(text)) {\n                return text;\n            }\n            var element = decodeEntities._element;\n            ENTITY_REGEX.lastIndex = 0;\n            return text.replace(ENTITY_REGEX, function (match) {\n                element.innerHTML = match;\n                return element.textContent || element.innerText;\n            });\n        }\n        if (typeof document !== 'undefined') {\n            decodeEntities._element = document.createElement('span');\n        }\n        var TextNode = PathNode.extend({\n            geometryChange: function () {\n                var pos = this.pos();\n                this.attr('x', pos.x);\n                this.attr('y', pos.y);\n                this.invalidate();\n            },\n            optionsChange: function (e) {\n                if (e.field === 'font') {\n                    this.attr('style', renderStyle(this.mapStyle()));\n                    this.geometryChange();\n                } else if (e.field === 'content') {\n                    PathNode.fn.content.call(this, this.srcElement.content());\n                }\n                PathNode.fn.optionsChange.call(this, e);\n            },\n            mapStyle: function (encode) {\n                var style = PathNode.fn.mapStyle.call(this, encode);\n                var font = this.srcElement.options.font;\n                if (encode) {\n                    font = kendo.htmlEncode(font);\n                }\n                style.push([\n                    'font',\n                    font\n                ], [\n                    'white-space',\n                    'pre'\n                ]);\n                return style;\n            },\n            pos: function () {\n                var pos = this.srcElement.position();\n                var size = this.srcElement.measure();\n                return pos.clone().setY(pos.y + size.baseline);\n            },\n            renderContent: function () {\n                var content = this.srcElement.content();\n                content = decodeEntities(content);\n                content = kendo.htmlEncode(content);\n                return kendoUtil.normalizeText(content);\n            },\n            renderTextAnchor: function () {\n                var anchor;\n                if ((this.options || {}).rtl && !(supportBrowser.msie || supportBrowser.edge)) {\n                    anchor = 'end';\n                }\n                return renderAttr('text-anchor', anchor);\n            },\n            template: function () {\n                return '<text ' + this.renderId() + ' ' + this.renderTextAnchor() + ' ' + this.renderStyle() + ' ' + this.renderOpacity() + 'x=\\'' + this.pos().x + '\\' y=\\'' + this.pos().y + '\\' ' + this.renderStroke() + ' ' + this.renderTransform() + ' ' + this.renderDefinitions() + this.renderFill() + '>' + this.renderContent() + '</text>';\n            }\n        });\n        NODE_MAP.Text = TextNode;\n        var MultiPathNode = PathNode.extend({\n            renderData: function () {\n                var this$1 = this;\n                var paths = this.srcElement.paths;\n                if (paths.length > 0) {\n                    var result = [];\n                    for (var i = 0; i < paths.length; i++) {\n                        result.push(this$1.printPath(paths[i]));\n                    }\n                    return result.join(' ');\n                }\n            }\n        });\n        NODE_MAP.MultiPath = MultiPathNode;\n        var geometry = {\n            Circle: Circle$2,\n            Arc: Arc$2,\n            Rect: Rect,\n            Point: Point,\n            Segment: Segment,\n            Matrix: Matrix,\n            Size: Size,\n            toMatrix: toMatrix,\n            Transformation: Transformation,\n            transform: transform\n        };\n        function exportGroup(group) {\n            var root = new RootNode({ skipBaseHref: true });\n            var bbox = group.clippedBBox();\n            var rootGroup = group;\n            if (bbox) {\n                var origin = bbox.getOrigin();\n                var exportRoot = new Group();\n                exportRoot.transform(transform().translate(-origin.x, -origin.y));\n                exportRoot.children.push(group);\n                rootGroup = exportRoot;\n            }\n            root.load([rootGroup]);\n            var svg = '<?xml version=\\'1.0\\' ?><svg xmlns=\\'' + SVG_NS + '\\' xmlns:xlink=\\'http://www.w3.org/1999/xlink\\' version=\\'1.1\\'>' + root.render() + '</svg>';\n            root.destroy();\n            return svg;\n        }\n        var svg = {\n            Surface: Surface$1,\n            RootNode: RootNode,\n            Node: Node,\n            GroupNode: GroupNode,\n            ArcNode: ArcNode,\n            CircleNode: CircleNode,\n            RectNode: RectNode,\n            ImageNode: ImageNode,\n            TextNode: TextNode,\n            PathNode: PathNode,\n            MultiPathNode: MultiPathNode,\n            DefinitionNode: DefinitionNode,\n            ClipNode: ClipNode,\n            GradientStopNode: GradientStopNode,\n            LinearGradientNode: LinearGradientNode,\n            RadialGradientNode: RadialGradientNode,\n            exportGroup: exportGroup\n        };\n        var NODE_MAP$2 = {};\n        function renderPath(ctx, path) {\n            var segments = path.segments;\n            if (segments.length === 0) {\n                return;\n            }\n            var segment = segments[0];\n            var anchor = segment.anchor();\n            ctx.moveTo(anchor.x, anchor.y);\n            for (var i = 1; i < segments.length; i++) {\n                segment = segments[i];\n                anchor = segment.anchor();\n                var prevSeg = segments[i - 1];\n                var prevOut = prevSeg.controlOut();\n                var controlIn = segment.controlIn();\n                if (prevOut && controlIn) {\n                    ctx.bezierCurveTo(prevOut.x, prevOut.y, controlIn.x, controlIn.y, anchor.x, anchor.y);\n                } else {\n                    ctx.lineTo(anchor.x, anchor.y);\n                }\n            }\n            if (path.options.closed) {\n                ctx.closePath();\n            }\n        }\n        var Node$2 = BaseNode.extend({\n            init: function (srcElement) {\n                BaseNode.fn.init.call(this, srcElement);\n                if (srcElement) {\n                    this.initClip();\n                }\n            },\n            initClip: function () {\n                var clip = this.srcElement.clip();\n                if (clip) {\n                    this.clip = clip;\n                    clip.addObserver(this);\n                }\n            },\n            clear: function () {\n                if (this.srcElement) {\n                    this.srcElement.removeObserver(this);\n                }\n                this.clearClip();\n                BaseNode.fn.clear.call(this);\n            },\n            clearClip: function () {\n                if (this.clip) {\n                    this.clip.removeObserver(this);\n                    delete this.clip;\n                }\n            },\n            setClip: function (ctx) {\n                if (this.clip) {\n                    ctx.beginPath();\n                    renderPath(ctx, this.clip);\n                    ctx.clip();\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'clip') {\n                    this.clearClip();\n                    this.initClip();\n                }\n                BaseNode.fn.optionsChange.call(this, e);\n            },\n            setTransform: function (ctx) {\n                if (this.srcElement) {\n                    var transform = this.srcElement.transform();\n                    if (transform) {\n                        ctx.transform.apply(ctx, transform.matrix().toArray(6));\n                    }\n                }\n            },\n            loadElements: function (elements, pos, cors) {\n                var this$1 = this;\n                for (var i = 0; i < elements.length; i++) {\n                    var srcElement = elements[i];\n                    var children = srcElement.children;\n                    var childNode = new NODE_MAP$2[srcElement.nodeType](srcElement, cors);\n                    if (children && children.length > 0) {\n                        childNode.load(children, pos, cors);\n                    }\n                    if (defined(pos)) {\n                        this$1.insertAt(childNode, pos);\n                    } else {\n                        this$1.append(childNode);\n                    }\n                }\n            },\n            load: function (elements, pos, cors) {\n                this.loadElements(elements, pos, cors);\n                this.invalidate();\n            },\n            setOpacity: function (ctx) {\n                if (this.srcElement) {\n                    var opacity = this.srcElement.opacity();\n                    if (defined(opacity)) {\n                        this.globalAlpha(ctx, opacity);\n                    }\n                }\n            },\n            globalAlpha: function (ctx, value) {\n                var opactity = value;\n                if (opactity && ctx.globalAlpha) {\n                    opactity *= ctx.globalAlpha;\n                }\n                ctx.globalAlpha = opactity;\n            },\n            visible: function () {\n                var src = this.srcElement;\n                return !src || src && src.options.visible !== false;\n            }\n        });\n        var GroupNode$2 = Node$2.extend({\n            renderTo: function (ctx) {\n                if (!this.visible()) {\n                    return;\n                }\n                ctx.save();\n                this.setTransform(ctx);\n                this.setClip(ctx);\n                this.setOpacity(ctx);\n                var childNodes = this.childNodes;\n                for (var i = 0; i < childNodes.length; i++) {\n                    var child = childNodes[i];\n                    if (child.visible()) {\n                        child.renderTo(ctx);\n                    }\n                }\n                ctx.restore();\n            }\n        });\n        Traversable.extend(GroupNode$2.prototype, 'childNodes');\n        NODE_MAP$2.Group = GroupNode$2;\n        var FRAME_DELAY = 1000 / 60;\n        var RootNode$2 = GroupNode$2.extend({\n            init: function (canvas) {\n                GroupNode$2.fn.init.call(this);\n                this.canvas = canvas;\n                this.ctx = canvas.getContext('2d');\n                var invalidateHandler = this._invalidate.bind(this);\n                this.invalidate = kendo.throttle(function () {\n                    kendo.animationFrame(invalidateHandler);\n                }, FRAME_DELAY);\n            },\n            destroy: function () {\n                GroupNode$2.fn.destroy.call(this);\n                this.canvas = null;\n                this.ctx = null;\n            },\n            load: function (elements, pos, cors) {\n                this.loadElements(elements, pos, cors);\n                this._invalidate();\n            },\n            _invalidate: function () {\n                if (!this.ctx) {\n                    return;\n                }\n                this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n                this.renderTo(this.ctx);\n            }\n        });\n        Traversable.extend(RootNode$2.prototype, 'childNodes');\n        var QuadRoot = Class.extend({\n            init: function () {\n                this.shapes = [];\n            },\n            _add: function (shape, bbox) {\n                this.shapes.push({\n                    bbox: bbox,\n                    shape: shape\n                });\n                shape._quadNode = this;\n            },\n            pointShapes: function (point) {\n                var shapes = this.shapes;\n                var length = shapes.length;\n                var result = [];\n                for (var idx = 0; idx < length; idx++) {\n                    if (shapes[idx].bbox.containsPoint(point)) {\n                        result.push(shapes[idx].shape);\n                    }\n                }\n                return result;\n            },\n            insert: function (shape, bbox) {\n                this._add(shape, bbox);\n            },\n            remove: function (shape) {\n                var shapes = this.shapes;\n                var length = shapes.length;\n                for (var idx = 0; idx < length; idx++) {\n                    if (shapes[idx].shape === shape) {\n                        shapes.splice(idx, 1);\n                        break;\n                    }\n                }\n            }\n        });\n        var QuadNode = QuadRoot.extend({\n            init: function (rect) {\n                QuadRoot.fn.init.call(this);\n                this.children = [];\n                this.rect = rect;\n            },\n            inBounds: function (rect) {\n                var nodeRect = this.rect;\n                var nodeBottomRight = nodeRect.bottomRight();\n                var bottomRight = rect.bottomRight();\n                var inBounds = nodeRect.origin.x <= rect.origin.x && nodeRect.origin.y <= rect.origin.y && bottomRight.x <= nodeBottomRight.x && bottomRight.y <= nodeBottomRight.y;\n                return inBounds;\n            },\n            pointShapes: function (point) {\n                var children = this.children;\n                var length = children.length;\n                var result = QuadRoot.fn.pointShapes.call(this, point);\n                for (var idx = 0; idx < length; idx++) {\n                    append(result, children[idx].pointShapes(point));\n                }\n                return result;\n            },\n            insert: function (shape, bbox) {\n                var children = this.children;\n                var inserted = false;\n                if (this.inBounds(bbox)) {\n                    if (this.shapes.length < 4) {\n                        this._add(shape, bbox);\n                    } else {\n                        if (!children.length) {\n                            this._initChildren();\n                        }\n                        for (var idx = 0; idx < children.length; idx++) {\n                            if (children[idx].insert(shape, bbox)) {\n                                inserted = true;\n                                break;\n                            }\n                        }\n                        if (!inserted) {\n                            this._add(shape, bbox);\n                        }\n                    }\n                    inserted = true;\n                }\n                return inserted;\n            },\n            _initChildren: function () {\n                var ref = this;\n                var rect = ref.rect;\n                var children = ref.children;\n                var center = rect.center();\n                var halfWidth = rect.width() / 2;\n                var halfHeight = rect.height() / 2;\n                children.push(new QuadNode(new Rect([\n                    rect.origin.x,\n                    rect.origin.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])), new QuadNode(new Rect([\n                    center.x,\n                    rect.origin.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])), new QuadNode(new Rect([\n                    rect.origin.x,\n                    center.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])), new QuadNode(new Rect([\n                    center.x,\n                    center.y\n                ], [\n                    halfWidth,\n                    halfHeight\n                ])));\n            }\n        });\n        var ROOT_SIZE = 3000;\n        var LEVEL_STEP = 10000;\n        var MAX_LEVEL = 75;\n        var ShapesQuadTree = Class.extend({\n            init: function () {\n                this.initRoots();\n            },\n            initRoots: function () {\n                this.rootMap = {};\n                this.root = new QuadRoot();\n                this.rootElements = [];\n            },\n            clear: function () {\n                var this$1 = this;\n                var rootElements = this.rootElements;\n                for (var idx = 0; idx < rootElements.length; idx++) {\n                    this$1.remove(rootElements[idx]);\n                }\n                this.initRoots();\n            },\n            pointShape: function (point) {\n                var sectorRoot = (this.rootMap[Math.floor(point.x / ROOT_SIZE)] || {})[Math.floor(point.y / ROOT_SIZE)];\n                var result = this.root.pointShapes(point);\n                if (sectorRoot) {\n                    result = result.concat(sectorRoot.pointShapes(point));\n                }\n                this.assignZindex(result);\n                result.sort(zIndexComparer);\n                for (var idx = 0; idx < result.length; idx++) {\n                    if (result[idx].containsPoint(point)) {\n                        return result[idx];\n                    }\n                }\n            },\n            assignZindex: function (elements) {\n                var this$1 = this;\n                for (var idx = 0; idx < elements.length; idx++) {\n                    var element = elements[idx];\n                    var zIndex = 0;\n                    var levelWeight = Math.pow(LEVEL_STEP, MAX_LEVEL);\n                    var parents = [];\n                    while (element) {\n                        parents.push(element);\n                        element = element.parent;\n                    }\n                    while (parents.length) {\n                        element = parents.pop();\n                        zIndex += ((element.parent ? element.parent.children : this$1.rootElements).indexOf(element) + 1) * levelWeight;\n                        levelWeight /= LEVEL_STEP;\n                    }\n                    elements[idx]._zIndex = zIndex;\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'transform' || e.field === 'stroke.width') {\n                    this.bboxChange(e.element);\n                }\n            },\n            geometryChange: function (e) {\n                this.bboxChange(e.element);\n            },\n            bboxChange: function (element) {\n                var this$1 = this;\n                if (element.nodeType === 'Group') {\n                    for (var idx = 0; idx < element.children.length; idx++) {\n                        this$1.bboxChange(element.children[idx]);\n                    }\n                } else {\n                    if (element._quadNode) {\n                        element._quadNode.remove(element);\n                    }\n                    this._insertShape(element);\n                }\n            },\n            add: function (elements) {\n                var elementsArray = Array.isArray(elements) ? elements.slice(0) : [elements];\n                append(this.rootElements, elementsArray);\n                this._insert(elementsArray);\n            },\n            childrenChange: function (e) {\n                var this$1 = this;\n                if (e.action === 'remove') {\n                    for (var idx = 0; idx < e.items.length; idx++) {\n                        this$1.remove(e.items[idx]);\n                    }\n                } else {\n                    this._insert(Array.prototype.slice.call(e.items, 0));\n                }\n            },\n            _insert: function (elements) {\n                var this$1 = this;\n                var element;\n                while (elements.length > 0) {\n                    element = elements.pop();\n                    element.addObserver(this$1);\n                    if (element.nodeType === 'Group') {\n                        append(elements, element.children);\n                    } else {\n                        this$1._insertShape(element);\n                    }\n                }\n            },\n            _insertShape: function (shape) {\n                var bbox = shape.bbox();\n                if (bbox) {\n                    var sectors = this.getSectors(bbox);\n                    var x = sectors[0][0];\n                    var y = sectors[1][0];\n                    if (this.inRoot(sectors)) {\n                        this.root.insert(shape, bbox);\n                    } else {\n                        var rootMap = this.rootMap;\n                        if (!rootMap[x]) {\n                            rootMap[x] = {};\n                        }\n                        if (!rootMap[x][y]) {\n                            rootMap[x][y] = new QuadNode(new Rect([\n                                x * ROOT_SIZE,\n                                y * ROOT_SIZE\n                            ], [\n                                ROOT_SIZE,\n                                ROOT_SIZE\n                            ]));\n                        }\n                        rootMap[x][y].insert(shape, bbox);\n                    }\n                }\n            },\n            remove: function (element) {\n                var this$1 = this;\n                element.removeObserver(this);\n                if (element.nodeType === 'Group') {\n                    var children = element.children;\n                    for (var idx = 0; idx < children.length; idx++) {\n                        this$1.remove(children[idx]);\n                    }\n                } else if (element._quadNode) {\n                    element._quadNode.remove(element);\n                    delete element._quadNode;\n                }\n            },\n            inRoot: function (sectors) {\n                return sectors[0].length > 1 || sectors[1].length > 1;\n            },\n            getSectors: function (rect) {\n                var bottomRight = rect.bottomRight();\n                var bottomX = Math.floor(bottomRight.x / ROOT_SIZE);\n                var bottomY = Math.floor(bottomRight.y / ROOT_SIZE);\n                var sectors = [\n                    [],\n                    []\n                ];\n                for (var x = Math.floor(rect.origin.x / ROOT_SIZE); x <= bottomX; x++) {\n                    sectors[0].push(x);\n                }\n                for (var y = Math.floor(rect.origin.y / ROOT_SIZE); y <= bottomY; y++) {\n                    sectors[1].push(y);\n                }\n                return sectors;\n            }\n        });\n        function zIndexComparer(x1, x2) {\n            if (x1._zIndex < x2._zIndex) {\n                return 1;\n            }\n            if (x1._zIndex > x2._zIndex) {\n                return -1;\n            }\n            return 0;\n        }\n        var SurfaceCursor = Class.extend({\n            init: function (surface) {\n                surface.bind('mouseenter', this._mouseenter.bind(this));\n                surface.bind('mouseleave', this._mouseleave.bind(this));\n                this.element = surface.element;\n            },\n            clear: function () {\n                this._resetCursor();\n            },\n            destroy: function () {\n                this._resetCursor();\n                delete this.element;\n            },\n            _mouseenter: function (e) {\n                var cursor = this._shapeCursor(e);\n                if (!cursor) {\n                    this._resetCursor();\n                } else {\n                    if (!this._current) {\n                        this._defaultCursor = this._getCursor();\n                    }\n                    this._setCursor(cursor);\n                }\n            },\n            _mouseleave: function () {\n                this._resetCursor();\n            },\n            _shapeCursor: function (e) {\n                var shape = e.element;\n                while (shape && !defined(shape.options.cursor)) {\n                    shape = shape.parent;\n                }\n                if (shape) {\n                    return shape.options.cursor;\n                }\n            },\n            _getCursor: function () {\n                if (this.element) {\n                    return this.element.style.cursor;\n                }\n            },\n            _setCursor: function (cursor) {\n                if (this.element) {\n                    this.element.style.cursor = cursor;\n                    this._current = cursor;\n                }\n            },\n            _resetCursor: function () {\n                if (this._current) {\n                    this._setCursor(this._defaultCursor || '');\n                    delete this._current;\n                }\n            }\n        });\n        var Surface$3 = Surface.extend({\n            init: function (element, options) {\n                Surface.fn.init.call(this, element, options);\n                this.element.innerHTML = this._template(this);\n                var canvas = this.element.firstElementChild;\n                var size = elementSize(element);\n                canvas.width = size.width;\n                canvas.height = size.height;\n                this._rootElement = canvas;\n                this._root = new RootNode$2(canvas);\n                this._mouseTrackHandler = this._trackMouse.bind(this);\n                bindEvents(this.element, {\n                    click: this._mouseTrackHandler,\n                    mousemove: this._mouseTrackHandler\n                });\n            },\n            destroy: function () {\n                Surface.fn.destroy.call(this);\n                if (this._root) {\n                    this._root.destroy();\n                    this._root = null;\n                }\n                if (this._searchTree) {\n                    this._searchTree.clear();\n                    delete this._searchTree;\n                }\n                if (this._cursor) {\n                    this._cursor.destroy();\n                    delete this._cursor;\n                }\n                unbindEvents(this.element, {\n                    click: this._mouseTrackHandler,\n                    mousemove: this._mouseTrackHandler\n                });\n            },\n            draw: function (element) {\n                Surface.fn.draw.call(this, element);\n                this._root.load([element], undefined, this.options.cors);\n                if (this._searchTree) {\n                    this._searchTree.add([element]);\n                }\n            },\n            clear: function () {\n                Surface.fn.clear.call(this);\n                this._root.clear();\n                if (this._searchTree) {\n                    this._searchTree.clear();\n                }\n                if (this._cursor) {\n                    this._cursor.clear();\n                }\n            },\n            eventTarget: function (e) {\n                if (this._searchTree) {\n                    var point = this._surfacePoint(e);\n                    var shape = this._searchTree.pointShape(point);\n                    return shape;\n                }\n            },\n            image: function () {\n                var ref = this;\n                var root = ref._root;\n                var rootElement = ref._rootElement;\n                var loadingStates = [];\n                root.traverse(function (childNode) {\n                    if (childNode.loading) {\n                        loadingStates.push(childNode.loading);\n                    }\n                });\n                var promise = createPromise();\n                var resolveDataURL = function () {\n                    root._invalidate();\n                    try {\n                        var data = rootElement.toDataURL();\n                        promise.resolve(data);\n                    } catch (e) {\n                        promise.reject(e);\n                    }\n                };\n                promiseAll(loadingStates).then(resolveDataURL, resolveDataURL);\n                return promise;\n            },\n            suspendTracking: function () {\n                Surface.fn.suspendTracking.call(this);\n                if (this._searchTree) {\n                    this._searchTree.clear();\n                    delete this._searchTree;\n                }\n            },\n            resumeTracking: function () {\n                Surface.fn.resumeTracking.call(this);\n                if (!this._searchTree) {\n                    this._searchTree = new ShapesQuadTree();\n                    var childNodes = this._root.childNodes;\n                    var rootElements = [];\n                    for (var idx = 0; idx < childNodes.length; idx++) {\n                        rootElements.push(childNodes[idx].srcElement);\n                    }\n                    this._searchTree.add(rootElements);\n                }\n            },\n            _resize: function () {\n                this._rootElement.width = this._size.width;\n                this._rootElement.height = this._size.height;\n                this._root.invalidate();\n            },\n            _template: function () {\n                return '<canvas style=\\'width: 100%; height: 100%;\\'></canvas>';\n            },\n            _enableTracking: function () {\n                this._searchTree = new ShapesQuadTree();\n                this._cursor = new SurfaceCursor(this);\n                Surface.fn._enableTracking.call(this);\n            },\n            _trackMouse: function (e) {\n                if (this._suspendedTracking) {\n                    return;\n                }\n                var shape = this.eventTarget(e);\n                if (e.type !== 'click') {\n                    var currentShape = this._currentShape;\n                    if (currentShape && currentShape !== shape) {\n                        this.trigger('mouseleave', {\n                            element: currentShape,\n                            originalEvent: e,\n                            type: 'mouseleave'\n                        });\n                    }\n                    if (shape && currentShape !== shape) {\n                        this.trigger('mouseenter', {\n                            element: shape,\n                            originalEvent: e,\n                            type: 'mouseenter'\n                        });\n                    }\n                    this.trigger('mousemove', {\n                        element: shape,\n                        originalEvent: e,\n                        type: 'mousemove'\n                    });\n                    this._currentShape = shape;\n                } else if (shape) {\n                    this.trigger('click', {\n                        element: shape,\n                        originalEvent: e,\n                        type: 'click'\n                    });\n                }\n            }\n        });\n        Surface$3.prototype.type = 'canvas';\n        if (typeof document !== 'undefined' && document.createElement('canvas').getContext) {\n            Surface.support.canvas = true;\n            SurfaceFactory.current.register('canvas', Surface$3, 20);\n        }\n        function addGradientStops(gradient, stops) {\n            for (var idx = 0; idx < stops.length; idx++) {\n                var stop = stops[idx];\n                var color = kendo.parseColor(stop.color());\n                color.a *= stop.opacity();\n                gradient.addColorStop(stop.offset(), color.toCssRgba());\n            }\n        }\n        var PathNode$2 = Node$2.extend({\n            renderTo: function (ctx) {\n                ctx.save();\n                this.setTransform(ctx);\n                this.setClip(ctx);\n                this.setOpacity(ctx);\n                ctx.beginPath();\n                this.renderPoints(ctx, this.srcElement);\n                this.setLineDash(ctx);\n                this.setLineCap(ctx);\n                this.setLineJoin(ctx);\n                this.setFill(ctx);\n                this.setStroke(ctx);\n                ctx.restore();\n            },\n            setFill: function (ctx) {\n                var fill = this.srcElement.options.fill;\n                var hasFill = false;\n                if (fill) {\n                    if (fill.nodeType === 'Gradient') {\n                        this.setGradientFill(ctx, fill);\n                        hasFill = true;\n                    } else if (!isTransparent(fill.color)) {\n                        ctx.fillStyle = fill.color;\n                        ctx.save();\n                        this.globalAlpha(ctx, fill.opacity);\n                        ctx.fill();\n                        ctx.restore();\n                        hasFill = true;\n                    }\n                }\n                return hasFill;\n            },\n            setGradientFill: function (ctx, fill) {\n                var bbox = this.srcElement.rawBBox();\n                var gradient;\n                if (fill instanceof LinearGradient) {\n                    var start = fill.start();\n                    var end = fill.end();\n                    gradient = ctx.createLinearGradient(start.x, start.y, end.x, end.y);\n                } else if (fill instanceof RadialGradient) {\n                    var center = fill.center();\n                    gradient = ctx.createRadialGradient(center.x, center.y, 0, center.x, center.y, fill.radius());\n                }\n                addGradientStops(gradient, fill.stops);\n                ctx.save();\n                if (!fill.userSpace()) {\n                    ctx.transform(bbox.width(), 0, 0, bbox.height(), bbox.origin.x, bbox.origin.y);\n                }\n                ctx.fillStyle = gradient;\n                ctx.fill();\n                ctx.restore();\n            },\n            setStroke: function (ctx) {\n                var stroke = this.srcElement.options.stroke;\n                if (stroke && !isTransparent(stroke.color) && stroke.width > 0) {\n                    ctx.strokeStyle = stroke.color;\n                    ctx.lineWidth = valueOrDefault(stroke.width, 1);\n                    ctx.save();\n                    this.globalAlpha(ctx, stroke.opacity);\n                    ctx.stroke();\n                    ctx.restore();\n                    return true;\n                }\n            },\n            dashType: function () {\n                var stroke = this.srcElement.options.stroke;\n                if (stroke && stroke.dashType) {\n                    return stroke.dashType.toLowerCase();\n                }\n            },\n            setLineDash: function (ctx) {\n                var dashType = this.dashType();\n                if (dashType && dashType !== SOLID) {\n                    var dashArray = DASH_ARRAYS[dashType];\n                    if (ctx.setLineDash) {\n                        ctx.setLineDash(dashArray);\n                    } else {\n                        ctx.mozDash = dashArray;\n                        ctx.webkitLineDash = dashArray;\n                    }\n                }\n            },\n            setLineCap: function (ctx) {\n                var dashType = this.dashType();\n                var stroke = this.srcElement.options.stroke;\n                if (dashType && dashType !== SOLID) {\n                    ctx.lineCap = BUTT;\n                } else if (stroke && stroke.lineCap) {\n                    ctx.lineCap = stroke.lineCap;\n                }\n            },\n            setLineJoin: function (ctx) {\n                var stroke = this.srcElement.options.stroke;\n                if (stroke && stroke.lineJoin) {\n                    ctx.lineJoin = stroke.lineJoin;\n                }\n            },\n            renderPoints: function (ctx, path) {\n                renderPath(ctx, path);\n            }\n        });\n        NODE_MAP$2.Path = PathNode$2;\n        var ArcNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var path = this.srcElement.toPath();\n                renderPath(ctx, path);\n            }\n        });\n        NODE_MAP$2.Arc = ArcNode$2;\n        var CircleNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var ref = this.srcElement.geometry();\n                var center = ref.center;\n                var radius = ref.radius;\n                ctx.arc(center.x, center.y, radius, 0, Math.PI * 2);\n            }\n        });\n        NODE_MAP$2.Circle = CircleNode$2;\n        var RectNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var ref = this.srcElement.geometry();\n                var origin = ref.origin;\n                var size = ref.size;\n                ctx.rect(origin.x, origin.y, size.width, size.height);\n            }\n        });\n        NODE_MAP$2.Rect = RectNode$2;\n        var ImageNode$2 = PathNode$2.extend({\n            init: function (srcElement, cors) {\n                PathNode$2.fn.init.call(this, srcElement);\n                this.onLoad = this.onLoad.bind(this);\n                this.onError = this.onError.bind(this);\n                this.loading = createPromise();\n                var img = this.img = new Image();\n                if (cors && !/^data:/i.test(srcElement.src())) {\n                    img.crossOrigin = cors;\n                }\n                img.src = srcElement.src();\n                if (img.complete) {\n                    this.onLoad();\n                } else {\n                    img.onload = this.onLoad;\n                    img.onerror = this.onError;\n                }\n            },\n            renderTo: function (ctx) {\n                if (this.loading.state() === 'resolved') {\n                    ctx.save();\n                    this.setTransform(ctx);\n                    this.setClip(ctx);\n                    this.drawImage(ctx);\n                    ctx.restore();\n                }\n            },\n            optionsChange: function (e) {\n                if (e.field === 'src') {\n                    this.loading = createPromise();\n                    this.img.src = this.srcElement.src();\n                } else {\n                    PathNode$2.fn.optionsChange.call(this, e);\n                }\n            },\n            onLoad: function () {\n                this.loading.resolve();\n                this.invalidate();\n            },\n            onError: function () {\n                this.loading.reject(new Error('Unable to load image \\'' + this.img.src + '\\'. Check for connectivity and verify CORS headers.'));\n            },\n            drawImage: function (ctx) {\n                var rect = this.srcElement.rect();\n                var topLeft = rect.topLeft();\n                ctx.drawImage(this.img, topLeft.x, topLeft.y, rect.width(), rect.height());\n            }\n        });\n        NODE_MAP$2.Image = ImageNode$2;\n        var TextNode$2 = PathNode$2.extend({\n            renderTo: function (ctx) {\n                var text = this.srcElement;\n                var pos = text.position();\n                var size = text.measure();\n                ctx.save();\n                this.setTransform(ctx);\n                this.setClip(ctx);\n                this.setOpacity(ctx);\n                ctx.beginPath();\n                ctx.font = text.options.font;\n                ctx.textAlign = 'left';\n                if (this.setFill(ctx)) {\n                    ctx.fillText(text.content(), pos.x, pos.y + size.baseline);\n                }\n                if (this.setStroke(ctx)) {\n                    this.setLineDash(ctx);\n                    ctx.strokeText(text.content(), pos.x, pos.y + size.baseline);\n                }\n                ctx.restore();\n            }\n        });\n        NODE_MAP$2.Text = TextNode$2;\n        var MultiPathNode$2 = PathNode$2.extend({\n            renderPoints: function (ctx) {\n                var paths = this.srcElement.paths;\n                for (var i = 0; i < paths.length; i++) {\n                    renderPath(ctx, paths[i]);\n                }\n            }\n        });\n        NODE_MAP$2.MultiPath = MultiPathNode$2;\n        var canvas = {\n            Surface: Surface$3,\n            RootNode: RootNode$2,\n            Node: Node$2,\n            GroupNode: GroupNode$2,\n            ArcNode: ArcNode$2,\n            CircleNode: CircleNode$2,\n            RectNode: RectNode$2,\n            ImageNode: ImageNode$2,\n            TextNode: TextNode$2,\n            PathNode: PathNode$2,\n            MultiPathNode: MultiPathNode$2\n        };\n        function exportImage(group, options) {\n            var defaults = {\n                width: '800px',\n                height: '600px',\n                cors: 'Anonymous'\n            };\n            var exportRoot = group;\n            var bbox = group.clippedBBox();\n            if (bbox) {\n                var origin = bbox.getOrigin();\n                exportRoot = new Group();\n                exportRoot.transform(transform().translate(-origin.x, -origin.y));\n                exportRoot.children.push(group);\n                var size = bbox.getSize();\n                defaults.width = size.width + 'px';\n                defaults.height = size.height + 'px';\n            }\n            var surfaceOptions = $.extend(defaults, options);\n            var container = document.createElement('div');\n            var style = container.style;\n            style.display = 'none';\n            style.width = surfaceOptions.width;\n            style.height = surfaceOptions.height;\n            document.body.appendChild(container);\n            var surface = new Surface$3(container, surfaceOptions);\n            surface.suspendTracking();\n            surface.draw(exportRoot);\n            var promise = surface.image();\n            var destroy = function () {\n                surface.destroy();\n                document.body.removeChild(container);\n            };\n            promise.then(destroy, destroy);\n            return promise;\n        }\n        function exportSVG(group, options) {\n            var svg = exportGroup(group);\n            if (!options || !options.raw) {\n                svg = 'data:image/svg+xml;base64,' + encodeBase64(svg);\n            }\n            return createPromise().resolve(svg);\n        }\n        var browser = supportBrowser;\n        function slice$1(thing) {\n            return Array.prototype.slice.call(thing);\n        }\n        var KENDO_PSEUDO_ELEMENT = 'KENDO-PSEUDO-ELEMENT';\n        var IMAGE_CACHE = {};\n        var nodeInfo = {};\n        nodeInfo._root = nodeInfo;\n        var inBrowser = typeof window !== 'undefined';\n        var microsoft = inBrowser ? browser.msie || browser.edge : false;\n        var TextRect = Text.extend({\n            init: function (str, rect, options) {\n                Text.fn.init.call(this, str, rect.getOrigin(), options);\n                this._pdfRect = rect;\n            },\n            rect: function () {\n                return this._pdfRect;\n            },\n            rawBBox: function () {\n                return this._pdfRect;\n            }\n        });\n        function addClass(el, cls) {\n            if (el.classList) {\n                el.classList.add(cls);\n            } else {\n                el.className += ' ' + cls;\n            }\n        }\n        function removeClass(el, cls) {\n            if (el.classList) {\n                el.classList.remove(cls);\n            } else {\n                el.className = el.className.split(/\\s+/).reduce(function (a, word) {\n                    if (word != cls) {\n                        a.push(word);\n                    }\n                    return a;\n                }, []).join(' ');\n            }\n        }\n        function setCSS(el, styles) {\n            Object.keys(styles).forEach(function (key) {\n                el.style[key] = styles[key];\n            });\n        }\n        var matches = typeof Element !== 'undefined' && Element.prototype && function (p) {\n            if (p.matches) {\n                return function (el, selector) {\n                    return el.matches(selector);\n                };\n            }\n            if (p.webkitMatchesSelector) {\n                return function (el, selector) {\n                    return el.webkitMatchesSelector(selector);\n                };\n            }\n            if (p.mozMatchesSelector) {\n                return function (el, selector) {\n                    return el.mozMatchesSelector(selector);\n                };\n            }\n            if (p.msMatchesSelector) {\n                return function (el, selector) {\n                    return el.msMatchesSelector(selector);\n                };\n            }\n            return function (s) {\n                return [].indexOf.call(document.querySelectorAll(s), this) !== -1;\n            };\n        }(Element.prototype);\n        function closest(el, selector) {\n            if (el.closest) {\n                return el.closest(selector);\n            }\n            while (el && !/^\\[object (?:HTML)?Document\\]$/.test(String(el))) {\n                if (el.nodeType == 1 && matches(el, selector)) {\n                    return el;\n                }\n                el = el.parentNode;\n            }\n        }\n        var cloneNodes = function ($) {\n            if ($) {\n                return function cloneNodes(el) {\n                    var clone = el.cloneNode(false);\n                    if (el.nodeType == 1) {\n                        var $el = $(el), $clone = $(clone), i;\n                        var data = $el.data();\n                        for (i in data) {\n                            $clone.data(i, data[i]);\n                        }\n                        if (/^canvas$/i.test(el.tagName)) {\n                            clone.getContext('2d').drawImage(el, 0, 0);\n                        } else if (/^(?:input|select|textarea|option)$/i.test(el.tagName)) {\n                            clone.removeAttribute('id');\n                            clone.removeAttribute('name');\n                            clone.value = el.value;\n                            clone.checked = el.checked;\n                            clone.selected = el.selected;\n                        }\n                        for (i = el.firstChild; i; i = i.nextSibling) {\n                            clone.appendChild(cloneNodes(i));\n                        }\n                    }\n                    return clone;\n                };\n            } else {\n                return function cloneNodes(el) {\n                    var clone = function dive(node) {\n                        var clone = node.cloneNode(false);\n                        if (node._kendoExportVisual) {\n                            clone._kendoExportVisual = node._kendoExportVisual;\n                        }\n                        for (var i = node.firstChild; i; i = i.nextSibling) {\n                            clone.appendChild(dive(i));\n                        }\n                        return clone;\n                    }(el);\n                    var canvases = el.querySelectorAll('canvas');\n                    if (canvases.length) {\n                        slice$1(clone.querySelectorAll('canvas')).forEach(function (canvas$$1, i) {\n                            canvas$$1.getContext('2d').drawImage(canvases[i], 0, 0);\n                        });\n                    }\n                    var orig = el.querySelectorAll('input, select, textarea, option');\n                    slice$1(clone.querySelectorAll('input, select, textarea, option')).forEach(function (el, i) {\n                        el.removeAttribute('id');\n                        el.removeAttribute('name');\n                        el.value = orig[i].value;\n                        el.checked = orig[i].checked;\n                        el.selected = orig[i].selected;\n                    });\n                    return clone;\n                };\n            }\n        }(typeof window !== 'undefined' && window.kendo && window.kendo.jQuery);\n        function getXY(thing) {\n            if (typeof thing == 'number') {\n                return {\n                    x: thing,\n                    y: thing\n                };\n            }\n            if (Array.isArray(thing)) {\n                return {\n                    x: thing[0],\n                    y: thing[1]\n                };\n            }\n            return {\n                x: thing.x,\n                y: thing.y\n            };\n        }\n        function drawDOM(element, options) {\n            if (!options) {\n                options = {};\n            }\n            var promise = createPromise();\n            if (!element) {\n                return promise.reject('No element to export');\n            }\n            if (typeof window.getComputedStyle != 'function') {\n                throw new Error('window.getComputedStyle is missing.  You are using an unsupported browser, or running in IE8 compatibility mode.  Drawing HTML is supported in Chrome, Firefox, Safari and IE9+.');\n            }\n            kendo.pdf.defineFont(getFontFaces(element.ownerDocument));\n            var scale = getXY(options.scale || 1);\n            function doOne(element) {\n                var group = new Group();\n                var pos = element.getBoundingClientRect();\n                setTransform(group, [\n                    scale.x,\n                    0,\n                    0,\n                    scale.y,\n                    -pos.left * scale.x,\n                    -pos.top * scale.y\n                ]);\n                nodeInfo._clipbox = false;\n                nodeInfo._matrix = Matrix.unit();\n                nodeInfo._stackingContext = {\n                    element: element,\n                    group: group\n                };\n                if (options.avoidLinks === true) {\n                    nodeInfo._avoidLinks = 'a';\n                } else {\n                    nodeInfo._avoidLinks = options.avoidLinks;\n                }\n                addClass(element, 'k-pdf-export');\n                renderElement(element, group);\n                removeClass(element, 'k-pdf-export');\n                return group;\n            }\n            cacheImages(element, function () {\n                var forceBreak = options && options.forcePageBreak;\n                var hasPaperSize = options && options.paperSize && options.paperSize != 'auto';\n                var paperOptions = kendo.pdf.getPaperOptions(function (key, def) {\n                    if (key == 'paperSize') {\n                        return hasPaperSize ? options[key] : 'A4';\n                    }\n                    return key in options ? options[key] : def;\n                });\n                var pageWidth = hasPaperSize && paperOptions.paperSize[0];\n                var pageHeight = hasPaperSize && paperOptions.paperSize[1];\n                var margin = options.margin && paperOptions.margin;\n                var hasMargin = Boolean(margin);\n                if (forceBreak || pageHeight) {\n                    if (!margin) {\n                        margin = {\n                            left: 0,\n                            top: 0,\n                            right: 0,\n                            bottom: 0\n                        };\n                    }\n                    if (pageWidth) {\n                        pageWidth /= scale.x;\n                    }\n                    if (pageHeight) {\n                        pageHeight /= scale.y;\n                    }\n                    margin.left /= scale.x;\n                    margin.right /= scale.x;\n                    margin.top /= scale.y;\n                    margin.bottom /= scale.y;\n                    var group = new Group({\n                        pdf: {\n                            multiPage: true,\n                            paperSize: hasPaperSize ? paperOptions.paperSize : 'auto',\n                            _ignoreMargin: hasMargin\n                        }\n                    });\n                    handlePageBreaks(function (x) {\n                        if (options.progress) {\n                            var canceled = false, pageNum = 0;\n                            (function next() {\n                                if (pageNum < x.pages.length) {\n                                    var page = doOne(x.pages[pageNum]);\n                                    group.append(page);\n                                    options.progress({\n                                        page: page,\n                                        pageNum: ++pageNum,\n                                        totalPages: x.pages.length,\n                                        cancel: function () {\n                                            canceled = true;\n                                        }\n                                    });\n                                    if (!canceled) {\n                                        setTimeout(next);\n                                    } else {\n                                        x.container.parentNode.removeChild(x.container);\n                                    }\n                                } else {\n                                    x.container.parentNode.removeChild(x.container);\n                                    promise.resolve(group);\n                                }\n                            }());\n                        } else {\n                            x.pages.forEach(function (page) {\n                                group.append(doOne(page));\n                            });\n                            x.container.parentNode.removeChild(x.container);\n                            promise.resolve(group);\n                        }\n                    }, element, forceBreak, pageWidth ? pageWidth - margin.left - margin.right : null, pageHeight ? pageHeight - margin.top - margin.bottom : null, margin, options);\n                } else {\n                    promise.resolve(doOne(element));\n                }\n            });\n            function makeTemplate(template$$1) {\n                if (template$$1 != null) {\n                    if (typeof template$$1 == 'string') {\n                        template$$1 = kendo.template(template$$1.replace(/^\\s+|\\s+$/g, ''));\n                    }\n                    if (typeof template$$1 == 'function') {\n                        return function (data) {\n                            var el = template$$1(data);\n                            if (el && typeof el == 'string') {\n                                var div = document.createElement('div');\n                                div.innerHTML = el;\n                                el = div.firstElementChild;\n                            }\n                            return el;\n                        };\n                    }\n                    return function () {\n                        return template$$1.cloneNode(true);\n                    };\n                }\n            }\n            function handlePageBreaks(callback, element, forceBreak, pageWidth, pageHeight, margin, options) {\n                var template$$1 = makeTemplate(options.template);\n                var doc = element.ownerDocument;\n                var pages = [];\n                var copy = options._destructive ? element : cloneNodes(element);\n                var container = doc.createElement('KENDO-PDF-DOCUMENT');\n                var adjust = 0;\n                slice$1(copy.querySelectorAll('tfoot')).forEach(function (tfoot) {\n                    tfoot.parentNode.appendChild(tfoot);\n                });\n                slice$1(copy.querySelectorAll('ol')).forEach(function (ol) {\n                    slice$1(ol.children).forEach(function (li, index) {\n                        li.setAttribute('kendo-split-index', index);\n                    });\n                });\n                setCSS(container, {\n                    display: 'block',\n                    position: 'absolute',\n                    boxSizing: 'content-box',\n                    left: '-10000px',\n                    top: '-10000px'\n                });\n                if (pageWidth) {\n                    setCSS(container, {\n                        width: pageWidth + 'px',\n                        paddingLeft: margin.left + 'px',\n                        paddingRight: margin.right + 'px'\n                    });\n                    setCSS(copy, { overflow: 'hidden' });\n                }\n                element.parentNode.insertBefore(container, element);\n                container.appendChild(copy);\n                if (options.beforePageBreak) {\n                    setTimeout(function () {\n                        options.beforePageBreak(container, doPageBreak);\n                    }, 15);\n                } else {\n                    setTimeout(doPageBreak, 15);\n                }\n                function doPageBreak() {\n                    if (forceBreak != '-' || pageHeight) {\n                        splitElement(copy);\n                    }\n                    {\n                        var page = makePage();\n                        copy.parentNode.insertBefore(page, copy);\n                        page.appendChild(copy);\n                    }\n                    if (template$$1) {\n                        pages.forEach(function (page, i) {\n                            var el = template$$1({\n                                element: page,\n                                pageNum: i + 1,\n                                totalPages: pages.length\n                            });\n                            if (el) {\n                                page.appendChild(el);\n                            }\n                        });\n                    }\n                    cacheImages(pages, function () {\n                        whenImagesAreActuallyLoaded(pages, function () {\n                            callback({\n                                pages: pages,\n                                container: container\n                            });\n                        });\n                    });\n                }\n                function keepTogether(el) {\n                    if (options.keepTogether && matches(el, options.keepTogether) && el.offsetHeight <= pageHeight - adjust) {\n                        return true;\n                    }\n                    var tag = el.tagName;\n                    if (/^h[1-6]$/i.test(tag) && el.offsetHeight >= pageHeight - adjust) {\n                        return false;\n                    }\n                    return el.getAttribute('data-kendo-chart') || /^(?:img|tr|thead|th|tfoot|iframe|svg|object|canvas|input|textarea|select|video|h[1-6])/i.test(el.tagName);\n                }\n                function splitElement(element) {\n                    if (element.tagName == 'TABLE') {\n                        setCSS(element, { tableLayout: 'fixed' });\n                    }\n                    if (keepTogether(element)) {\n                        return;\n                    }\n                    var style = getComputedStyle(element);\n                    var bottomPadding = parseFloat(getPropertyValue(style, 'padding-bottom'));\n                    var bottomBorder = parseFloat(getPropertyValue(style, 'border-bottom-width'));\n                    var saveAdjust = adjust;\n                    adjust += bottomPadding + bottomBorder;\n                    var isFirst = true;\n                    for (var el = element.firstChild; el; el = el.nextSibling) {\n                        if (el.nodeType == 1) {\n                            isFirst = false;\n                            if (matches(el, forceBreak)) {\n                                breakAtElement(el);\n                                continue;\n                            }\n                            if (!pageHeight) {\n                                splitElement(el);\n                                continue;\n                            }\n                            if (!/^(?:static|relative)$/.test(getPropertyValue(getComputedStyle(el), 'position'))) {\n                                continue;\n                            }\n                            var fall = fallsOnMargin(el);\n                            if (fall == 1) {\n                                breakAtElement(el);\n                            } else if (fall) {\n                                if (keepTogether(el)) {\n                                    breakAtElement(el);\n                                } else {\n                                    splitElement(el);\n                                }\n                            } else {\n                                splitElement(el);\n                            }\n                        } else if (el.nodeType == 3 && pageHeight) {\n                            splitText(el, isFirst);\n                            isFirst = false;\n                        }\n                    }\n                    adjust = saveAdjust;\n                }\n                function firstInParent(el) {\n                    var p = el.parentNode, first = p.firstChild;\n                    if (el === first) {\n                        return true;\n                    }\n                    if (el === p.children[0]) {\n                        if (first.nodeType == 7 || first.nodeType == 8) {\n                            return true;\n                        }\n                        if (first.nodeType == 3) {\n                            return !/\\S/.test(first.data);\n                        }\n                    }\n                    return false;\n                }\n                function breakAtElement(el) {\n                    if (el.nodeType == 1 && el !== copy && firstInParent(el)) {\n                        return breakAtElement(el.parentNode);\n                    }\n                    var table, colgroup, thead, grid, gridHead;\n                    table = closest(el, 'table');\n                    colgroup = table && table.querySelector('colgroup');\n                    if (options.repeatHeaders) {\n                        thead = table && table.querySelector('thead');\n                        grid = closest(el, '.k-grid.k-widget');\n                        if (grid && grid.querySelector('.k-auto-scrollable')) {\n                            gridHead = grid.querySelector('.k-grid-header');\n                        }\n                    }\n                    var page = makePage();\n                    var range = doc.createRange();\n                    range.setStartBefore(copy);\n                    range.setEndBefore(el);\n                    page.appendChild(range.extractContents());\n                    copy.parentNode.insertBefore(page, copy);\n                    preventBulletOnListItem(el.parentNode);\n                    if (table) {\n                        table = closest(el, 'table');\n                        if (options.repeatHeaders && thead) {\n                            table.insertBefore(thead.cloneNode(true), table.firstChild);\n                        }\n                        if (colgroup) {\n                            table.insertBefore(colgroup.cloneNode(true), table.firstChild);\n                        }\n                    }\n                    if (options.repeatHeaders && gridHead) {\n                        grid = closest(el, '.k-grid.k-widget');\n                        grid.insertBefore(gridHead.cloneNode(true), grid.firstChild);\n                    }\n                }\n                function makePage() {\n                    var page = doc.createElement('KENDO-PDF-PAGE');\n                    setCSS(page, {\n                        display: 'block',\n                        boxSizing: 'content-box',\n                        width: pageWidth ? pageWidth + 'px' : 'auto',\n                        padding: margin.top + 'px ' + margin.right + 'px ' + margin.bottom + 'px ' + margin.left + 'px',\n                        position: 'relative',\n                        height: pageHeight ? pageHeight + 'px' : 'auto',\n                        overflow: pageHeight || pageWidth ? 'hidden' : 'visible',\n                        clear: 'both'\n                    });\n                    if (options && options.pageClassName) {\n                        page.className = options.pageClassName;\n                    }\n                    pages.push(page);\n                    return page;\n                }\n                function fallsOnMargin(thing) {\n                    var box = thing.getBoundingClientRect();\n                    if (box.width === 0 || box.height === 0) {\n                        return 0;\n                    }\n                    var top = copy.getBoundingClientRect().top;\n                    var available = pageHeight - adjust;\n                    return box.height > available ? 3 : box.top - top > available ? 1 : box.bottom - top > available ? 2 : 0;\n                }\n                function splitText(node, isFirst) {\n                    if (!/\\S/.test(node.data)) {\n                        return;\n                    }\n                    var len = node.data.length;\n                    var range = doc.createRange();\n                    range.selectNodeContents(node);\n                    var fall = fallsOnMargin(range);\n                    if (!fall) {\n                        return;\n                    }\n                    var nextnode = node;\n                    if (fall == 1) {\n                        if (isFirst) {\n                            breakAtElement(node.parentNode);\n                        } else {\n                            breakAtElement(node);\n                        }\n                    } else {\n                        (function findEOP(min, pos, max) {\n                            range.setEnd(node, pos);\n                            if (min == pos || pos == max) {\n                                return pos;\n                            }\n                            if (fallsOnMargin(range)) {\n                                return findEOP(min, min + pos >> 1, pos);\n                            } else {\n                                return findEOP(pos, pos + max >> 1, max);\n                            }\n                        }(0, len >> 1, len));\n                        if (!/\\S/.test(range.toString()) && isFirst) {\n                            breakAtElement(node.parentNode);\n                        } else {\n                            nextnode = node.splitText(range.endOffset);\n                            var page = makePage();\n                            range.setStartBefore(copy);\n                            page.appendChild(range.extractContents());\n                            copy.parentNode.insertBefore(page, copy);\n                            preventBulletOnListItem(nextnode.parentNode);\n                        }\n                    }\n                    splitText(nextnode);\n                }\n                function preventBulletOnListItem(el) {\n                    var li = closest(el, 'li');\n                    if (li) {\n                        li.setAttribute('kendo-no-bullet', '1');\n                        preventBulletOnListItem(li.parentNode);\n                    }\n                }\n            }\n            return promise;\n        }\n        drawDOM.getFontFaces = getFontFaces;\n        drawDOM.drawText = function (element) {\n            var group = new Group();\n            nodeInfo._clipbox = false;\n            nodeInfo._matrix = Matrix.unit();\n            nodeInfo._stackingContext = {\n                element: element,\n                group: group\n            };\n            pushNodeInfo(element, getComputedStyle(element), group);\n            if (element.firstChild.nodeType == 3) {\n                renderText(element, element.firstChild, group);\n            } else {\n                _renderElement(element, group);\n            }\n            popNodeInfo();\n            return group;\n        };\n        var parseBackgroundImage = function () {\n            var tok_linear_gradient = /^((-webkit-|-moz-|-o-|-ms-)?linear-gradient\\s*)\\(/;\n            var tok_percent = /^([-0-9.]+%)/;\n            var tok_length = /^([-0-9.]+px)/;\n            var tok_keyword = /^(left|right|top|bottom|to|center)\\W/;\n            var tok_angle = /^([-0-9.]+(deg|grad|rad|turn))/;\n            var tok_whitespace = /^(\\s+)/;\n            var tok_popen = /^(\\()/;\n            var tok_pclose = /^(\\))/;\n            var tok_comma = /^(,)/;\n            var tok_url = /^(url)\\(/;\n            var tok_content = /^(.*?)\\)/;\n            var cache1 = {}, cache2 = {};\n            function parse(input) {\n                var orig = input;\n                if (hasOwnProperty(cache1, orig)) {\n                    return cache1[orig];\n                }\n                function skip_ws() {\n                    var m = tok_whitespace.exec(input);\n                    if (m) {\n                        input = input.substr(m[1].length);\n                    }\n                }\n                function read(token) {\n                    skip_ws();\n                    var m = token.exec(input);\n                    if (m) {\n                        input = input.substr(m[1].length);\n                        return m[1];\n                    }\n                }\n                function read_stop() {\n                    var color = kendo.parseColor(input, true);\n                    var length, percent;\n                    if (color) {\n                        var match = /^#[0-9a-f]+/i.exec(input) || /^rgba?\\(.*?\\)/i.exec(input) || /^..*?\\b/.exec(input);\n                        input = input.substr(match[0].length);\n                        color = color.toRGB();\n                        if (!(length = read(tok_length))) {\n                            percent = read(tok_percent);\n                        }\n                        return {\n                            color: color,\n                            length: length,\n                            percent: percent\n                        };\n                    }\n                }\n                function read_linear_gradient(propName) {\n                    var angle;\n                    var to1, to2;\n                    var stops = [];\n                    var reverse = false;\n                    if (read(tok_popen)) {\n                        angle = read(tok_angle);\n                        if (angle) {\n                            angle = parseAngle(angle);\n                            read(tok_comma);\n                        } else {\n                            to1 = read(tok_keyword);\n                            if (to1 == 'to') {\n                                to1 = read(tok_keyword);\n                            } else if (to1 && /^-/.test(propName)) {\n                                reverse = true;\n                            }\n                            to2 = read(tok_keyword);\n                            read(tok_comma);\n                        }\n                        if (/-moz-/.test(propName) && angle == null && to1 == null) {\n                            var x = read(tok_percent), y = read(tok_percent);\n                            reverse = true;\n                            if (x == '0%') {\n                                to1 = 'left';\n                            } else if (x == '100%') {\n                                to1 = 'right';\n                            }\n                            if (y == '0%') {\n                                to2 = 'top';\n                            } else if (y == '100%') {\n                                to2 = 'bottom';\n                            }\n                            read(tok_comma);\n                        }\n                        while (input && !read(tok_pclose)) {\n                            var stop = read_stop();\n                            if (!stop) {\n                                break;\n                            }\n                            stops.push(stop);\n                            read(tok_comma);\n                        }\n                        return {\n                            type: 'linear',\n                            angle: angle,\n                            to: to1 && to2 ? to1 + ' ' + to2 : to1 ? to1 : to2 ? to2 : null,\n                            stops: stops,\n                            reverse: reverse\n                        };\n                    }\n                }\n                function read_url() {\n                    if (read(tok_popen)) {\n                        var url = read(tok_content);\n                        url = url.replace(/^['\"]+|[\"']+$/g, '');\n                        read(tok_pclose);\n                        return {\n                            type: 'url',\n                            url: url\n                        };\n                    }\n                }\n                var tok;\n                if (tok = read(tok_linear_gradient)) {\n                    tok = read_linear_gradient(tok);\n                } else if (tok = read(tok_url)) {\n                    tok = read_url();\n                }\n                return cache1[orig] = tok || { type: 'none' };\n            }\n            return function (input) {\n                if (hasOwnProperty(cache2, input)) {\n                    return cache2[input];\n                }\n                return cache2[input] = splitProperty(input).map(parse);\n            };\n        }();\n        var splitProperty = function () {\n            var cache = {};\n            return function (input, separator) {\n                if (!separator) {\n                    separator = /^\\s*,\\s*/;\n                }\n                var cacheKey = input + separator;\n                if (hasOwnProperty(cache, cacheKey)) {\n                    return cache[cacheKey];\n                }\n                var ret = [];\n                var last$$1 = 0, pos = 0;\n                var in_paren = 0;\n                var in_string = false;\n                var m;\n                function looking_at(rx) {\n                    return m = rx.exec(input.substr(pos));\n                }\n                function trim(str) {\n                    return str.replace(/^\\s+|\\s+$/g, '');\n                }\n                while (pos < input.length) {\n                    if (!in_string && looking_at(/^[\\(\\[\\{]/)) {\n                        in_paren++;\n                        pos++;\n                    } else if (!in_string && looking_at(/^[\\)\\]\\}]/)) {\n                        in_paren--;\n                        pos++;\n                    } else if (!in_string && looking_at(/^[\\\"\\']/)) {\n                        in_string = m[0];\n                        pos++;\n                    } else if (in_string == '\\'' && looking_at(/^\\\\\\'/)) {\n                        pos += 2;\n                    } else if (in_string == '\"' && looking_at(/^\\\\\\\"/)) {\n                        pos += 2;\n                    } else if (in_string == '\\'' && looking_at(/^\\'/)) {\n                        in_string = false;\n                        pos++;\n                    } else if (in_string == '\"' && looking_at(/^\\\"/)) {\n                        in_string = false;\n                        pos++;\n                    } else if (looking_at(separator)) {\n                        if (!in_string && !in_paren && pos > last$$1) {\n                            ret.push(trim(input.substring(last$$1, pos)));\n                            last$$1 = pos + m[0].length;\n                        }\n                        pos += m[0].length;\n                    } else {\n                        pos++;\n                    }\n                }\n                if (last$$1 < pos) {\n                    ret.push(trim(input.substring(last$$1, pos)));\n                }\n                return cache[cacheKey] = ret;\n            };\n        }();\n        var getFontURL = function (cache) {\n            return function (el) {\n                var url = cache[el];\n                if (!url) {\n                    var m;\n                    if (m = /url\\((['\"]?)([^'\")]*?)\\1\\)\\s+format\\((['\"]?)truetype\\3\\)/.exec(el)) {\n                        url = cache[el] = m[2];\n                    } else if (m = /url\\((['\"]?)([^'\")]*?\\.ttf)\\1\\)/.exec(el)) {\n                        url = cache[el] = m[2];\n                    }\n                }\n                return url;\n            };\n        }(Object.create ? Object.create(null) : {});\n        var getFontHeight = function (cache) {\n            return function (font) {\n                var height = cache[font];\n                if (height == null) {\n                    height = cache[font] = kendoUtil.measureText('Mapq', { font: font }).height;\n                }\n                return height;\n            };\n        }(Object.create ? Object.create(null) : {});\n        function getFontFaces(doc) {\n            if (doc == null) {\n                doc = document;\n            }\n            var result = {};\n            for (var i = 0; i < doc.styleSheets.length; ++i) {\n                doStylesheet(doc.styleSheets[i]);\n            }\n            return result;\n            function doStylesheet(ss) {\n                if (ss) {\n                    var rules = null;\n                    try {\n                        rules = ss.cssRules;\n                    } catch (ex) {\n                    }\n                    if (rules) {\n                        addRules(ss, rules);\n                    }\n                }\n            }\n            function findFonts(rule) {\n                var src = getPropertyValue(rule.style, 'src');\n                if (src) {\n                    return splitProperty(src).reduce(function (a, el) {\n                        var font = getFontURL(el);\n                        if (font) {\n                            a.push(font);\n                        }\n                        return a;\n                    }, []);\n                } else {\n                    var font = getFontURL(rule.cssText);\n                    return font ? [font] : [];\n                }\n            }\n            function addRules(styleSheet, rules) {\n                for (var i = 0; i < rules.length; ++i) {\n                    var r = rules[i];\n                    switch (r.type) {\n                    case 3:\n                        doStylesheet(r.styleSheet);\n                        break;\n                    case 5:\n                        var style = r.style;\n                        var family = splitProperty(getPropertyValue(style, 'font-family'));\n                        var bold = /^([56789]00|bold)$/i.test(getPropertyValue(style, 'font-weight'));\n                        var italic = 'italic' == getPropertyValue(style, 'font-style');\n                        var src = findFonts(r);\n                        if (src.length > 0) {\n                            addRule(styleSheet, family, bold, italic, src[0]);\n                        }\n                    }\n                }\n            }\n            function addRule(styleSheet, names, bold, italic, url) {\n                if (!/^data:/i.test(url)) {\n                    if (!(/^[^\\/:]+:\\/\\//.test(url) || /^\\//.test(url))) {\n                        url = String(styleSheet.href).replace(/[^\\/]*$/, '') + url;\n                    }\n                }\n                names.forEach(function (name) {\n                    name = name.replace(/^(['\"]?)(.*?)\\1$/, '$2');\n                    if (bold) {\n                        name += '|bold';\n                    }\n                    if (italic) {\n                        name += '|italic';\n                    }\n                    result[name] = url;\n                });\n            }\n        }\n        function hasOwnProperty(obj, key) {\n            return Object.prototype.hasOwnProperty.call(obj, key);\n        }\n        function getCounter(name) {\n            name = '_counter_' + name;\n            return nodeInfo[name];\n        }\n        function getAllCounters(name) {\n            var values = [], p = nodeInfo;\n            name = '_counter_' + name;\n            while (p) {\n                if (hasOwnProperty(p, name)) {\n                    values.push(p[name]);\n                }\n                p = Object.getPrototypeOf(p);\n            }\n            return values.reverse();\n        }\n        function incCounter(name, inc) {\n            var p = nodeInfo;\n            name = '_counter_' + name;\n            while (p && !hasOwnProperty(p, name)) {\n                p = Object.getPrototypeOf(p);\n            }\n            if (!p) {\n                p = nodeInfo._root;\n            }\n            p[name] = (p[name] || 0) + (inc == null ? 1 : inc);\n        }\n        function resetCounter(name, val) {\n            name = '_counter_' + name;\n            nodeInfo[name] = val == null ? 0 : val;\n        }\n        function doCounters(a, f, def) {\n            for (var i = 0; i < a.length;) {\n                var name = a[i++];\n                var val = parseFloat(a[i]);\n                if (isNaN(val)) {\n                    f(name, def);\n                } else {\n                    f(name, val);\n                    ++i;\n                }\n            }\n        }\n        function updateCounters(style) {\n            var counterReset = getPropertyValue(style, 'counter-reset');\n            if (counterReset) {\n                doCounters(splitProperty(counterReset, /^\\s+/), resetCounter, 0);\n            }\n            var counterIncrement = getPropertyValue(style, 'counter-increment');\n            if (counterIncrement) {\n                doCounters(splitProperty(counterIncrement, /^\\s+/), incCounter, 1);\n            }\n        }\n        function parseColor$1(str, css) {\n            var color = kendo.parseColor(str, true);\n            if (color) {\n                color = color.toRGB();\n                if (css) {\n                    color = color.toCssRgba();\n                } else if (color.a === 0) {\n                    color = null;\n                }\n            }\n            return color;\n        }\n        function whenImagesAreActuallyLoaded(elements, callback) {\n            var pending = 0;\n            elements.forEach(function (el) {\n                var images = el.querySelectorAll('img');\n                for (var i = 0; i < images.length; ++i) {\n                    var img = images[i];\n                    if (!img.complete) {\n                        pending++;\n                        img.onload = img.onerror = next;\n                    }\n                }\n            });\n            if (!pending) {\n                next();\n            }\n            function next() {\n                if (--pending <= 0) {\n                    callback();\n                }\n            }\n        }\n        function cacheImages(element, callback) {\n            var urls = [];\n            function add(url) {\n                if (!IMAGE_CACHE[url]) {\n                    IMAGE_CACHE[url] = true;\n                    urls.push(url);\n                }\n            }\n            function dive(element) {\n                if (/^img$/i.test(element.tagName)) {\n                    add(element.src);\n                }\n                parseBackgroundImage(getPropertyValue(getComputedStyle(element), 'background-image')).forEach(function (bg) {\n                    if (bg.type == 'url') {\n                        add(bg.url);\n                    }\n                });\n                if (element.children) {\n                    slice$1(element.children).forEach(dive);\n                }\n            }\n            if (Array.isArray(element)) {\n                element.forEach(dive);\n            } else {\n                dive(element);\n            }\n            var count = urls.length;\n            function next() {\n                if (--count <= 0) {\n                    callback();\n                }\n            }\n            if (count === 0) {\n                next();\n            }\n            urls.forEach(function (url) {\n                var img = IMAGE_CACHE[url] = new window.Image();\n                if (!/^data:/i.test(url)) {\n                    img.crossOrigin = 'Anonymous';\n                }\n                img.src = url;\n                if (img.complete) {\n                    next();\n                } else {\n                    img.onload = next;\n                    img.onerror = function () {\n                        IMAGE_CACHE[url] = null;\n                        next();\n                    };\n                }\n            });\n        }\n        function alphaNumeral(n) {\n            var result = '';\n            do {\n                var r = n % 26;\n                result = String.fromCharCode(97 + r) + result;\n                n = Math.floor(n / 26);\n            } while (n > 0);\n            return result;\n        }\n        function pushNodeInfo(element, style, group) {\n            nodeInfo = Object.create(nodeInfo);\n            nodeInfo[element.tagName.toLowerCase()] = {\n                element: element,\n                style: style\n            };\n            var decoration = getPropertyValue(style, 'text-decoration');\n            if (decoration && decoration != 'none') {\n                var color = getPropertyValue(style, 'color');\n                decoration.split(/\\s+/g).forEach(function (name) {\n                    if (!nodeInfo[name]) {\n                        nodeInfo[name] = color;\n                    }\n                });\n            }\n            if (createsStackingContext(style)) {\n                nodeInfo._stackingContext = {\n                    element: element,\n                    group: group\n                };\n            }\n        }\n        function popNodeInfo() {\n            nodeInfo = Object.getPrototypeOf(nodeInfo);\n        }\n        function updateClipbox(path) {\n            if (nodeInfo._clipbox != null) {\n                var box = path.bbox(nodeInfo._matrix);\n                if (nodeInfo._clipbox) {\n                    nodeInfo._clipbox = Rect.intersect(nodeInfo._clipbox, box);\n                } else {\n                    nodeInfo._clipbox = box;\n                }\n            }\n        }\n        function emptyClipbox() {\n            var cb = nodeInfo._clipbox;\n            if (cb == null) {\n                return true;\n            }\n            if (cb) {\n                return cb.width() === 0 || cb.height() === 0;\n            }\n        }\n        function createsStackingContext(style) {\n            function prop(name) {\n                return getPropertyValue(style, name);\n            }\n            if (prop('transform') != 'none' || prop('position') != 'static' || prop('z-index') != 'auto' || prop('opacity') < 1) {\n                return true;\n            }\n        }\n        function getComputedStyle(element, pseudoElt) {\n            return window.getComputedStyle(element, pseudoElt || null);\n        }\n        function getPropertyValue(style, prop, defa) {\n            var val = style.getPropertyValue(prop);\n            if (val == null || val === '') {\n                if (browser.webkit) {\n                    val = style.getPropertyValue('-webkit-' + prop);\n                } else if (browser.mozilla) {\n                    val = style.getPropertyValue('-moz-' + prop);\n                } else if (browser.opera) {\n                    val = style.getPropertyValue('-o-' + prop);\n                } else if (microsoft) {\n                    val = style.getPropertyValue('-ms-' + prop);\n                }\n            }\n            if (arguments.length > 2 && (val == null || val === '')) {\n                return defa;\n            } else {\n                return val;\n            }\n        }\n        function pleaseSetPropertyValue(style, prop, value, important) {\n            style.setProperty(prop, value, important);\n            if (browser.webkit) {\n                style.setProperty('-webkit-' + prop, value, important);\n            } else if (browser.mozilla) {\n                style.setProperty('-moz-' + prop, value, important);\n            } else if (browser.opera) {\n                style.setProperty('-o-' + prop, value, important);\n            } else if (microsoft) {\n                style.setProperty('-ms-' + prop, value, important);\n                prop = 'ms' + prop.replace(/(^|-)([a-z])/g, function (s, p1, p2) {\n                    return p1 + p2.toUpperCase();\n                });\n                style[prop] = value;\n            }\n        }\n        function getBorder(style, side) {\n            side = 'border-' + side;\n            return {\n                width: parseFloat(getPropertyValue(style, side + '-width')),\n                style: getPropertyValue(style, side + '-style'),\n                color: parseColor$1(getPropertyValue(style, side + '-color'), true)\n            };\n        }\n        function saveStyle(element, func) {\n            var prev = element.style.cssText;\n            var result = func();\n            element.style.cssText = prev;\n            return result;\n        }\n        function getBorderRadius(style, side) {\n            var r = getPropertyValue(style, 'border-' + side + '-radius').split(/\\s+/g).map(parseFloat);\n            if (r.length == 1) {\n                r.push(r[0]);\n            }\n            return sanitizeRadius({\n                x: r[0],\n                y: r[1]\n            });\n        }\n        function getContentBox(element) {\n            var box = element.getBoundingClientRect();\n            box = innerBox(box, 'border-*-width', element);\n            box = innerBox(box, 'padding-*', element);\n            return box;\n        }\n        function innerBox(box, prop, element) {\n            var style, wt, wr, wb, wl;\n            if (typeof prop == 'string') {\n                style = getComputedStyle(element);\n                wt = parseFloat(getPropertyValue(style, prop.replace('*', 'top')));\n                wr = parseFloat(getPropertyValue(style, prop.replace('*', 'right')));\n                wb = parseFloat(getPropertyValue(style, prop.replace('*', 'bottom')));\n                wl = parseFloat(getPropertyValue(style, prop.replace('*', 'left')));\n            } else if (typeof prop == 'number') {\n                wt = wr = wb = wl = prop;\n            }\n            return {\n                top: box.top + wt,\n                right: box.right - wr,\n                bottom: box.bottom - wb,\n                left: box.left + wl,\n                width: box.right - box.left - wr - wl,\n                height: box.bottom - box.top - wb - wt\n            };\n        }\n        function getTransform(style) {\n            var transform$$1 = getPropertyValue(style, 'transform');\n            if (transform$$1 == 'none') {\n                return null;\n            }\n            var matrix = /^\\s*matrix\\(\\s*(.*?)\\s*\\)\\s*$/.exec(transform$$1);\n            if (matrix) {\n                var origin = getPropertyValue(style, 'transform-origin');\n                matrix = matrix[1].split(/\\s*,\\s*/g).map(parseFloat);\n                origin = origin.split(/\\s+/g).map(parseFloat);\n                return {\n                    matrix: matrix,\n                    origin: origin\n                };\n            }\n        }\n        function radiansToDegrees(radians) {\n            return 180 * radians / Math.PI % 360;\n        }\n        function parseAngle(angle) {\n            var num = parseFloat(angle);\n            if (/grad$/.test(angle)) {\n                return Math.PI * num / 200;\n            } else if (/rad$/.test(angle)) {\n                return num;\n            } else if (/turn$/.test(angle)) {\n                return Math.PI * num * 2;\n            } else if (/deg$/.test(angle)) {\n                return Math.PI * num / 180;\n            }\n        }\n        function setTransform(shape, m) {\n            m = new Matrix(m[0], m[1], m[2], m[3], m[4], m[5]);\n            shape.transform(m);\n            return m;\n        }\n        function setClipping(shape, clipPath) {\n            shape.clip(clipPath);\n        }\n        function addArcToPath(path, x, y, options) {\n            var points = new Arc$2([\n                    x,\n                    y\n                ], options).curvePoints(), i = 1;\n            while (i < points.length) {\n                path.curveTo(points[i++], points[i++], points[i++]);\n            }\n        }\n        function sanitizeRadius(r) {\n            if (r.x <= 0 || r.y <= 0) {\n                r.x = r.y = 0;\n            }\n            return r;\n        }\n        function adjustBorderRadiusForBox(box, rTL, rTR, rBR, rBL) {\n            var tl_x = Math.max(0, rTL.x), tl_y = Math.max(0, rTL.y);\n            var tr_x = Math.max(0, rTR.x), tr_y = Math.max(0, rTR.y);\n            var br_x = Math.max(0, rBR.x), br_y = Math.max(0, rBR.y);\n            var bl_x = Math.max(0, rBL.x), bl_y = Math.max(0, rBL.y);\n            var f = Math.min(box.width / (tl_x + tr_x), box.height / (tr_y + br_y), box.width / (br_x + bl_x), box.height / (bl_y + tl_y));\n            if (f < 1) {\n                tl_x *= f;\n                tl_y *= f;\n                tr_x *= f;\n                tr_y *= f;\n                br_x *= f;\n                br_y *= f;\n                bl_x *= f;\n                bl_y *= f;\n            }\n            return {\n                tl: {\n                    x: tl_x,\n                    y: tl_y\n                },\n                tr: {\n                    x: tr_x,\n                    y: tr_y\n                },\n                br: {\n                    x: br_x,\n                    y: br_y\n                },\n                bl: {\n                    x: bl_x,\n                    y: bl_y\n                }\n            };\n        }\n        function elementRoundBox(element, box, type) {\n            var style = getComputedStyle(element);\n            var rTL = getBorderRadius(style, 'top-left');\n            var rTR = getBorderRadius(style, 'top-right');\n            var rBL = getBorderRadius(style, 'bottom-left');\n            var rBR = getBorderRadius(style, 'bottom-right');\n            if (type == 'padding' || type == 'content') {\n                var bt = getBorder(style, 'top');\n                var br = getBorder(style, 'right');\n                var bb = getBorder(style, 'bottom');\n                var bl = getBorder(style, 'left');\n                rTL.x -= bl.width;\n                rTL.y -= bt.width;\n                rTR.x -= br.width;\n                rTR.y -= bt.width;\n                rBR.x -= br.width;\n                rBR.y -= bb.width;\n                rBL.x -= bl.width;\n                rBL.y -= bb.width;\n                if (type == 'content') {\n                    var pt = parseFloat(getPropertyValue(style, 'padding-top'));\n                    var pr = parseFloat(getPropertyValue(style, 'padding-right'));\n                    var pb = parseFloat(getPropertyValue(style, 'padding-bottom'));\n                    var pl = parseFloat(getPropertyValue(style, 'padding-left'));\n                    rTL.x -= pl;\n                    rTL.y -= pt;\n                    rTR.x -= pr;\n                    rTR.y -= pt;\n                    rBR.x -= pr;\n                    rBR.y -= pb;\n                    rBL.x -= pl;\n                    rBL.y -= pb;\n                }\n            }\n            if (typeof type == 'number') {\n                rTL.x -= type;\n                rTL.y -= type;\n                rTR.x -= type;\n                rTR.y -= type;\n                rBR.x -= type;\n                rBR.y -= type;\n                rBL.x -= type;\n                rBL.y -= type;\n            }\n            return roundBox(box, rTL, rTR, rBR, rBL);\n        }\n        function roundBox(box, rTL0, rTR0, rBR0, rBL0) {\n            var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\n            var rTL = tmp.tl;\n            var rTR = tmp.tr;\n            var rBR = tmp.br;\n            var rBL = tmp.bl;\n            var path = new Path({\n                fill: null,\n                stroke: null\n            });\n            path.moveTo(box.left, box.top + rTL.y);\n            if (rTL.x) {\n                addArcToPath(path, box.left + rTL.x, box.top + rTL.y, {\n                    startAngle: -180,\n                    endAngle: -90,\n                    radiusX: rTL.x,\n                    radiusY: rTL.y\n                });\n            }\n            path.lineTo(box.right - rTR.x, box.top);\n            if (rTR.x) {\n                addArcToPath(path, box.right - rTR.x, box.top + rTR.y, {\n                    startAngle: -90,\n                    endAngle: 0,\n                    radiusX: rTR.x,\n                    radiusY: rTR.y\n                });\n            }\n            path.lineTo(box.right, box.bottom - rBR.y);\n            if (rBR.x) {\n                addArcToPath(path, box.right - rBR.x, box.bottom - rBR.y, {\n                    startAngle: 0,\n                    endAngle: 90,\n                    radiusX: rBR.x,\n                    radiusY: rBR.y\n                });\n            }\n            path.lineTo(box.left + rBL.x, box.bottom);\n            if (rBL.x) {\n                addArcToPath(path, box.left + rBL.x, box.bottom - rBL.y, {\n                    startAngle: 90,\n                    endAngle: 180,\n                    radiusX: rBL.x,\n                    radiusY: rBL.y\n                });\n            }\n            return path.close();\n        }\n        function formatCounter(val, style) {\n            var str = String(parseFloat(val));\n            switch (style) {\n            case 'decimal-leading-zero':\n                if (str.length < 2) {\n                    str = '0' + str;\n                }\n                return str;\n            case 'lower-roman':\n                return arabicToRoman(val).toLowerCase();\n            case 'upper-roman':\n                return arabicToRoman(val).toUpperCase();\n            case 'lower-latin':\n            case 'lower-alpha':\n                return alphaNumeral(val - 1);\n            case 'upper-latin':\n            case 'upper-alpha':\n                return alphaNumeral(val - 1).toUpperCase();\n            default:\n                return str;\n            }\n        }\n        function evalPseudoElementContent(element, content) {\n            function displayCounter(name, style, separator) {\n                if (!separator) {\n                    return formatCounter(getCounter(name) || 0, style);\n                }\n                separator = separator.replace(/^\\s*([\"'])(.*)\\1\\s*$/, '$2');\n                return getAllCounters(name).map(function (val) {\n                    return formatCounter(val, style);\n                }).join(separator);\n            }\n            var a = splitProperty(content, /^\\s+/);\n            var result = [], m;\n            a.forEach(function (el) {\n                var tmp;\n                if (m = /^\\s*([\"'])(.*)\\1\\s*$/.exec(el)) {\n                    result.push(m[2].replace(/\\\\([0-9a-f]{4})/gi, function (s, p) {\n                        return String.fromCharCode(parseInt(p, 16));\n                    }));\n                } else if (m = /^\\s*counter\\((.*?)\\)\\s*$/.exec(el)) {\n                    tmp = splitProperty(m[1]);\n                    result.push(displayCounter(tmp[0], tmp[1]));\n                } else if (m = /^\\s*counters\\((.*?)\\)\\s*$/.exec(el)) {\n                    tmp = splitProperty(m[1]);\n                    result.push(displayCounter(tmp[0], tmp[2], tmp[1]));\n                } else if (m = /^\\s*attr\\((.*?)\\)\\s*$/.exec(el)) {\n                    result.push(element.getAttribute(m[1]) || '');\n                } else {\n                    result.push(el);\n                }\n            });\n            return result.join('');\n        }\n        function getCssText(style) {\n            if (style.cssText) {\n                return style.cssText;\n            }\n            var result = [];\n            for (var i = 0; i < style.length; ++i) {\n                result.push(style[i] + ': ' + getPropertyValue(style, style[i]));\n            }\n            return result.join(';\\n');\n        }\n        function _renderWithPseudoElements(element, group) {\n            if (element.tagName == KENDO_PSEUDO_ELEMENT) {\n                _renderElement(element, group);\n                return;\n            }\n            var fake = [];\n            function pseudo(kind, place) {\n                var style = getComputedStyle(element, kind), content = style.content;\n                updateCounters(style);\n                if (content && content != 'normal' && content != 'none' && style.width != '0px') {\n                    var psel = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\n                    psel.style.cssText = getCssText(style);\n                    psel.textContent = evalPseudoElementContent(element, content);\n                    element.insertBefore(psel, place);\n                    fake.push(psel);\n                }\n            }\n            pseudo(':before', element.firstChild);\n            pseudo(':after', null);\n            if (fake.length > 0) {\n                var saveClass = element.className;\n                element.className += ' kendo-pdf-hide-pseudo-elements';\n                _renderElement(element, group);\n                element.className = saveClass;\n                fake.forEach(function (el) {\n                    element.removeChild(el);\n                });\n            } else {\n                _renderElement(element, group);\n            }\n        }\n        function _renderElement(element, group) {\n            var style = getComputedStyle(element);\n            var top = getBorder(style, 'top');\n            var right = getBorder(style, 'right');\n            var bottom = getBorder(style, 'bottom');\n            var left = getBorder(style, 'left');\n            var rTL0 = getBorderRadius(style, 'top-left');\n            var rTR0 = getBorderRadius(style, 'top-right');\n            var rBL0 = getBorderRadius(style, 'bottom-left');\n            var rBR0 = getBorderRadius(style, 'bottom-right');\n            var dir = getPropertyValue(style, 'direction');\n            var backgroundColor = getPropertyValue(style, 'background-color');\n            backgroundColor = parseColor$1(backgroundColor);\n            var backgroundImage = parseBackgroundImage(getPropertyValue(style, 'background-image'));\n            var backgroundRepeat = splitProperty(getPropertyValue(style, 'background-repeat'));\n            var backgroundPosition = splitProperty(getPropertyValue(style, 'background-position'));\n            var backgroundOrigin = splitProperty(getPropertyValue(style, 'background-origin'));\n            var backgroundSize = splitProperty(getPropertyValue(style, 'background-size'));\n            var textOverflow, saveTextOverflow;\n            if (microsoft) {\n                textOverflow = style.textOverflow;\n                if (textOverflow == 'ellipsis') {\n                    saveTextOverflow = element.style.textOverflow;\n                    element.style.textOverflow = 'clip';\n                }\n            }\n            if (browser.msie && browser.version < 10) {\n                backgroundPosition = splitProperty(element.currentStyle.backgroundPosition);\n            }\n            var innerbox = innerBox(element.getBoundingClientRect(), 'border-*-width', element);\n            (function () {\n                var clip = getPropertyValue(style, 'clip');\n                var m = /^\\s*rect\\((.*)\\)\\s*$/.exec(clip);\n                if (m) {\n                    var a = m[1].split(/[ ,]+/g);\n                    var top = a[0] == 'auto' ? innerbox.top : parseFloat(a[0]) + innerbox.top;\n                    var right = a[1] == 'auto' ? innerbox.right : parseFloat(a[1]) + innerbox.left;\n                    var bottom = a[2] == 'auto' ? innerbox.bottom : parseFloat(a[2]) + innerbox.top;\n                    var left = a[3] == 'auto' ? innerbox.left : parseFloat(a[3]) + innerbox.left;\n                    var tmp = new Group();\n                    var clipPath = new Path().moveTo(left, top).lineTo(right, top).lineTo(right, bottom).lineTo(left, bottom).close();\n                    setClipping(tmp, clipPath);\n                    group.append(tmp);\n                    group = tmp;\n                    updateClipbox(clipPath);\n                }\n            }());\n            var boxes, i, cells;\n            var display = getPropertyValue(style, 'display');\n            if (display == 'table-row') {\n                boxes = [];\n                for (i = 0, cells = element.children; i < cells.length; ++i) {\n                    boxes.push(cells[i].getBoundingClientRect());\n                }\n            } else {\n                boxes = element.getClientRects();\n                if (boxes.length == 1) {\n                    boxes = [element.getBoundingClientRect()];\n                }\n            }\n            boxes = adjustBoxes(boxes);\n            for (i = 0; i < boxes.length; ++i) {\n                drawOneBox(boxes[i], i === 0, i == boxes.length - 1);\n            }\n            if (element.tagName == 'A' && element.href && !/^#?$/.test(element.getAttribute('href'))) {\n                if (!nodeInfo._avoidLinks || !matches(element, nodeInfo._avoidLinks)) {\n                    var r = document.createRange();\n                    r.selectNodeContents(element);\n                    slice$1(r.getClientRects()).forEach(function (box) {\n                        var g = new Group();\n                        g._pdfLink = {\n                            url: element.href,\n                            top: box.top,\n                            right: box.right,\n                            bottom: box.bottom,\n                            left: box.left\n                        };\n                        group.append(g);\n                    });\n                }\n            }\n            if (boxes.length > 0 && display == 'list-item' && !element.getAttribute('kendo-no-bullet')) {\n                drawBullet(boxes[0]);\n            }\n            (function () {\n                function clipit() {\n                    var clipPath = elementRoundBox(element, innerbox, 'padding');\n                    var tmp = new Group();\n                    setClipping(tmp, clipPath);\n                    group.append(tmp);\n                    group = tmp;\n                    updateClipbox(clipPath);\n                }\n                if (isFormField(element)) {\n                    clipit();\n                } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, 'overflow'))) {\n                    clipit();\n                } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, 'overflow-x'))) {\n                    clipit();\n                } else if (/^(hidden|auto|scroll)/.test(getPropertyValue(style, 'overflow-y'))) {\n                    clipit();\n                }\n            }());\n            if (!maybeRenderWidget(element, group)) {\n                renderContents(element, group);\n            }\n            if (microsoft && textOverflow == 'ellipsis') {\n                element.style.textOverflow = saveTextOverflow;\n            }\n            return group;\n            function adjustBoxes(boxes) {\n                if (/^td$/i.test(element.tagName)) {\n                    var table = nodeInfo.table;\n                    if (table && getPropertyValue(table.style, 'border-collapse') == 'collapse') {\n                        var tableBorderLeft = getBorder(table.style, 'left').width;\n                        var tableBorderTop = getBorder(table.style, 'top').width;\n                        if (tableBorderLeft === 0 && tableBorderTop === 0) {\n                            return boxes;\n                        }\n                        var tableBox = table.element.getBoundingClientRect();\n                        var firstCell = table.element.rows[0].cells[0];\n                        var firstCellBox = firstCell.getBoundingClientRect();\n                        if (firstCellBox.top == tableBox.top || firstCellBox.left == tableBox.left) {\n                            return slice$1(boxes).map(function (box) {\n                                return {\n                                    left: box.left + tableBorderLeft,\n                                    top: box.top + tableBorderTop,\n                                    right: box.right + tableBorderLeft,\n                                    bottom: box.bottom + tableBorderTop,\n                                    height: box.height,\n                                    width: box.width\n                                };\n                            });\n                        }\n                    }\n                }\n                return boxes;\n            }\n            function drawEdge(color, len, Wtop, Wleft, Wright, rl, rr, transform$$1) {\n                if (Wtop <= 0) {\n                    return;\n                }\n                var path, edge = new Group();\n                setTransform(edge, transform$$1);\n                group.append(edge);\n                sanitizeRadius(rl);\n                sanitizeRadius(rr);\n                path = new Path({\n                    fill: { color: color },\n                    stroke: null\n                });\n                edge.append(path);\n                path.moveTo(rl.x ? Math.max(rl.x, Wleft) : 0, 0).lineTo(len - (rr.x ? Math.max(rr.x, Wright) : 0), 0).lineTo(len - Math.max(rr.x, Wright), Wtop).lineTo(Math.max(rl.x, Wleft), Wtop).close();\n                if (rl.x) {\n                    drawRoundCorner(Wleft, rl, [\n                        -1,\n                        0,\n                        0,\n                        1,\n                        rl.x,\n                        0\n                    ]);\n                }\n                if (rr.x) {\n                    drawRoundCorner(Wright, rr, [\n                        1,\n                        0,\n                        0,\n                        1,\n                        len - rr.x,\n                        0\n                    ]);\n                }\n                function drawRoundCorner(Wright, r, transform$$1) {\n                    var angle = Math.PI / 2 * Wright / (Wright + Wtop);\n                    var ri = {\n                        x: r.x - Wright,\n                        y: r.y - Wtop\n                    };\n                    var path = new Path({\n                        fill: { color: color },\n                        stroke: null\n                    }).moveTo(0, 0);\n                    setTransform(path, transform$$1);\n                    addArcToPath(path, 0, r.y, {\n                        startAngle: -90,\n                        endAngle: -radiansToDegrees(angle),\n                        radiusX: r.x,\n                        radiusY: r.y\n                    });\n                    if (ri.x > 0 && ri.y > 0) {\n                        path.lineTo(ri.x * Math.cos(angle), r.y - ri.y * Math.sin(angle));\n                        addArcToPath(path, 0, r.y, {\n                            startAngle: -radiansToDegrees(angle),\n                            endAngle: -90,\n                            radiusX: ri.x,\n                            radiusY: ri.y,\n                            anticlockwise: true\n                        });\n                    } else if (ri.x > 0) {\n                        path.lineTo(ri.x, Wtop).lineTo(0, Wtop);\n                    } else {\n                        path.lineTo(ri.x, Wtop).lineTo(ri.x, 0);\n                    }\n                    edge.append(path.close());\n                }\n            }\n            function drawBackground(box) {\n                var background = new Group();\n                setClipping(background, roundBox(box, rTL0, rTR0, rBR0, rBL0));\n                group.append(background);\n                if (backgroundColor) {\n                    var path = new Path({\n                        fill: { color: backgroundColor.toCssRgba() },\n                        stroke: null\n                    });\n                    path.moveTo(box.left, box.top).lineTo(box.right, box.top).lineTo(box.right, box.bottom).lineTo(box.left, box.bottom).close();\n                    background.append(path);\n                }\n                for (var i = backgroundImage.length; --i >= 0;) {\n                    drawOneBackground(background, box, backgroundImage[i], backgroundRepeat[i % backgroundRepeat.length], backgroundPosition[i % backgroundPosition.length], backgroundOrigin[i % backgroundOrigin.length], backgroundSize[i % backgroundSize.length]);\n                }\n            }\n            function drawOneBackground(group, box, background, backgroundRepeat, backgroundPosition, backgroundOrigin, backgroundSize) {\n                if (!background || background == 'none') {\n                    return;\n                }\n                if (background.type == 'url') {\n                    if (/^url\\(\\\"data:image\\/svg/i.test(background.url)) {\n                        return;\n                    }\n                    var img = IMAGE_CACHE[background.url];\n                    if (img && img.width > 0 && img.height > 0) {\n                        drawBackgroundImage(group, box, img.width, img.height, function (group, rect) {\n                            group.append(new Image$1(background.url, rect));\n                        });\n                    }\n                } else if (background.type == 'linear') {\n                    drawBackgroundImage(group, box, box.width, box.height, gradientRenderer(background));\n                } else {\n                    return;\n                }\n                function drawBackgroundImage(group, box, img_width, img_height, renderBG) {\n                    var aspect_ratio = img_width / img_height, f;\n                    var orgBox = box;\n                    if (backgroundOrigin == 'content-box') {\n                        orgBox = innerBox(orgBox, 'border-*-width', element);\n                        orgBox = innerBox(orgBox, 'padding-*', element);\n                    } else if (backgroundOrigin == 'padding-box') {\n                        orgBox = innerBox(orgBox, 'border-*-width', element);\n                    }\n                    if (!/^\\s*auto(\\s+auto)?\\s*$/.test(backgroundSize)) {\n                        if (backgroundSize == 'contain') {\n                            f = Math.min(orgBox.width / img_width, orgBox.height / img_height);\n                            img_width *= f;\n                            img_height *= f;\n                        } else if (backgroundSize == 'cover') {\n                            f = Math.max(orgBox.width / img_width, orgBox.height / img_height);\n                            img_width *= f;\n                            img_height *= f;\n                        } else {\n                            var size = backgroundSize.split(/\\s+/g);\n                            if (/%$/.test(size[0])) {\n                                img_width = orgBox.width * parseFloat(size[0]) / 100;\n                            } else {\n                                img_width = parseFloat(size[0]);\n                            }\n                            if (size.length == 1 || size[1] == 'auto') {\n                                img_height = img_width / aspect_ratio;\n                            } else if (/%$/.test(size[1])) {\n                                img_height = orgBox.height * parseFloat(size[1]) / 100;\n                            } else {\n                                img_height = parseFloat(size[1]);\n                            }\n                        }\n                    }\n                    var pos = String(backgroundPosition);\n                    switch (pos) {\n                    case 'bottom':\n                        pos = '50% 100%';\n                        break;\n                    case 'top':\n                        pos = '50% 0';\n                        break;\n                    case 'left':\n                        pos = '0 50%';\n                        break;\n                    case 'right':\n                        pos = '100% 50%';\n                        break;\n                    case 'center':\n                        pos = '50% 50%';\n                        break;\n                    }\n                    pos = pos.split(/\\s+/);\n                    if (pos.length == 1) {\n                        pos[1] = '50%';\n                    }\n                    if (/%$/.test(pos[0])) {\n                        pos[0] = parseFloat(pos[0]) / 100 * (orgBox.width - img_width);\n                    } else {\n                        pos[0] = parseFloat(pos[0]);\n                    }\n                    if (/%$/.test(pos[1])) {\n                        pos[1] = parseFloat(pos[1]) / 100 * (orgBox.height - img_height);\n                    } else {\n                        pos[1] = parseFloat(pos[1]);\n                    }\n                    var rect = new Rect([\n                        orgBox.left + pos[0],\n                        orgBox.top + pos[1]\n                    ], [\n                        img_width,\n                        img_height\n                    ]);\n                    function rewX() {\n                        while (rect.origin.x > box.left) {\n                            rect.origin.x -= img_width;\n                        }\n                    }\n                    function rewY() {\n                        while (rect.origin.y > box.top) {\n                            rect.origin.y -= img_height;\n                        }\n                    }\n                    function repeatX() {\n                        while (rect.origin.x < box.right) {\n                            renderBG(group, rect.clone());\n                            rect.origin.x += img_width;\n                        }\n                    }\n                    if (backgroundRepeat == 'no-repeat') {\n                        renderBG(group, rect);\n                    } else if (backgroundRepeat == 'repeat-x') {\n                        rewX();\n                        repeatX();\n                    } else if (backgroundRepeat == 'repeat-y') {\n                        rewY();\n                        while (rect.origin.y < box.bottom) {\n                            renderBG(group, rect.clone());\n                            rect.origin.y += img_height;\n                        }\n                    } else if (backgroundRepeat == 'repeat') {\n                        rewX();\n                        rewY();\n                        var origin = rect.origin.clone();\n                        while (rect.origin.y < box.bottom) {\n                            rect.origin.x = origin.x;\n                            repeatX();\n                            rect.origin.y += img_height;\n                        }\n                    }\n                }\n            }\n            function drawBullet() {\n                var listStyleType = getPropertyValue(style, 'list-style-type');\n                if (listStyleType == 'none') {\n                    return;\n                }\n                var listStylePosition = getPropertyValue(style, 'list-style-position');\n                function _drawBullet(f) {\n                    saveStyle(element, function () {\n                        element.style.position = 'relative';\n                        var bullet = element.ownerDocument.createElement(KENDO_PSEUDO_ELEMENT);\n                        bullet.style.position = 'absolute';\n                        bullet.style.boxSizing = 'border-box';\n                        if (listStylePosition == 'outside') {\n                            bullet.style.width = '6em';\n                            bullet.style.left = '-6.8em';\n                            bullet.style.textAlign = 'right';\n                        } else {\n                            bullet.style.left = '0px';\n                        }\n                        f(bullet);\n                        element.insertBefore(bullet, element.firstChild);\n                        renderElement(bullet, group);\n                        element.removeChild(bullet);\n                    });\n                }\n                function elementIndex(f) {\n                    var a = element.parentNode.children;\n                    var k = element.getAttribute('kendo-split-index');\n                    if (k != null) {\n                        return f(k | 0, a.length);\n                    }\n                    for (var i = 0; i < a.length; ++i) {\n                        if (a[i] === element) {\n                            return f(i, a.length);\n                        }\n                    }\n                }\n                switch (listStyleType) {\n                case 'circle':\n                case 'disc':\n                case 'square':\n                    _drawBullet(function (bullet) {\n                        bullet.style.fontSize = '60%';\n                        bullet.style.lineHeight = '200%';\n                        bullet.style.paddingRight = '0.5em';\n                        bullet.style.fontFamily = 'DejaVu Serif';\n                        bullet.innerHTML = {\n                            'disc': '\\u25CF',\n                            'circle': '\\u25EF',\n                            'square': '\\u25A0'\n                        }[listStyleType];\n                    });\n                    break;\n                case 'decimal':\n                case 'decimal-leading-zero':\n                    _drawBullet(function (bullet) {\n                        elementIndex(function (idx) {\n                            ++idx;\n                            if (listStyleType == 'decimal-leading-zero' && idx < 10) {\n                                idx = '0' + idx;\n                            }\n                            bullet.innerHTML = idx + '.';\n                        });\n                    });\n                    break;\n                case 'lower-roman':\n                case 'upper-roman':\n                    _drawBullet(function (bullet) {\n                        elementIndex(function (idx) {\n                            idx = arabicToRoman(idx + 1);\n                            if (listStyleType == 'upper-roman') {\n                                idx = idx.toUpperCase();\n                            }\n                            bullet.innerHTML = idx + '.';\n                        });\n                    });\n                    break;\n                case 'lower-latin':\n                case 'lower-alpha':\n                case 'upper-latin':\n                case 'upper-alpha':\n                    _drawBullet(function (bullet) {\n                        elementIndex(function (idx) {\n                            idx = alphaNumeral(idx);\n                            if (/^upper/i.test(listStyleType)) {\n                                idx = idx.toUpperCase();\n                            }\n                            bullet.innerHTML = idx + '.';\n                        });\n                    });\n                    break;\n                }\n            }\n            function drawOneBox(box, isFirst, isLast) {\n                if (box.width === 0 || box.height === 0) {\n                    return;\n                }\n                drawBackground(box);\n                var shouldDrawLeft = left.width > 0 && (isFirst && dir == 'ltr' || isLast && dir == 'rtl');\n                var shouldDrawRight = right.width > 0 && (isLast && dir == 'ltr' || isFirst && dir == 'rtl');\n                if (top.width === 0 && left.width === 0 && right.width === 0 && bottom.width === 0) {\n                    return;\n                }\n                if (top.color == right.color && top.color == bottom.color && top.color == left.color) {\n                    if (top.width == right.width && top.width == bottom.width && top.width == left.width) {\n                        if (shouldDrawLeft && shouldDrawRight) {\n                            box = innerBox(box, top.width / 2);\n                            var path = elementRoundBox(element, box, top.width / 2);\n                            path.options.stroke = {\n                                color: top.color,\n                                width: top.width\n                            };\n                            group.append(path);\n                            return;\n                        }\n                    }\n                }\n                if (rTL0.x === 0 && rTR0.x === 0 && rBR0.x === 0 && rBL0.x === 0) {\n                    if (top.width < 2 && left.width < 2 && right.width < 2 && bottom.width < 2) {\n                        if (top.width > 0) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: top.width,\n                                    color: top.color\n                                }\n                            }).moveTo(box.left, box.top + top.width / 2).lineTo(box.right, box.top + top.width / 2));\n                        }\n                        if (bottom.width > 0) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: bottom.width,\n                                    color: bottom.color\n                                }\n                            }).moveTo(box.left, box.bottom - bottom.width / 2).lineTo(box.right, box.bottom - bottom.width / 2));\n                        }\n                        if (shouldDrawLeft) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: left.width,\n                                    color: left.color\n                                }\n                            }).moveTo(box.left + left.width / 2, box.top).lineTo(box.left + left.width / 2, box.bottom));\n                        }\n                        if (shouldDrawRight) {\n                            group.append(new Path({\n                                stroke: {\n                                    width: right.width,\n                                    color: right.color\n                                }\n                            }).moveTo(box.right - right.width / 2, box.top).lineTo(box.right - right.width / 2, box.bottom));\n                        }\n                        return;\n                    }\n                }\n                var tmp = adjustBorderRadiusForBox(box, rTL0, rTR0, rBR0, rBL0);\n                var rTL = tmp.tl;\n                var rTR = tmp.tr;\n                var rBR = tmp.br;\n                var rBL = tmp.bl;\n                drawEdge(top.color, box.width, top.width, left.width, right.width, rTL, rTR, [\n                    1,\n                    0,\n                    0,\n                    1,\n                    box.left,\n                    box.top\n                ]);\n                drawEdge(bottom.color, box.width, bottom.width, right.width, left.width, rBR, rBL, [\n                    -1,\n                    0,\n                    0,\n                    -1,\n                    box.right,\n                    box.bottom\n                ]);\n                function inv(p) {\n                    return {\n                        x: p.y,\n                        y: p.x\n                    };\n                }\n                drawEdge(left.color, box.height, left.width, bottom.width, top.width, inv(rBL), inv(rTL), [\n                    0,\n                    -1,\n                    1,\n                    0,\n                    box.left,\n                    box.bottom\n                ]);\n                drawEdge(right.color, box.height, right.width, top.width, bottom.width, inv(rTR), inv(rBR), [\n                    0,\n                    1,\n                    -1,\n                    0,\n                    box.right,\n                    box.top\n                ]);\n            }\n        }\n        function gradientRenderer(gradient) {\n            return function (group, rect) {\n                var width = rect.width(), height = rect.height();\n                switch (gradient.type) {\n                case 'linear':\n                    var angle = gradient.angle != null ? gradient.angle : Math.PI;\n                    switch (gradient.to) {\n                    case 'top':\n                        angle = 0;\n                        break;\n                    case 'left':\n                        angle = -Math.PI / 2;\n                        break;\n                    case 'bottom':\n                        angle = Math.PI;\n                        break;\n                    case 'right':\n                        angle = Math.PI / 2;\n                        break;\n                    case 'top left':\n                    case 'left top':\n                        angle = -Math.atan2(height, width);\n                        break;\n                    case 'top right':\n                    case 'right top':\n                        angle = Math.atan2(height, width);\n                        break;\n                    case 'bottom left':\n                    case 'left bottom':\n                        angle = Math.PI + Math.atan2(height, width);\n                        break;\n                    case 'bottom right':\n                    case 'right bottom':\n                        angle = Math.PI - Math.atan2(height, width);\n                        break;\n                    }\n                    if (gradient.reverse) {\n                        angle -= Math.PI;\n                    }\n                    angle %= 2 * Math.PI;\n                    if (angle < 0) {\n                        angle += 2 * Math.PI;\n                    }\n                    var pxlen = Math.abs(width * Math.sin(angle)) + Math.abs(height * Math.cos(angle));\n                    var scaledAngle = Math.atan(width * Math.tan(angle) / height);\n                    var sin = Math.sin(scaledAngle), cos = Math.cos(scaledAngle);\n                    var len = Math.abs(sin) + Math.abs(cos);\n                    var x = len / 2 * sin;\n                    var y = len / 2 * cos;\n                    if (angle > Math.PI / 2 && angle <= 3 * Math.PI / 2) {\n                        x = -x;\n                        y = -y;\n                    }\n                    var implicit = [], right = 0;\n                    var stops = gradient.stops.map(function (s, i) {\n                        var offset = s.percent;\n                        if (offset) {\n                            offset = parseFloat(offset) / 100;\n                        } else if (s.length) {\n                            offset = parseFloat(s.length) / pxlen;\n                        } else if (i === 0) {\n                            offset = 0;\n                        } else if (i == gradient.stops.length - 1) {\n                            offset = 1;\n                        }\n                        var stop = {\n                            color: s.color.toCssRgba(),\n                            offset: offset\n                        };\n                        if (offset != null) {\n                            right = offset;\n                            implicit.forEach(function (s, i) {\n                                var stop = s.stop;\n                                stop.offset = s.left + (right - s.left) * (i + 1) / (implicit.length + 1);\n                            });\n                            implicit = [];\n                        } else {\n                            implicit.push({\n                                left: right,\n                                stop: stop\n                            });\n                        }\n                        return stop;\n                    });\n                    var start = [\n                        0.5 - x,\n                        0.5 + y\n                    ];\n                    var end = [\n                        0.5 + x,\n                        0.5 - y\n                    ];\n                    group.append(Path.fromRect(rect).stroke(null).fill(new LinearGradient({\n                        start: start,\n                        end: end,\n                        stops: stops,\n                        userSpace: false\n                    })));\n                    break;\n                case 'radial':\n                    if (window.console && window.console.log) {\n                        window.console.log('Radial gradients are not yet supported in HTML renderer');\n                    }\n                    break;\n                }\n            };\n        }\n        function maybeRenderWidget(element, group) {\n            var visual;\n            if (element._kendoExportVisual) {\n                visual = element._kendoExportVisual();\n            } else if (window.kendo && window.kendo.jQuery && element.getAttribute(window.kendo.attr('role'))) {\n                var widget = window.kendo.widgetInstance(window.kendo.jQuery(element));\n                if (widget && (widget.exportDOMVisual || widget.exportVisual)) {\n                    if (widget.exportDOMVisual) {\n                        visual = widget.exportDOMVisual();\n                    } else {\n                        visual = widget.exportVisual();\n                    }\n                }\n            }\n            if (!visual) {\n                return false;\n            }\n            var wrap$$1 = new Group();\n            wrap$$1.children.push(visual);\n            var bbox = element.getBoundingClientRect();\n            wrap$$1.transform(transform().translate(bbox.left, bbox.top));\n            group.append(wrap$$1);\n            return true;\n        }\n        function renderImage(element, url, group) {\n            var box = getContentBox(element);\n            var rect = new Rect([\n                box.left,\n                box.top\n            ], [\n                box.width,\n                box.height\n            ]);\n            var image = new Image$1(url, rect);\n            setClipping(image, elementRoundBox(element, box, 'content'));\n            group.append(image);\n        }\n        function zIndexSort(a, b) {\n            var sa = getComputedStyle(a);\n            var sb = getComputedStyle(b);\n            var za = parseFloat(getPropertyValue(sa, 'z-index'));\n            var zb = parseFloat(getPropertyValue(sb, 'z-index'));\n            var pa = getPropertyValue(sa, 'position');\n            var pb = getPropertyValue(sb, 'position');\n            if (isNaN(za) && isNaN(zb)) {\n                if (/static|absolute/.test(pa) && /static|absolute/.test(pb)) {\n                    return 0;\n                }\n                if (pa == 'static') {\n                    return -1;\n                }\n                if (pb == 'static') {\n                    return 1;\n                }\n                return 0;\n            }\n            if (isNaN(za)) {\n                return zb === 0 ? 0 : zb > 0 ? -1 : 1;\n            }\n            if (isNaN(zb)) {\n                return za === 0 ? 0 : za > 0 ? 1 : -1;\n            }\n            return parseFloat(za) - parseFloat(zb);\n        }\n        function isFormField(element) {\n            return /^(?:textarea|select|input)$/i.test(element.tagName);\n        }\n        function getSelectedOption(element) {\n            if (element.selectedOptions && element.selectedOptions.length > 0) {\n                return element.selectedOptions[0];\n            }\n            return element.options[element.selectedIndex];\n        }\n        function renderCheckbox(element, group) {\n            var style = getComputedStyle(element);\n            var color = getPropertyValue(style, 'color');\n            var box = element.getBoundingClientRect();\n            if (element.type == 'checkbox') {\n                group.append(Path.fromRect(new Rect([\n                    box.left + 1,\n                    box.top + 1\n                ], [\n                    box.width - 2,\n                    box.height - 2\n                ])).stroke(color, 1));\n                if (element.checked) {\n                    group.append(new Path().stroke(color, 1.2).moveTo(box.left + 0.22 * box.width, box.top + 0.55 * box.height).lineTo(box.left + 0.45 * box.width, box.top + 0.75 * box.height).lineTo(box.left + 0.78 * box.width, box.top + 0.22 * box.width));\n                }\n            } else {\n                group.append(new Circle(new Circle$2([\n                    (box.left + box.right) / 2,\n                    (box.top + box.bottom) / 2\n                ], Math.min(box.width - 2, box.height - 2) / 2)).stroke(color, 1));\n                if (element.checked) {\n                    group.append(new Circle(new Circle$2([\n                        (box.left + box.right) / 2,\n                        (box.top + box.bottom) / 2\n                    ], Math.min(box.width - 8, box.height - 8) / 2)).fill(color).stroke(null));\n                }\n            }\n        }\n        function renderFormField(element, group) {\n            var tag = element.tagName.toLowerCase();\n            if (tag == 'input' && (element.type == 'checkbox' || element.type == 'radio')) {\n                return renderCheckbox(element, group);\n            }\n            var p = element.parentNode;\n            var doc = element.ownerDocument;\n            var el = doc.createElement(KENDO_PSEUDO_ELEMENT);\n            var option;\n            el.style.cssText = getCssText(getComputedStyle(element));\n            if (tag == 'input') {\n                el.style.whiteSpace = 'pre';\n            }\n            if (tag == 'select' || tag == 'textarea') {\n                el.style.overflow = 'auto';\n            }\n            if (tag == 'select') {\n                if (element.multiple) {\n                    for (var i = 0; i < element.options.length; ++i) {\n                        option = doc.createElement(KENDO_PSEUDO_ELEMENT);\n                        option.style.cssText = getCssText(getComputedStyle(element.options[i]));\n                        option.style.display = 'block';\n                        option.textContent = element.options[i].textContent;\n                        el.appendChild(option);\n                    }\n                } else {\n                    option = getSelectedOption(element);\n                    if (option) {\n                        el.textContent = option.textContent;\n                    }\n                }\n            } else {\n                el.textContent = element.value;\n            }\n            p.insertBefore(el, element);\n            el.scrollLeft = element.scrollLeft;\n            el.scrollTop = element.scrollTop;\n            element.style.display = 'none';\n            renderContents(el, group);\n            element.style.display = '';\n            p.removeChild(el);\n        }\n        function renderContents(element, group) {\n            if (nodeInfo._stackingContext.element === element) {\n                nodeInfo._stackingContext.group = group;\n            }\n            switch (element.tagName.toLowerCase()) {\n            case 'img':\n                renderImage(element, element.src, group);\n                break;\n            case 'canvas':\n                try {\n                    renderImage(element, element.toDataURL('image/png'), group);\n                } catch (ex) {\n                }\n                break;\n            case 'textarea':\n            case 'input':\n            case 'select':\n                renderFormField(element, group);\n                break;\n            default:\n                var children = [], floats = [], positioned = [];\n                for (var i = element.firstChild; i; i = i.nextSibling) {\n                    switch (i.nodeType) {\n                    case 3:\n                        if (/\\S/.test(i.data)) {\n                            renderText(element, i, group);\n                        }\n                        break;\n                    case 1:\n                        var style = getComputedStyle(i);\n                        var floating = getPropertyValue(style, 'float');\n                        var position = getPropertyValue(style, 'position');\n                        if (position != 'static') {\n                            positioned.push(i);\n                        } else if (floating != 'none') {\n                            floats.push(i);\n                        } else {\n                            children.push(i);\n                        }\n                        break;\n                    }\n                }\n                mergeSort(children, zIndexSort).forEach(function (el) {\n                    renderElement(el, group);\n                });\n                mergeSort(floats, zIndexSort).forEach(function (el) {\n                    renderElement(el, group);\n                });\n                mergeSort(positioned, zIndexSort).forEach(function (el) {\n                    renderElement(el, group);\n                });\n            }\n        }\n        function renderText(element, node, group) {\n            if (emptyClipbox()) {\n                return;\n            }\n            var style = getComputedStyle(element);\n            if (parseFloat(getPropertyValue(style, 'text-indent')) < -500) {\n                return;\n            }\n            var text = node.data;\n            var start = 0;\n            var end = text.search(/\\S\\s*$/) + 1;\n            if (!end) {\n                return;\n            }\n            var fontSize = getPropertyValue(style, 'font-size');\n            var lineHeight = getPropertyValue(style, 'line-height');\n            var font = [\n                getPropertyValue(style, 'font-style'),\n                getPropertyValue(style, 'font-variant'),\n                getPropertyValue(style, 'font-weight'),\n                fontSize,\n                getPropertyValue(style, 'font-family')\n            ].join(' ');\n            fontSize = parseFloat(fontSize);\n            lineHeight = parseFloat(lineHeight);\n            if (fontSize === 0) {\n                return;\n            }\n            var color = getPropertyValue(style, 'color');\n            var range = element.ownerDocument.createRange();\n            var align$$1 = getPropertyValue(style, 'text-align');\n            var isJustified = align$$1 == 'justify';\n            var columnCount = getPropertyValue(style, 'column-count', 1);\n            var whiteSpace = getPropertyValue(style, 'white-space');\n            var textTransform = getPropertyValue(style, 'text-transform');\n            var estimateLineLength = element.getBoundingClientRect().width / fontSize * 5;\n            if (estimateLineLength === 0) {\n                estimateLineLength = 500;\n            }\n            var prevLineBottom = null;\n            var underline = nodeInfo['underline'];\n            var lineThrough = nodeInfo['line-through'];\n            var overline = nodeInfo['overline'];\n            var hasDecoration = underline || lineThrough || overline;\n            while (!doChunk()) {\n            }\n            if (hasDecoration) {\n                range.selectNode(node);\n                slice$1(range.getClientRects()).forEach(decorate);\n            }\n            return;\n            function actuallyGetRangeBoundingRect(range) {\n                if (microsoft || browser.chrome) {\n                    var rectangles = range.getClientRects(), box = {\n                            top: Infinity,\n                            right: -Infinity,\n                            bottom: -Infinity,\n                            left: Infinity\n                        }, done = false;\n                    for (var i = 0; i < rectangles.length; ++i) {\n                        var b = rectangles[i];\n                        if (b.width <= 1 || b.bottom === prevLineBottom) {\n                            continue;\n                        }\n                        box.left = Math.min(b.left, box.left);\n                        box.top = Math.min(b.top, box.top);\n                        box.right = Math.max(b.right, box.right);\n                        box.bottom = Math.max(b.bottom, box.bottom);\n                        done = true;\n                    }\n                    if (!done) {\n                        return range.getBoundingClientRect();\n                    }\n                    box.width = box.right - box.left;\n                    box.height = box.bottom - box.top;\n                    return box;\n                }\n                return range.getBoundingClientRect();\n            }\n            function doChunk() {\n                var origStart = start;\n                var box, pos = text.substr(start).search(/\\S/);\n                start += pos;\n                if (pos < 0 || start >= end) {\n                    return true;\n                }\n                range.setStart(node, start);\n                range.setEnd(node, start + 1);\n                box = actuallyGetRangeBoundingRect(range);\n                var found = false;\n                if (isJustified || columnCount > 1) {\n                    pos = text.substr(start).search(/\\s/);\n                    if (pos >= 0) {\n                        range.setEnd(node, start + pos);\n                        var r = actuallyGetRangeBoundingRect(range);\n                        if (r.bottom == box.bottom) {\n                            box = r;\n                            found = true;\n                            start += pos;\n                        }\n                    }\n                }\n                if (!found) {\n                    pos = function findEOL(min, eol, max) {\n                        range.setEnd(node, eol);\n                        var r = actuallyGetRangeBoundingRect(range);\n                        if (r.bottom != box.bottom && min < eol) {\n                            return findEOL(min, min + eol >> 1, eol);\n                        } else if (r.right != box.right) {\n                            box = r;\n                            if (eol < max) {\n                                return findEOL(eol, eol + max >> 1, max);\n                            } else {\n                                return eol;\n                            }\n                        } else {\n                            return eol;\n                        }\n                    }(start, Math.min(end, start + estimateLineLength), end);\n                    if (pos == start) {\n                        return true;\n                    }\n                    start = pos;\n                    pos = range.toString().search(/\\s+$/);\n                    if (pos === 0) {\n                        return false;\n                    }\n                    if (pos > 0) {\n                        range.setEnd(node, range.startOffset + pos);\n                        box = actuallyGetRangeBoundingRect(range);\n                    }\n                }\n                if (microsoft) {\n                    box = range.getClientRects()[0];\n                }\n                var str = range.toString();\n                if (!/^(?:pre|pre-wrap)$/i.test(whiteSpace)) {\n                    str = str.replace(/\\s+/g, ' ');\n                } else if (/\\t/.test(str)) {\n                    var cc = 0;\n                    for (pos = origStart; pos < range.startOffset; ++pos) {\n                        var code = text.charCodeAt(pos);\n                        if (code == 9) {\n                            cc += 8 - cc % 8;\n                        } else if (code == 10 || code == 13) {\n                            cc = 0;\n                        } else {\n                            cc++;\n                        }\n                    }\n                    while ((pos = str.search('\\t')) >= 0) {\n                        var indent = '        '.substr(0, 8 - (cc + pos) % 8);\n                        str = str.substr(0, pos) + indent + str.substr(pos + 1);\n                    }\n                }\n                if (!found) {\n                    prevLineBottom = box.bottom;\n                }\n                drawText(str, box);\n            }\n            function drawText(str, box) {\n                if (microsoft && !isNaN(lineHeight)) {\n                    var height = getFontHeight(font);\n                    var top = (box.top + box.bottom - height) / 2;\n                    box = {\n                        top: top,\n                        right: box.right,\n                        bottom: top + height,\n                        left: box.left,\n                        height: height,\n                        width: box.right - box.left\n                    };\n                }\n                switch (textTransform) {\n                case 'uppercase':\n                    str = str.toUpperCase();\n                    break;\n                case 'lowercase':\n                    str = str.toLowerCase();\n                    break;\n                case 'capitalize':\n                    str = str.replace(/(?:^|\\s)\\S/g, function (l) {\n                        return l.toUpperCase();\n                    });\n                    break;\n                }\n                var text = new TextRect(str, new Rect([\n                    box.left,\n                    box.top\n                ], [\n                    box.width,\n                    box.height\n                ]), {\n                    font: font,\n                    fill: { color: color }\n                });\n                group.append(text);\n            }\n            function decorate(box) {\n                line(underline, box.bottom);\n                line(lineThrough, box.bottom - box.height / 2.7);\n                line(overline, box.top);\n                function line(color, ypos) {\n                    if (color) {\n                        var width = fontSize / 12;\n                        var path = new Path({\n                            stroke: {\n                                width: width,\n                                color: color\n                            }\n                        });\n                        ypos -= width;\n                        path.moveTo(box.left, ypos).lineTo(box.right, ypos);\n                        group.append(path);\n                    }\n                }\n            }\n        }\n        function groupInStackingContext(element, group, zIndex) {\n            var main;\n            if (zIndex != 'auto') {\n                main = nodeInfo._stackingContext.group;\n                zIndex = parseFloat(zIndex);\n            } else {\n                main = group;\n                zIndex = 0;\n            }\n            var a = main.children;\n            for (var i = 0; i < a.length; ++i) {\n                if (a[i]._dom_zIndex != null && a[i]._dom_zIndex > zIndex) {\n                    break;\n                }\n            }\n            var tmp = new Group();\n            main.insert(i, tmp);\n            tmp._dom_zIndex = zIndex;\n            if (main !== group) {\n                if (nodeInfo._clipbox) {\n                    var m = nodeInfo._matrix.invert();\n                    var r = nodeInfo._clipbox.transformCopy(m);\n                    setClipping(tmp, Path.fromRect(r));\n                }\n            }\n            return tmp;\n        }\n        function renderElement(element, container) {\n            var style = getComputedStyle(element);\n            updateCounters(style);\n            if (/^(style|script|link|meta|iframe|svg|col|colgroup)$/i.test(element.tagName)) {\n                return;\n            }\n            if (nodeInfo._clipbox == null) {\n                return;\n            }\n            var opacity = parseFloat(getPropertyValue(style, 'opacity'));\n            var visibility = getPropertyValue(style, 'visibility');\n            var display = getPropertyValue(style, 'display');\n            if (opacity === 0 || visibility == 'hidden' || display == 'none') {\n                return;\n            }\n            var tr = getTransform(style);\n            var group;\n            var zIndex = getPropertyValue(style, 'z-index');\n            if ((tr || opacity < 1) && zIndex == 'auto') {\n                zIndex = 0;\n            }\n            group = groupInStackingContext(element, container, zIndex);\n            if (opacity < 1) {\n                group.opacity(opacity * group.opacity());\n            }\n            pushNodeInfo(element, style, group);\n            if (!tr) {\n                _renderWithPseudoElements(element, group);\n            } else {\n                saveStyle(element, function () {\n                    pleaseSetPropertyValue(element.style, 'transform', 'none', 'important');\n                    pleaseSetPropertyValue(element.style, 'transition', 'none', 'important');\n                    if (getPropertyValue(style, 'position') == 'static') {\n                        pleaseSetPropertyValue(element.style, 'position', 'relative', 'important');\n                    }\n                    var bbox = element.getBoundingClientRect();\n                    var x = bbox.left + tr.origin[0];\n                    var y = bbox.top + tr.origin[1];\n                    var m = [\n                        1,\n                        0,\n                        0,\n                        1,\n                        -x,\n                        -y\n                    ];\n                    m = mmul(m, tr.matrix);\n                    m = mmul(m, [\n                        1,\n                        0,\n                        0,\n                        1,\n                        x,\n                        y\n                    ]);\n                    m = setTransform(group, m);\n                    nodeInfo._matrix = nodeInfo._matrix.multiplyCopy(m);\n                    _renderWithPseudoElements(element, group);\n                });\n            }\n            popNodeInfo();\n        }\n        function mmul(a, b) {\n            var a1 = a[0], b1 = a[1], c1 = a[2], d1 = a[3], e1 = a[4], f1 = a[5];\n            var a2 = b[0], b2 = b[1], c2 = b[2], d2 = b[3], e2 = b[4], f2 = b[5];\n            return [\n                a1 * a2 + b1 * c2,\n                a1 * b2 + b1 * d2,\n                c1 * a2 + d1 * c2,\n                c1 * b2 + d1 * d2,\n                e1 * a2 + f1 * c2 + e2,\n                e1 * b2 + f1 * d2 + f2\n            ];\n        }\n        var drawing = {\n            svg: svg,\n            canvas: canvas,\n            util: util,\n            PathParser: PathParser,\n            Surface: Surface,\n            BaseNode: BaseNode,\n            SurfaceFactory: SurfaceFactory,\n            OptionsStore: OptionsStore,\n            exportImage: exportImage,\n            exportSVG: exportSVG,\n            QuadNode: QuadNode,\n            ShapesQuadTree: ShapesQuadTree,\n            ObserversMixin: ObserversMixin,\n            Element: Element$1,\n            Circle: Circle,\n            Arc: Arc,\n            Path: Path,\n            MultiPath: MultiPath,\n            Text: Text,\n            Image: Image$1,\n            Group: Group,\n            Layout: Layout,\n            Rect: Rect$2,\n            align: align,\n            vAlign: vAlign,\n            stack: stack,\n            vStack: vStack,\n            wrap: wrap,\n            vWrap: vWrap,\n            fit: fit,\n            LinearGradient: LinearGradient,\n            RadialGradient: RadialGradient,\n            GradientStop: GradientStop,\n            Gradient: Gradient,\n            Animation: Animation,\n            AnimationFactory: AnimationFactory,\n            drawDOM: drawDOM\n        };\n        kendo.deepExtend(kendo, {\n            drawing: drawing,\n            geometry: geometry\n        });\n        kendo.drawing.Segment = kendo.geometry.Segment;\n        kendo.dataviz.drawing = kendo.drawing;\n        kendo.dataviz.geometry = kendo.geometry;\n        kendo.drawing.util.measureText = kendo.util.measureText;\n        kendo.drawing.util.objectKey = kendo.util.objectKey;\n        kendo.drawing.Color = kendo.Color;\n        kendo.util.encodeBase64 = kendo.drawing.util.encodeBase64;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/surface-tooltip', [\n        'kendo.popup',\n        'drawing/kendo-drawing'\n    ], f);\n}(function () {\n    (function ($) {\n        var NS = '.kendo';\n        var kendo = window.kendo;\n        var deepExtend = kendo.deepExtend;\n        var utils = kendo.drawing.util;\n        var defined = utils.defined;\n        var limitValue = utils.limitValue;\n        var eventCoordinates = utils.eventCoordinates;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var proxy = $.proxy;\n        var TOOLTIP_TEMPLATE = '<div class=\"k-tooltip\">' + '<div class=\"k-tooltip-content\"></div>' + '</div>';\n        var TOOLTIP_CLOSE_TEMPLATE = '<div class=\"k-tooltip-button\"><a href=\"\\\\#\" class=\"k-icon k-i-close\">close</a></div>';\n        var SurfaceTooltip = kendo.Class.extend({\n            init: function (surface, options) {\n                this.element = $(TOOLTIP_TEMPLATE);\n                this.content = this.element.children('.k-tooltip-content');\n                options = options || {};\n                this.options = deepExtend({}, this.options, this._tooltipOptions(options));\n                this.popupOptions = {\n                    appendTo: options.appendTo,\n                    animation: options.animation,\n                    copyAnchorStyles: false,\n                    collision: 'fit fit'\n                };\n                this._openPopupHandler = $.proxy(this._openPopup, this);\n                this.surface = surface;\n                this._bindEvents();\n            },\n            options: {\n                position: 'top',\n                showOn: 'mouseenter',\n                offset: 7,\n                autoHide: true,\n                hideDelay: 0,\n                showAfter: 100\n            },\n            _bindEvents: function () {\n                this._showHandler = proxy(this._showEvent, this);\n                this._surfaceLeaveHandler = proxy(this._surfaceLeave, this);\n                this._mouseleaveHandler = proxy(this._mouseleave, this);\n                this._mousemoveHandler = proxy(this._mousemove, this);\n                this.surface.bind('click', this._showHandler);\n                this.surface.bind('mouseenter', this._showHandler);\n                this.surface.bind('mouseleave', this._mouseleaveHandler);\n                this.surface.bind('mousemove', this._mousemoveHandler);\n                this.surface.element.on('mouseleave' + NS, this._surfaceLeaveHandler);\n                this.element.on('click' + NS, '.k-tooltip-button', proxy(this._hideClick, this));\n                this.element.on('mouseleave' + NS, proxy(this._tooltipLeave, this));\n            },\n            getPopup: function () {\n                if (!this.popup) {\n                    this.popup = new kendo.ui.Popup(this.element, this.popupOptions);\n                }\n                return this.popup;\n            },\n            destroy: function () {\n                var popup = this.popup;\n                this.surface.unbind('click', this._showHandler);\n                this.surface.unbind('mouseenter', this._showHandler);\n                this.surface.unbind('mouseleave', this._mouseleaveHandler);\n                this.surface.unbind('mousemove', this._mousemoveHandler);\n                this.surface.element.off('mouseleave' + NS, this._surfaceLeaveHandler);\n                this.element.off('click' + NS);\n                this.element.off('mouseleave' + NS);\n                if (popup) {\n                    popup.destroy();\n                    delete this.popup;\n                }\n                delete this.popupOptions;\n                clearTimeout(this._timeout);\n                delete this.element;\n                delete this.content;\n                delete this.surface;\n            },\n            _tooltipOptions: function (options) {\n                options = options || {};\n                return {\n                    position: options.position,\n                    showOn: options.showOn,\n                    offset: options.offset,\n                    autoHide: options.autoHide,\n                    width: options.width,\n                    height: options.height,\n                    content: options.content,\n                    shared: options.shared,\n                    hideDelay: options.hideDelay,\n                    showAfter: options.showAfter\n                };\n            },\n            _tooltipShape: function (shape) {\n                while (shape && !shape.options.tooltip) {\n                    shape = shape.parent;\n                }\n                return shape;\n            },\n            _updateContent: function (target, shape, options) {\n                var content = options.content;\n                if (kendo.isFunction(content)) {\n                    content = content({\n                        element: shape,\n                        target: target\n                    });\n                }\n                if (content) {\n                    this.content.html(content);\n                    return true;\n                }\n            },\n            _position: function (shape, options, elementSize, event) {\n                var position = options.position;\n                var tooltipOffset = options.offset || 0;\n                var surface = this.surface;\n                var offset = surface._instance._elementOffset();\n                var size = surface.getSize();\n                var surfaceOffset = surface._instance._offset;\n                var bbox = shape.bbox();\n                var width = elementSize.width;\n                var height = elementSize.height;\n                var left = 0, top = 0;\n                bbox.origin.translate(offset.left, offset.top);\n                if (surfaceOffset) {\n                    bbox.origin.translate(-surfaceOffset.x, -surfaceOffset.y);\n                }\n                if (position == 'cursor' && event) {\n                    var coord = eventCoordinates(event);\n                    left = coord.x - width / 2;\n                    top = coord.y - height - tooltipOffset;\n                } else if (position == 'left') {\n                    left = bbox.origin.x - width - tooltipOffset;\n                    top = bbox.center().y - height / 2;\n                } else if (position == 'right') {\n                    left = bbox.bottomRight().x + tooltipOffset;\n                    top = bbox.center().y - height / 2;\n                } else if (position == 'bottom') {\n                    left = bbox.center().x - width / 2;\n                    top = bbox.bottomRight().y + tooltipOffset;\n                } else {\n                    left = bbox.center().x - width / 2;\n                    top = bbox.origin.y - height - tooltipOffset;\n                }\n                return {\n                    left: limitValue(left, offset.left, offset.left + size.width),\n                    top: limitValue(top, offset.top, offset.top + size.height)\n                };\n            },\n            show: function (shape, options) {\n                this._show(shape, shape, deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip), options));\n            },\n            hide: function () {\n                var popup = this.popup;\n                var current = this._current;\n                delete this._current;\n                clearTimeout(this._showTimeout);\n                if (popup && popup.visible() && current && !this.surface.trigger('tooltipClose', {\n                        element: current.shape,\n                        target: current.target,\n                        popup: popup\n                    })) {\n                    popup.close();\n                }\n            },\n            _hideClick: function (e) {\n                e.preventDefault();\n                this.hide();\n            },\n            _show: function (target, shape, options, event, delay) {\n                var current = this._current;\n                clearTimeout(this._timeout);\n                if (current && (current.shape === shape && options.shared || current.target === target)) {\n                    return;\n                }\n                clearTimeout(this._showTimeout);\n                var popup = this.getPopup();\n                if (!this.surface.trigger('tooltipOpen', {\n                        element: shape,\n                        target: target,\n                        popup: popup\n                    }) && this._updateContent(target, shape, options)) {\n                    this._autoHide(options);\n                    var elementSize = this._measure(options);\n                    if (popup.visible()) {\n                        popup.close(true);\n                    }\n                    this._current = {\n                        options: options,\n                        elementSize: elementSize,\n                        shape: shape,\n                        target: target,\n                        position: this._position(options.shared ? shape : target, options, elementSize, event)\n                    };\n                    if (delay) {\n                        this._showTimeout = setTimeout(this._openPopupHandler, options.showAfter || 0);\n                    } else {\n                        this._openPopup();\n                    }\n                }\n            },\n            _openPopup: function () {\n                var current = this._current;\n                var position = current.position;\n                this.getPopup().open(position.left, position.top);\n            },\n            _autoHide: function (options) {\n                if (options.autoHide && this._closeButton) {\n                    this.element.removeClass('k-tooltip-closable');\n                    this._closeButton.remove();\n                    delete this._closeButton;\n                }\n                if (!options.autoHide && !this._closeButton) {\n                    this.element.addClass('k-tooltip-closable');\n                    this._closeButton = $(TOOLTIP_CLOSE_TEMPLATE).prependTo(this.element);\n                }\n            },\n            _showEvent: function (e) {\n                var shape = this._tooltipShape(e.element);\n                if (shape) {\n                    var options = deepExtend({}, this.options, this._tooltipOptions(shape.options.tooltip));\n                    if (options && options.showOn == e.type) {\n                        this._show(e.element, shape, options, e.originalEvent, true);\n                    }\n                }\n            },\n            _measure: function (options) {\n                var popup = this.getPopup();\n                var width, height;\n                this.element.css({\n                    width: 'auto',\n                    height: 'auto'\n                });\n                var visible = popup.visible();\n                if (!visible) {\n                    popup.wrapper.show();\n                }\n                this.element.css({\n                    width: defined(options.width) ? options.width : 'auto',\n                    height: defined(options.height) ? options.height : 'auto'\n                });\n                width = outerWidth(this.element);\n                height = outerHeight(this.element);\n                if (!visible) {\n                    popup.wrapper.hide();\n                }\n                return {\n                    width: width,\n                    height: height\n                };\n            },\n            _mouseleave: function (e) {\n                if (this.popup && !this._popupRelatedTarget(e.originalEvent)) {\n                    var tooltip = this;\n                    var current = tooltip._current;\n                    if (current && current.options.autoHide) {\n                        tooltip._timeout = setTimeout(function () {\n                            clearTimeout(tooltip._showTimeout);\n                            tooltip.hide();\n                        }, current.options.hideDelay || 0);\n                    }\n                }\n            },\n            _mousemove: function (e) {\n                var current = this._current;\n                if (current && e.element) {\n                    var options = current.options;\n                    if (options.position == 'cursor') {\n                        var position = this._position(e.element, options, current.elementSize, e.originalEvent);\n                        current.position = position;\n                        this.getPopup().wrapper.css({\n                            left: position.left,\n                            top: position.top\n                        });\n                    }\n                }\n            },\n            _surfaceLeave: function (e) {\n                if (this.popup && !this._popupRelatedTarget(e)) {\n                    clearTimeout(this._showTimeout);\n                    this.hide();\n                }\n            },\n            _popupRelatedTarget: function (e) {\n                return e.relatedTarget && $(e.relatedTarget).closest(this.popup.wrapper).length;\n            },\n            _tooltipLeave: function () {\n                var tooltip = this;\n                var current = tooltip._current;\n                if (current && current.options.autoHide) {\n                    tooltip._timeout = setTimeout(function () {\n                        tooltip.hide();\n                    }, current.options.hideDelay || 0);\n                }\n            }\n        });\n        kendo.drawing.SurfaceTooltip = SurfaceTooltip;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/surface', [\n        'drawing/kendo-drawing',\n        'drawing/surface-tooltip'\n    ], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var draw = kendo.drawing;\n        var DrawingSurface = draw.Surface;\n        var Widget = kendo.ui.Widget;\n        var deepExtend = kendo.deepExtend;\n        var proxy = $.proxy;\n        kendo.support.svg = DrawingSurface.support.svg;\n        kendo.support.canvas = DrawingSurface.support.canvas;\n        var Surface = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, {});\n                this.options = deepExtend({}, this.options, options);\n                this._instance = DrawingSurface.create(this.element[0], options);\n                if (this._instance.translate) {\n                    this.translate = translate;\n                }\n                this._triggerInstanceHandler = proxy(this._triggerInstanceEvent, this);\n                this._bindHandler('click');\n                this._bindHandler('mouseenter');\n                this._bindHandler('mouseleave');\n                this._bindHandler('mousemove');\n                this._enableTracking();\n            },\n            options: {\n                name: 'Surface',\n                tooltip: {}\n            },\n            events: [\n                'click',\n                'mouseenter',\n                'mouseleave',\n                'mousemove',\n                'resize',\n                'tooltipOpen',\n                'tooltipClose'\n            ],\n            _triggerInstanceEvent: function (e) {\n                this.trigger(e.type, e);\n            },\n            _bindHandler: function (event) {\n                this._instance.bind(event, this._triggerInstanceHandler);\n            },\n            draw: function (element) {\n                this._instance.draw(element);\n            },\n            clear: function () {\n                if (this._instance) {\n                    this._instance.clear();\n                }\n                this.hideTooltip();\n            },\n            destroy: function () {\n                if (this._instance) {\n                    this._instance.destroy();\n                    delete this._instance;\n                }\n                if (this._tooltip) {\n                    this._tooltip.destroy();\n                    delete this._tooltip;\n                }\n                Widget.fn.destroy.call(this);\n            },\n            exportVisual: function () {\n                return this._instance.exportVisual();\n            },\n            eventTarget: function (e) {\n                return this._instance.eventTarget(e);\n            },\n            showTooltip: function (shape, options) {\n                if (this._tooltip) {\n                    this._tooltip.show(shape, options);\n                }\n            },\n            hideTooltip: function () {\n                if (this._tooltip) {\n                    this._tooltip.hide();\n                }\n            },\n            suspendTracking: function () {\n                this._instance.suspendTracking();\n                this.hideTooltip();\n            },\n            resumeTracking: function () {\n                this._instance.resumeTracking();\n            },\n            getSize: function () {\n                return {\n                    width: this.element.width(),\n                    height: this.element.height()\n                };\n            },\n            setSize: function (size) {\n                this.element.css({\n                    width: size.width,\n                    height: size.height\n                });\n                this._size = size;\n                this._instance.currentSize(size);\n                this._resize();\n            },\n            _resize: function () {\n                this._instance.currentSize(this._size);\n                this._instance._resize();\n            },\n            _enableTracking: function () {\n                if (kendo.ui.Popup) {\n                    this._tooltip = new draw.SurfaceTooltip(this, this.options.tooltip || {});\n                }\n            }\n        });\n        kendo.ui.plugin(Surface);\n        Surface.create = function (element, options) {\n            return new Surface(element, options);\n        };\n        kendo.drawing.Surface = Surface;\n        function translate(offset) {\n            this._instance.translate(offset);\n        }\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('drawing/html', ['drawing/kendo-drawing'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var drawing = kendo.drawing;\n        var drawDOM = drawing.drawDOM;\n        drawing.drawDOM = function (element, options) {\n            return drawDOM($(element)[0], options);\n        };\n        drawing.drawDOM.drawText = drawDOM.drawText;\n        drawing.drawDOM.getFontFaces = drawDOM.getFontFaces;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.drawing', [\n        'drawing/util',\n        'drawing/kendo-drawing',\n        'drawing/surface-tooltip',\n        'drawing/surface',\n        'drawing/html'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'drawing',\n        name: 'Drawing API',\n        category: 'framework',\n        description: 'The Kendo UI low-level drawing API',\n        depends: [\n            'core',\n            'color',\n            'popup'\n        ]\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/core/kendo-core', [\n        'kendo.core',\n        'kendo.drawing'\n    ], f);\n}(function () {\n    (function ($) {\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 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        var deepExtend = kendo.deepExtend;\n        var isFunction = kendo.isFunction;\n        var __common_getter_js = kendo.getter;\n        var ARC = 'arc';\n        var AXIS_LABEL_CLICK = 'axisLabelClick';\n        var BLACK = '#000';\n        var BOTTOM = 'bottom';\n        var CENTER = 'center';\n        var CIRCLE = 'circle';\n        var COORD_PRECISION = 3;\n        var CROSS = 'cross';\n        var DATE = 'date';\n        var DEFAULT_FONT = '12px sans-serif';\n        var DEFAULT_HEIGHT = 400;\n        var DEFAULT_PRECISION = 10;\n        var DEFAULT_WIDTH = 600;\n        var END = 'end';\n        var FORMAT_REGEX = /\\{\\d+:?/;\n        var HEIGHT = 'height';\n        var HIGHLIGHT_ZINDEX = 100;\n        var INSIDE = 'inside';\n        var LEFT = 'left';\n        var MAX_VALUE = Number.MAX_VALUE;\n        var MIN_VALUE = -Number.MAX_VALUE;\n        var NONE = 'none';\n        var NOTE_CLICK = 'noteClick';\n        var NOTE_HOVER = 'noteHover';\n        var NOTE_LEAVE = 'noteLeave';\n        var OBJECT = 'object';\n        var OUTSIDE = 'outside';\n        var RIGHT = 'right';\n        var START = 'start';\n        var STRING = 'string';\n        var TOP = 'top';\n        var TRIANGLE = 'triangle';\n        var VALUE = 'value';\n        var WHITE = '#fff';\n        var WIDTH = 'width';\n        var X = 'x';\n        var Y = 'y';\n        var constants = {\n            ARC: ARC,\n            AXIS_LABEL_CLICK: AXIS_LABEL_CLICK,\n            BLACK: BLACK,\n            BOTTOM: BOTTOM,\n            CENTER: CENTER,\n            CIRCLE: CIRCLE,\n            COORD_PRECISION: COORD_PRECISION,\n            CROSS: CROSS,\n            DATE: DATE,\n            DEFAULT_FONT: DEFAULT_FONT,\n            DEFAULT_HEIGHT: DEFAULT_HEIGHT,\n            DEFAULT_PRECISION: DEFAULT_PRECISION,\n            DEFAULT_WIDTH: DEFAULT_WIDTH,\n            END: END,\n            FORMAT_REGEX: FORMAT_REGEX,\n            HEIGHT: HEIGHT,\n            HIGHLIGHT_ZINDEX: HIGHLIGHT_ZINDEX,\n            INSIDE: INSIDE,\n            LEFT: LEFT,\n            MAX_VALUE: MAX_VALUE,\n            MIN_VALUE: MIN_VALUE,\n            NONE: NONE,\n            NOTE_CLICK: NOTE_CLICK,\n            NOTE_HOVER: NOTE_HOVER,\n            NOTE_LEAVE: NOTE_LEAVE,\n            OBJECT: OBJECT,\n            OUTSIDE: OUTSIDE,\n            RIGHT: RIGHT,\n            START: START,\n            STRING: STRING,\n            TOP: TOP,\n            TRIANGLE: TRIANGLE,\n            VALUE: VALUE,\n            WHITE: WHITE,\n            WIDTH: WIDTH,\n            X: X,\n            Y: Y\n        };\n        function isArray(value) {\n            return Array.isArray(value);\n        }\n        function addClass(element, classes) {\n            var classArray = isArray(classes) ? classes : [classes];\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        var SPACE_REGEX = /\\s+/g;\n        function removeClass(element, className) {\n            if (element && element.className) {\n                element.className = element.className.replace(className, '').replace(SPACE_REGEX, ' ');\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            for (var i = 0; i < path.segments.length; i++) {\n                path.segments[i].anchor().round(0).translate(offset, offset);\n            }\n            return path;\n        }\n        function clockwise(angle1, angle2) {\n            return -angle1.x * angle2.y + angle1.y * angle2.x < 0;\n        }\n        function isNumber(value) {\n            return typeof value === 'number' && !isNaN(value);\n        }\n        function isString(value) {\n            return typeof value === STRING;\n        }\n        function convertableToNumber(value) {\n            return isNumber(value) || isString(value) && isFinite(value);\n        }\n        function isObject(value) {\n            return typeof value === 'object';\n        }\n        function styleValue(value) {\n            if (isNumber(value)) {\n                return value + 'px';\n            }\n            return value;\n        }\n        var SIZE_STYLES_REGEX = /width|height|top|left|bottom|right/i;\n        function isSizeField(field) {\n            return SIZE_STYLES_REGEX.test(field);\n        }\n        function elementStyles(element, styles) {\n            var stylesArray = isString(styles) ? [styles] : styles;\n            if (isArray(stylesArray)) {\n                var result = {};\n                var style = window.getComputedStyle(element);\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                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        function getSpacing(value, defaultSpacing) {\n            if (defaultSpacing === void 0) {\n                defaultSpacing = 0;\n            }\n            var spacing = {\n                top: 0,\n                right: 0,\n                bottom: 0,\n                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            return spacing;\n        }\n        var defaultImplementation = {\n            format: function (format, value) {\n                return value;\n            },\n            toString: function (value) {\n                return value;\n            },\n            parseDate: function (value) {\n                return new Date(value);\n            }\n        };\n        var current = defaultImplementation;\n        var IntlService = Class.extend({});\n        IntlService.register = function (userImplementation) {\n            current = userImplementation;\n        };\n        if (Object.defineProperties) {\n            Object.defineProperties(IntlService, {\n                implementation: {\n                    get: function () {\n                        return current;\n                    }\n                }\n            });\n        }\n        var FORMAT_REPLACE_REGEX = /\\{(\\d+)(:[^\\}]+)?\\}/g;\n        var FormatService = Class.extend({\n            init: function (intlService) {\n                this._intlService = intlService;\n            },\n            auto: function (formatString) {\n                var values = [], len = arguments.length - 1;\n                while (len-- > 0)\n                    values[len] = arguments[len + 1];\n                var intl = this.intl;\n                if (isString(formatString) && formatString.match(FORMAT_REGEX)) {\n                    return intl.format.apply(intl, [formatString].concat(values));\n                }\n                return intl.toString(values[0], formatString);\n            },\n            localeAuto: function (formatString, values, locale) {\n                var intl = this.intl;\n                var result;\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                        return intl.toString(value, placeholderFormat ? placeholderFormat.substring(1) : '', locale);\n                    });\n                } else {\n                    result = intl.toString(values[0], formatString, locale);\n                }\n                return result;\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        var ChartService = Class.extend({\n            init: function (chart, context) {\n                if (context === void 0) {\n                    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            notify: function (name, args) {\n                if (this.chart) {\n                    this.chart.trigger(name, args);\n                }\n            },\n            isPannable: function (axis) {\n                var pannable = ((this.chart || {}).options || {}).pannable;\n                return pannable && pannable.lock !== axis;\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        var current$1;\n        var DomEventsBuilder = Class.extend({});\n        DomEventsBuilder.register = function (userImplementation) {\n            current$1 = userImplementation;\n        };\n        DomEventsBuilder.create = function (element, events) {\n            if (current$1) {\n                return current$1.create(element, events);\n            }\n        };\n        var current$2 = {\n            compile: function (template) {\n                return template;\n            }\n        };\n        var TemplateService = Class.extend({});\n        TemplateService.register = function (userImplementation) {\n            current$2 = userImplementation;\n        };\n        TemplateService.compile = function (template) {\n            return current$2.compile(template);\n        };\n        var services = {\n            ChartService: ChartService,\n            DomEventsBuilder: DomEventsBuilder,\n            FormatService: FormatService,\n            IntlService: IntlService,\n            TemplateService: TemplateService\n        };\n        function getTemplate(options) {\n            if (options === void 0) {\n                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            return template;\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            return result;\n        }\n        function hasClasses(element, classNames) {\n            if (element.className) {\n                var names = classNames.split(' ');\n                for (var idx = 0; idx < names.length; idx++) {\n                    if (element.className.indexOf(names[idx]) !== -1) {\n                        return true;\n                    }\n                }\n            }\n        }\n        var HashMap = function HashMap() {\n            this._map = {};\n        };\n        HashMap.prototype.get = function get(name) {\n            return this._map[this._key(name)];\n        };\n        HashMap.prototype.set = function set(name, value) {\n            this._map[this._key(name)] = value;\n        };\n        HashMap.prototype._key = function _key(name) {\n            return name instanceof Date ? name.getTime() : name;\n        };\n        function inArray(value, array) {\n            if (array) {\n                return array.indexOf(value) !== -1;\n            }\n        }\n        function interpolateValue(start, end, progress) {\n            return kendo.drawing.util.round(start + (end - start) * progress, COORD_PRECISION);\n        }\n        var TRIGGER = 'trigger';\n        var InstanceObserver = Class.extend({\n            init: function (observer, handlers) {\n                this.observer = observer;\n                this.handlerMap = deepExtend({}, this.handlerMap, handlers);\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                return isDefaultPrevented;\n            },\n            callObserver: function (fnName) {\n                var args = [], len = arguments.length - 1;\n                while (len-- > 0)\n                    args[len] = arguments[len + 1];\n                return this.observer[fnName].apply(this.observer, args);\n            },\n            requiresHandlers: function (names) {\n                var this$1 = this;\n                if (this.observer.requiresHandlers) {\n                    return this.observer.requiresHandlers(names);\n                }\n                for (var idx = 0; idx < names.length; idx++) {\n                    if (this$1.handlerMap[names[idx]]) {\n                        return true;\n                    }\n                }\n            }\n        });\n        function map(array, callback) {\n            var length = array.length;\n            var result = [];\n            for (var idx = 0; idx < length; idx++) {\n                var value = callback(array[idx]);\n                if (kendo.drawing.util.defined(value)) {\n                    result.push(value);\n                }\n            }\n            return result;\n        }\n        function mousewheelDelta(e) {\n            var delta = 0;\n            if (e.wheelDelta) {\n                delta = -e.wheelDelta / 120;\n                delta = delta > 0 ? Math.ceil(delta) : Math.floor(delta);\n            }\n            if (e.detail) {\n                delta = kendo.drawing.util.round(e.detail / 3);\n            }\n            return delta;\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 eventElement = ref.eventElement;\n        var eventCoordinates = ref.eventCoordinates;\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        var FontLoader = Class.extend({});\n        FontLoader.fetchFonts = function (options, fonts, state) {\n            if (state === void 0) {\n                state = { depth: 0 };\n            }\n            var MAX_DEPTH = 5;\n            if (!options || state.depth > MAX_DEPTH || !document.fonts) {\n                return;\n            }\n            Object.keys(options).forEach(function (key) {\n                var value = options[key];\n                if (key === 'dataSource' || key[0] === '$' || !value) {\n                    return;\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        FontLoader.loadFonts = function (fonts, callback) {\n            var promises = [];\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                    kendo.logToConsole(e);\n                }\n                Promise.all(promises).then(callback, callback);\n            } else {\n                callback();\n            }\n        };\n        FontLoader.preloadFonts = function (options, callback) {\n            var fonts = [];\n            FontLoader.fetchFonts(options, fonts);\n            FontLoader.loadFonts(fonts, callback);\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        function sparseArrayLimits(arr) {\n            var min = MAX_VALUE;\n            var max = MIN_VALUE;\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            return {\n                min: min === MAX_VALUE ? undefined : min,\n                max: max === MIN_VALUE ? undefined : max\n            };\n        }\n        function autoMajorUnit(min, max) {\n            var diff = round(max - min, DEFAULT_PRECISION - 1);\n            if (diff === 0) {\n                if (max === 0) {\n                    return 0.1;\n                }\n                diff = Math.abs(max);\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            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            return round(scale * scaleMultiplier, DEFAULT_PRECISION);\n        }\n        var Point = Class.extend({\n            init: function (x, y) {\n                this.x = x || 0;\n                this.y = y || 0;\n            },\n            clone: function () {\n                return new Point(this.x, this.y);\n            },\n            equals: function (point) {\n                return point && this.x === point.x && this.y === point.y;\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                this.x = round(cx + (x - cx) * cosT + (y - cy) * sinT, COORD_PRECISION);\n                this.y = round(cy + (y - cy) * cosT - (x - cx) * sinT, COORD_PRECISION);\n                return this;\n            },\n            multiply: function (a) {\n                this.x *= a;\n                this.y *= a;\n                return this;\n            },\n            distanceTo: function (point) {\n                var dx = this.x - point.x;\n                var dy = this.y - point.y;\n                return Math.sqrt(dx * dx + dy * dy);\n            }\n        });\n        Point.onCircle = function (center, angle, radius) {\n            var radians = rad(angle);\n            return new Point(center.x - radius * Math.cos(radians), center.y - radius * Math.sin(radians));\n        };\n        var Box = Class.extend({\n            init: function (x1, y1, x2, y2) {\n                this.x1 = x1 || 0;\n                this.y1 = y1 || 0;\n                this.x2 = x2 || 0;\n                this.y2 = y2 || 0;\n            },\n            equals: function (box) {\n                return this.x1 === box.x1 && this.x2 === box.x2 && this.y1 === box.y1 && this.y2 === box.y2;\n            },\n            width: function () {\n                return this.x2 - this.x1;\n            },\n            height: function () {\n                return this.y2 - this.y1;\n            },\n            translate: function (dx, dy) {\n                this.x1 += dx;\n                this.x2 += dx;\n                this.y1 += dy;\n                this.y2 += dy;\n                return this;\n            },\n            move: function (x, y) {\n                var height = this.height();\n                var width = this.width();\n                if (defined(x)) {\n                    this.x1 = x;\n                    this.x2 = this.x1 + width;\n                }\n                if (defined(y)) {\n                    this.y1 = y;\n                    this.y2 = this.y1 + height;\n                }\n                return this;\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                return this;\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                return this;\n            },\n            snapTo: function (targetBox, axis) {\n                if (axis === X || !axis) {\n                    this.x1 = targetBox.x1;\n                    this.x2 = targetBox.x2;\n                }\n                if (axis === Y || !axis) {\n                    this.y1 = targetBox.y1;\n                    this.y2 = targetBox.y2;\n                }\n                return this;\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                if (anchor === CENTER) {\n                    var targetCenter = targetBox.center();\n                    var center = this.center();\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                this.x2 = this.x1 + width;\n                this.y2 = this.y1 + height;\n                return this;\n            },\n            shrink: function (dw, dh) {\n                this.x2 -= dw;\n                this.y2 -= dh;\n                return this;\n            },\n            expand: function (dw, dh) {\n                this.shrink(-dw, -dh);\n                return this;\n            },\n            pad: function (padding) {\n                var spacing = getSpacing(padding);\n                this.x1 -= spacing.left;\n                this.x2 += spacing.right;\n                this.y1 -= spacing.top;\n                this.y2 += spacing.bottom;\n                return this;\n            },\n            unpad: function (padding) {\n                var spacing = getSpacing(padding);\n                spacing.left = -spacing.left;\n                spacing.top = -spacing.top;\n                spacing.right = -spacing.right;\n                spacing.bottom = -spacing.bottom;\n                return this.pad(spacing);\n            },\n            clone: function () {\n                return new Box(this.x1, this.y1, this.x2, this.y2);\n            },\n            center: function () {\n                return new Point(this.x1 + this.width() / 2, this.y1 + this.height() / 2);\n            },\n            containsPoint: function (point) {\n                return point.x >= this.x1 && point.x <= this.x2 && point.y >= this.y1 && point.y <= this.y2;\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            getHash: function () {\n                return [\n                    this.x1,\n                    this.y1,\n                    this.x2,\n                    this.y2\n                ].join(',');\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            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                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                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                this.x2 = this.x1 + width;\n                this.y2 = this.y1 + height;\n                return this;\n            },\n            toRect: function () {\n                return new Rect([\n                    this.x1,\n                    this.y1\n                ], [\n                    this.width(),\n                    this.height()\n                ]);\n            },\n            hasSize: function () {\n                return this.width() !== 0 && this.height() !== 0;\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                if (inArray(alignment, [\n                        LEFT,\n                        TOP\n                    ])) {\n                    this[c1] = targetBox[c1];\n                    this[c2] = this[c1] + size;\n                } else if (inArray(alignment, [\n                        RIGHT,\n                        BOTTOM\n                    ])) {\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        function rotatePoint(x, y, cx, cy, angle) {\n            var theta = rad(angle);\n            return new Point(cx + (x - cx) * Math.cos(theta) + (y - cy) * Math.sin(theta), cy - (x - cx) * Math.sin(theta) + (y - cy) * Math.cos(theta));\n        }\n        var Ring = Class.extend({\n            init: function (center, innerRadius, radius, startAngle, angle) {\n                this.center = center;\n                this.innerRadius = innerRadius;\n                this.radius = radius;\n                this.startAngle = startAngle;\n                this.angle = angle;\n            },\n            clone: function () {\n                return new Ring(this.center, this.innerRadius, this.radius, this.startAngle, this.angle);\n            },\n            middle: function () {\n                return this.startAngle + this.angle / 2;\n            },\n            setRadius: function (newRadius, innerRadius) {\n                if (innerRadius) {\n                    this.innerRadius = newRadius;\n                } else {\n                    this.radius = newRadius;\n                }\n                return this;\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                return new Point(x, y);\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                if (Math.abs(sa) < 0.9) {\n                    x += hw * -ca / Math.abs(ca);\n                }\n                if (Math.abs(ca) < 0.9) {\n                    y += hh * -sa / Math.abs(sa);\n                }\n                return new Box(x, y, x + width, y + height);\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                return (startVector.equals(vector) || clockwise(startVector, vector)) && !clockwise(endVector, vector) && dist >= innerRadius * innerRadius && dist <= radius * radius;\n            },\n            getBBox: function () {\n                var this$1 = this;\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 = [\n                    0,\n                    90,\n                    180,\n                    270,\n                    startAngle,\n                    endAngle\n                ].sort(numericComparer);\n                var startAngleIndex = allAngles.indexOf(startAngle);\n                var endAngleIndex = allAngles.indexOf(endAngle);\n                var angles;\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(allAngles.slice(0, endAngleIndex + 1), allAngles.slice(startAngleIndex, allAngles.length));\n                    }\n                }\n                for (var i = 0; i < angles.length; i++) {\n                    var point = this$1.point(angles[i]);\n                    box.wrapPoint(point);\n                    box.wrapPoint(point, innerRadius);\n                }\n                if (!innerRadius) {\n                    box.wrapPoint(this.center);\n                }\n                return box;\n            },\n            expand: function (value) {\n                this.radius += value;\n                return this;\n            }\n        });\n        function numericComparer(a, b) {\n            return a - b;\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            expand: function (value) {\n                return Ring.fn.expand.call(this, value);\n            },\n            clone: function () {\n                return new Sector(this.center, this.radius, this.startAngle, this.angle);\n            },\n            setRadius: function (newRadius) {\n                this.radius = newRadius;\n                return this;\n            }\n        });\n        var DIRECTION_ANGLE = 0.001;\n        var ShapeBuilder = Class.extend({\n            createRing: function (sector, options) {\n                var startAngle = sector.startAngle + 180;\n                var endAngle = sector.angle + startAngle;\n                if (sector.angle > 0 && startAngle === endAngle) {\n                    endAngle += DIRECTION_ANGLE;\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                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                return path;\n            }\n        });\n        ShapeBuilder.current = new ShapeBuilder();\n        var ChartElement = Class.extend({\n            init: function (options) {\n                this.children = [];\n                this.options = deepExtend({}, this.options, this.initUserOptions(options));\n            },\n            initUserOptions: function (options) {\n                return options;\n            },\n            reflow: function (targetBox) {\n                var children = this.children;\n                var box;\n                for (var i = 0; i < children.length; i++) {\n                    var currentChild = children[i];\n                    currentChild.reflow(targetBox);\n                    box = box ? box.wrap(currentChild.box) : currentChild.box.clone();\n                }\n                this.box = box || targetBox;\n            },\n            destroy: function () {\n                var children = this.children;\n                if (this.animation) {\n                    this.animation.destroy();\n                }\n                for (var i = 0; i < children.length; i++) {\n                    children[i].destroy();\n                }\n            },\n            getRoot: function () {\n                var parent = this.parent;\n                return parent ? parent.getRoot() : null;\n            },\n            getSender: function () {\n                var service = this.getService();\n                if (service) {\n                    return service.sender;\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            translateChildren: function (dx, dy) {\n                var children = this.children;\n                var childrenCount = children.length;\n                for (var i = 0; i < childrenCount; i++) {\n                    children[i].box.translate(dx, dy);\n                }\n            },\n            append: function () {\n                var arguments$1 = arguments;\n                var this$1 = this;\n                for (var i = 0; i < arguments.length; i++) {\n                    var item = arguments$1[i];\n                    this$1.children.push(item);\n                    item.parent = this$1;\n                }\n            },\n            renderVisual: function () {\n                if (this.options.visible === false) {\n                    return;\n                }\n                this.createVisual();\n                this.addVisual();\n                this.renderChildren();\n                this.createAnimation();\n                this.renderComplete();\n            },\n            addVisual: function () {\n                if (this.visual) {\n                    this.visual.chartElement = this;\n                    if (this.parent) {\n                        this.parent.appendVisual(this.visual);\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            createVisual: function () {\n                this.visual = new Group({\n                    zIndex: this.options.zIndex,\n                    visible: valueOrDefault(this.options.visible, true)\n                });\n            },\n            createAnimation: function () {\n                if (this.visual && this.options.animation) {\n                    this.animation = drawing.Animation.create(this.visual, this.options.animation);\n                }\n            },\n            appendVisual: function (childVisual) {\n                if (!childVisual.chartElement) {\n                    childVisual.chartElement = this;\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                    this.parent.appendVisual(childVisual);\n                }\n            },\n            clipRoot: function () {\n                if (this.parent) {\n                    return this.parent.clipRoot();\n                }\n                return this;\n            },\n            stackRoot: function () {\n                if (this.parent) {\n                    return this.parent.stackRoot();\n                }\n                return this;\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                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                this.visual.insert(pos, childVisual);\n            },\n            traverse: function (callback) {\n                var children = this.children;\n                var length = children.length;\n                for (var i = 0; i < length; i++) {\n                    var child = children[i];\n                    callback(child);\n                    if (child.traverse) {\n                        child.traverse(callback);\n                    }\n                }\n            },\n            closest: function (match) {\n                var element = this;\n                var matched = false;\n                while (element && !matched) {\n                    matched = match(element);\n                    if (!matched) {\n                        element = element.parent;\n                    }\n                }\n                if (matched) {\n                    return element;\n                }\n            },\n            renderComplete: function () {\n            },\n            hasHighlight: function () {\n                var options = (this.options || {}).highlight;\n                return !(!this.createHighlight || options && options.visible === false);\n            },\n            toggleHighlight: function (show) {\n                var this$1 = this;\n                var options = (this.options || {}).highlight || {};\n                var customVisual = options.visual;\n                var highlight = this._highlight;\n                if (!highlight) {\n                    var highlightOptions = {\n                        fill: {\n                            color: WHITE,\n                            opacity: 0.2\n                        },\n                        stroke: {\n                            color: WHITE,\n                            width: 1,\n                            opacity: 0.2\n                        }\n                    };\n                    if (customVisual) {\n                        highlight = this._highlight = customVisual($.extend(this.highlightVisualArgs(), {\n                            createVisual: function () {\n                                return this$1.createHighlight(highlightOptions);\n                            },\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                        if (!highlight) {\n                            return;\n                        }\n                    } else {\n                        highlight = this._highlight = this.createHighlight(highlightOptions);\n                    }\n                    if (!defined(highlight.options.zIndex)) {\n                        highlight.options.zIndex = valueOrDefault(options.zIndex, this.options.zIndex);\n                    }\n                    this.appendVisual(highlight);\n                }\n                highlight.visible(show);\n            },\n            createGradientOverlay: function (element, options, gradientOptions) {\n                var overlay = new Path($.extend({\n                    stroke: { color: 'none' },\n                    fill: this.createGradient(gradientOptions),\n                    closed: element.options.closed\n                }, options));\n                overlay.segments.elements(element.segments.elements());\n                return overlay;\n            },\n            createGradient: function (options) {\n                if (this.parent) {\n                    return this.parent.createGradient(options);\n                }\n            }\n        });\n        ChartElement.prototype.options = {};\n        var BoxElement = ChartElement.extend({\n            init: function (options) {\n                ChartElement.fn.init.call(this, options);\n                this.options.margin = getSpacing(this.options.margin);\n                this.options.padding = getSpacing(this.options.padding);\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\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                var reflowPaddingBox = function () {\n                    this$1.align(targetBox, X, options.align);\n                    this$1.align(targetBox, Y, options.vAlign);\n                    this$1.paddingBox = box.clone().unpad(margin).unpad(borderWidth);\n                };\n                var contentBox = targetBox.clone();\n                if (hasSetSize) {\n                    contentBox.x2 = contentBox.x1 + width;\n                    contentBox.y2 = contentBox.y1 + height;\n                }\n                if (shrinkToFit) {\n                    contentBox.unpad(margin).unpad(borderWidth).unpad(padding);\n                }\n                ChartElement.fn.reflow.call(this, contentBox);\n                if (hasSetSize) {\n                    box = this.box = new Box(0, 0, width, height);\n                } else {\n                    box = this.box;\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                this.translateChildren(box.x1 - contentBox.x1 + margin.left + borderWidth + padding.left, box.y1 - contentBox.y1 + margin.top + borderWidth + padding.top);\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            align: function (targetBox, axis, alignment) {\n                this.box.align(targetBox, axis, alignment);\n            },\n            hasBox: function () {\n                var options = this.options;\n                return options.border.width || options.background;\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                var options = this.options;\n                if (options.visible && this.hasBox()) {\n                    this.visual.append(Path.fromRect(this.paddingBox.toRect(), this.visualStyle()));\n                }\n            },\n            visualStyle: function () {\n                var options = this.options;\n                var border = options.border || {};\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        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        var ShapeElement = BoxElement.extend({\n            init: function (options, pointData) {\n                BoxElement.fn.init.call(this, options);\n                this.pointData = pointData;\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                if (!options.visible || !this.hasBox()) {\n                    return null;\n                }\n                var style = this.visualStyle();\n                var element;\n                if (type === CIRCLE) {\n                    element = new drawing.Circle(new Circle([\n                        round(box.x1 + halfWidth, COORD_PRECISION),\n                        round(box.y1 + box.height() / 2, COORD_PRECISION)\n                    ], halfWidth), style);\n                } else if (type === TRIANGLE) {\n                    element = Path.fromPoints([\n                        [\n                            box.x1 + halfWidth,\n                            box.y1\n                        ],\n                        [\n                            box.x1,\n                            box.y2\n                        ],\n                        [\n                            box.x2,\n                            box.y2\n                        ]\n                    ], style).close();\n                } else if (type === CROSS) {\n                    element = new drawing.MultiPath(style);\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                    element = Path.fromRect(box.toRect(), style);\n                }\n                if (rotation) {\n                    element.transform(geometryTransform().rotate(-rotation, [\n                        center.x,\n                        center.y\n                    ]));\n                }\n                element.options.zIndex = options.zIndex;\n                return element;\n            },\n            createElement: function () {\n                var this$1 = this;\n                var customVisual = this.options.visual;\n                var pointData = this.pointData || {};\n                var visual;\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 () {\n                            return this$1.getElement();\n                        }\n                    });\n                } else {\n                    visual = this.getElement();\n                }\n                return visual;\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            createVisual: function () {\n                this.visual = this.createElement();\n            }\n        });\n        setDefaultOptions(ShapeElement, {\n            type: CIRCLE,\n            align: CENTER,\n            vAlign: CENTER\n        });\n        var LINEAR = 'linear';\n        var RADIAL = 'radial';\n        var GRADIENTS = {\n            glass: {\n                type: LINEAR,\n                rotation: 0,\n                stops: [\n                    {\n                        offset: 0,\n                        color: WHITE,\n                        opacity: 0\n                    },\n                    {\n                        offset: 0.25,\n                        color: WHITE,\n                        opacity: 0.3\n                    },\n                    {\n                        offset: 1,\n                        color: WHITE,\n                        opacity: 0\n                    }\n                ]\n            },\n            sharpBevel: {\n                type: RADIAL,\n                stops: [\n                    {\n                        offset: 0,\n                        color: WHITE,\n                        opacity: 0.55\n                    },\n                    {\n                        offset: 0.65,\n                        color: WHITE,\n                        opacity: 0\n                    },\n                    {\n                        offset: 0.95,\n                        color: WHITE,\n                        opacity: 0.25\n                    }\n                ]\n            },\n            roundedBevel: {\n                type: RADIAL,\n                stops: [\n                    {\n                        offset: 0.33,\n                        color: WHITE,\n                        opacity: 0.06\n                    },\n                    {\n                        offset: 0.83,\n                        color: WHITE,\n                        opacity: 0.2\n                    },\n                    {\n                        offset: 0.95,\n                        color: WHITE,\n                        opacity: 0\n                    }\n                ]\n            },\n            roundedGlass: {\n                type: RADIAL,\n                supportVML: false,\n                stops: [\n                    {\n                        offset: 0,\n                        color: WHITE,\n                        opacity: 0\n                    },\n                    {\n                        offset: 0.5,\n                        color: WHITE,\n                        opacity: 0.3\n                    },\n                    {\n                        offset: 0.99,\n                        color: WHITE,\n                        opacity: 0\n                    }\n                ]\n            },\n            sharpGlass: {\n                type: RADIAL,\n                supportVML: false,\n                stops: [\n                    {\n                        offset: 0,\n                        color: WHITE,\n                        opacity: 0.2\n                    },\n                    {\n                        offset: 0.15,\n                        color: WHITE,\n                        opacity: 0.15\n                    },\n                    {\n                        offset: 0.17,\n                        color: WHITE,\n                        opacity: 0.35\n                    },\n                    {\n                        offset: 0.85,\n                        color: WHITE,\n                        opacity: 0.05\n                    },\n                    {\n                        offset: 0.87,\n                        color: WHITE,\n                        opacity: 0.15\n                    },\n                    {\n                        offset: 0.99,\n                        color: WHITE,\n                        opacity: 0\n                    }\n                ]\n            },\n            bubbleShadow: {\n                type: RADIAL,\n                center: [\n                    0.5,\n                    0.5\n                ],\n                radius: 0.5\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            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            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            if (r.x1 === a && r.y1 === e || s.x1 === a && s.y1 === e) {\n                boxes[4] = new Box(a, e, b, f);\n                boxes[5] = new Box(c, g, d, h);\n            } else {\n                boxes[4] = new Box(c, e, d, f);\n                boxes[5] = new Box(a, g, b, h);\n            }\n            return grep(boxes, function (box) {\n                return box.height() > 0 && box.width() > 0;\n            })[0];\n        }\n        var RootElement = ChartElement.extend({\n            init: function (options) {\n                ChartElement.fn.init.call(this, options);\n                var rootOptions = this.options;\n                rootOptions.width = parseInt(rootOptions.width, 10);\n                rootOptions.height = parseInt(rootOptions.height, 10);\n                this.gradients = {};\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                this.box = currentBox.unpad(options.margin);\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            createVisual: function () {\n                this.visual = new Group();\n                this.createBackground();\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                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                this.visual.append(background);\n            },\n            getRoot: function () {\n                return this;\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                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                return drawingGradient;\n            },\n            cleanGradients: function () {\n                var gradients = this.gradients;\n                for (var hashCode in gradients) {\n                    gradients[hashCode]._observers = [];\n                }\n            },\n            size: function () {\n                var options = this.options;\n                return new Box(0, 0, options.width, options.height);\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        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            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            return currentStops;\n        }\n        var FloatElement = ChartElement.extend({\n            init: function (options) {\n                ChartElement.fn.init.call(this, options);\n                this._initDirection();\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            reflow: function (targetBox) {\n                this.box = targetBox.clone();\n                this.reflowChildren();\n            },\n            reflowChildren: function () {\n                var this$1 = this;\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                if (groupsCount) {\n                    var groupStart = groupsStart;\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                        for (var idx = 0; idx < groupElementsCount; idx++) {\n                            var element = groupElements[idx];\n                            var elementSize$$1 = this$1.elementSize(element);\n                            var groupElementStart = groupStart + this$1.alignStart(elementSize$$1[groupSizeField], group.groupSize);\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                            element.reflow(elementBox);\n                            elementStart += elementSize$$1[elementSizeField] + this$1.elementSpacing;\n                        }\n                        groupStart += group.groupSize + this$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            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            groupOptions: function () {\n                var this$1 = this;\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                var groupSize = 0;\n                var groupElementsSize = 0;\n                var groupsSize = 0;\n                var maxGroupElementsSize = 0;\n                var groupElements = [];\n                for (var idx = 0; idx < childrenCount; idx++) {\n                    var element = children[idx];\n                    if (!element.box) {\n                        element.reflow(box);\n                    }\n                    var elementSize$$1 = this$1.elementSize(element);\n                    if (this$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                groups.push({\n                    groupElements: groupElements,\n                    groupSize: groupSize,\n                    groupElementsSize: groupElementsSize\n                });\n                maxGroupElementsSize = Math.max(maxGroupElementsSize, groupElementsSize);\n                groupsSize += groupSize;\n                return {\n                    groups: groups,\n                    groupsSize: groupsSize,\n                    maxGroupElementsSize: maxGroupElementsSize\n                };\n            },\n            elementSize: function (element) {\n                return {\n                    width: element.box.width(),\n                    height: element.box.height()\n                };\n            },\n            createVisual: function () {\n            }\n        });\n        setDefaultOptions(FloatElement, {\n            vertical: true,\n            wrap: true,\n            vSpacing: 0,\n            spacing: 0\n        });\n        var DrawingText = drawing.Text;\n        var Text = ChartElement.extend({\n            init: function (content, options) {\n                ChartElement.fn.init.call(this, options);\n                this.content = content;\n                this.reflow(new Box());\n            },\n            reflow: function (targetBox) {\n                var options = this.options;\n                var size = options.size = util.measureText(this.content, { font: options.font });\n                this.baseline = size.baseline;\n                this.box = new Box(targetBox.x1, targetBox.y1, targetBox.x1 + size.width, targetBox.y1 + size.height);\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                this.visual = new DrawingText(this.content, this.box.toRect().topLeft(), {\n                    font: font,\n                    fill: {\n                        color: color,\n                        opacity: opacity\n                    },\n                    cursor: cursor\n                });\n            }\n        });\n        setDefaultOptions(Text, {\n            font: DEFAULT_FONT,\n            color: BLACK\n        });\n        function rectToBox(rect) {\n            var origin = rect.origin;\n            var bottomRight = rect.bottomRight();\n            return new Box(origin.x, origin.y, bottomRight.x, bottomRight.y);\n        }\n        var ROWS_SPLIT_REGEX = /\\n/m;\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                this._initContainer();\n                if (this.options._autoReflow !== false) {\n                    this.reflow(new Box());\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({\n                    vertical: true,\n                    align: options.align,\n                    wrap: false\n                });\n                var textOptions = deepExtend({}, options, {\n                    opacity: 1,\n                    animation: null\n                });\n                this.container = floatElement;\n                this.append(floatElement);\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            reflow: function (targetBox) {\n                var options = this.options;\n                var visualFn = options.visual;\n                this.container.options.align = options.align;\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                    if (visual) {\n                        visualBox = rectToBox(visual.clippedBBox() || new Rect());\n                        visual.options.zIndex = options.zIndex;\n                    }\n                    this.box = this.contentBox = this.paddingBox = visualBox;\n                } else {\n                    BoxElement.fn.reflow.call(this, targetBox);\n                    if (options.rotation) {\n                        var margin = getSpacing(options.margin);\n                        var box = this.box.unpad(margin);\n                        this.targetBox = targetBox;\n                        this.normalBox = box.clone();\n                        box = this.rotate();\n                        box.translate(margin.left - margin.right, margin.top - margin.bottom);\n                        this.rotatedBox = box.clone();\n                        box.pad(margin);\n                    }\n                }\n            },\n            createVisual: function () {\n                var options = this.options;\n                this.visual = new Group({\n                    transform: this.rotationTransform(),\n                    zIndex: options.zIndex,\n                    noclip: options.noclip\n                });\n                if (this.hasBox()) {\n                    var box = Path.fromRect(this.paddingBox.toRect(), this.visualStyle());\n                    this.visual.append(box);\n                }\n            },\n            renderVisual: function () {\n                if (!this.options.visible) {\n                    return;\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            visualContext: function (targetBox) {\n                var this$1 = this;\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._boxReflow = true;\n                        this$1.reflow(targetBox);\n                        this$1._boxReflow = false;\n                        return this$1.getDefaultVisual();\n                    }\n                };\n                if (this.data) {\n                    $.extend(context, this.data);\n                }\n                return context;\n            },\n            getDefaultVisual: function () {\n                this.createVisual();\n                this.renderChildren();\n                var visual = this.visual;\n                delete this.visual;\n                return visual;\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            rotationTransform: function () {\n                var rotation = this.options.rotation;\n                if (!rotation) {\n                    return null;\n                }\n                var ref = this.normalBox.center();\n                var cx = ref.x;\n                var cy = ref.y;\n                var boxCenter = this.rotatedBox.center();\n                return geometryTransform().translate(boxCenter.x - cx, boxCenter.y - cy).rotate(rotation, [\n                    cx,\n                    cy\n                ]);\n            }\n        });\n        var Title = ChartElement.extend({\n            init: function (options) {\n                ChartElement.fn.init.call(this, options);\n                this.append(new TextBox(this.options.text, $.extend({}, this.options, { vAlign: this.options.position })));\n            },\n            reflow: function (targetBox) {\n                ChartElement.fn.reflow.call(this, targetBox);\n                this.box.snapTo(targetBox, X);\n            }\n        });\n        Title.buildTitle = function (options, parent, defaultOptions) {\n            var titleOptions = options;\n            if (typeof options === 'string') {\n                titleOptions = { text: options };\n            }\n            titleOptions = $.extend({ visible: true }, defaultOptions, titleOptions);\n            var title;\n            if (titleOptions && titleOptions.visible && titleOptions.text) {\n                title = new Title(titleOptions);\n                parent.append(title);\n            }\n            return title;\n        };\n        setDefaultOptions(Title, {\n            color: BLACK,\n            position: TOP,\n            align: CENTER,\n            margin: getSpacing(5),\n            padding: getSpacing(5)\n        });\n        var AxisLabel = TextBox.extend({\n            init: function (value, text, index, dataItem, options) {\n                TextBox.fn.init.call(this, text, options);\n                this.text = text;\n                this.value = value;\n                this.index = index;\n                this.dataItem = dataItem;\n                this.reflow(new Box());\n            },\n            visualContext: function (targetBox) {\n                var context = TextBox.fn.visualContext.call(this, targetBox);\n                context.value = this.value;\n                context.dataItem = this.dataItem;\n                context.format = this.options.format;\n                context.culture = this.options.culture;\n                return context;\n            },\n            click: function (widget, e) {\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            rotate: function () {\n                if (this.options.alignRotation !== CENTER) {\n                    var box = this.normalBox.toRect();\n                    var transform = this.rotationTransform();\n                    this.box = rectToBox(box.bbox(transform.matrix()));\n                } else {\n                    TextBox.fn.rotate.call(this);\n                }\n                return this.box;\n            },\n            rotationTransform: function () {\n                var options = this.options;\n                var rotation = options.rotation;\n                if (!rotation) {\n                    return null;\n                }\n                if (options.alignRotation === CENTER) {\n                    return TextBox.fn.rotationTransform.call(this);\n                }\n                var rotationMatrix = geometryTransform().rotate(rotation).matrix();\n                var box = this.normalBox.toRect();\n                var rect = this.targetBox.toRect();\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                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                var translate = {};\n                translate[distanceAxis] = rect.origin[distanceAxis] - rotatedBox.origin[distanceAxis];\n                var distanceLeft = Math.abs(topLeft[distanceAxis] + translate[distanceAxis] - axisAnchor[distanceAxis]);\n                var distanceRight = Math.abs(topRight[distanceAxis] + translate[distanceAxis] - axisAnchor[distanceAxis]);\n                var alignStart, alignEnd;\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                var alignCenter = alignStart[alignAxis] + (alignEnd[alignAxis] - alignStart[alignAxis]) / 2;\n                translate[alignAxis] = rect.center()[alignAxis] - alignCenter;\n                return geometryTransform().translate(translate.x, translate.y).rotate(rotation);\n            }\n        });\n        setDefaultOptions(AxisLabel, { _autoReflow: false });\n        var DEFAULT_ICON_SIZE = 7;\n        var DEFAULT_LABEL_COLOR = '#fff';\n        var Note = BoxElement.extend({\n            init: function (fields, options, chartService) {\n                BoxElement.fn.init.call(this, options);\n                this.fields = fields;\n                this.chartService = chartService;\n                this.render();\n            },\n            hide: function () {\n                this.options.visible = false;\n            },\n            show: function () {\n                this.options.visible = true;\n            },\n            render: function () {\n                var this$1 = this;\n                var options = this.options;\n                if (options.visible) {\n                    var label = options.label;\n                    var icon = options.icon;\n                    var box = new Box();\n                    var childAlias = function () {\n                        return this$1;\n                    };\n                    var size = icon.size;\n                    var text = this.fields.text;\n                    var width, height;\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                        if (!label.color) {\n                            label.color = label.position === INSIDE ? DEFAULT_LABEL_COLOR : icon.background;\n                        }\n                        this.label = new TextBox(text, deepExtend({}, label));\n                        this.label.aliasFor = childAlias;\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                    icon.width = width || size || DEFAULT_ICON_SIZE;\n                    icon.height = height || size || DEFAULT_ICON_SIZE;\n                    var marker = new ShapeElement(deepExtend({}, icon));\n                    marker.aliasFor = childAlias;\n                    this.marker = marker;\n                    this.append(marker);\n                    if (this.label) {\n                        this.append(this.label);\n                    }\n                    marker.reflow(new Box());\n                    this.wrapperBox = box.wrap(marker.box);\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                if (options.visible) {\n                    var lineStart, box, contentBox;\n                    if (inArray(position, [\n                            LEFT,\n                            RIGHT\n                        ])) {\n                        if (position === LEFT) {\n                            contentBox = wrapperBox.alignTo(targetBox, position).translate(-length, targetBox.center().y - wrapperBox.center().y);\n                            if (options.line.visible) {\n                                lineStart = [\n                                    targetBox.x1,\n                                    center.y\n                                ];\n                                this.linePoints = [\n                                    lineStart,\n                                    [\n                                        contentBox.x2,\n                                        center.y\n                                    ]\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                            if (options.line.visible) {\n                                lineStart = [\n                                    targetBox.x2,\n                                    center.y\n                                ];\n                                this.linePoints = [\n                                    lineStart,\n                                    [\n                                        contentBox.x1,\n                                        center.y\n                                    ]\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                            if (options.line.visible) {\n                                lineStart = [\n                                    center.x,\n                                    targetBox.y2\n                                ];\n                                this.linePoints = [\n                                    lineStart,\n                                    [\n                                        center.x,\n                                        contentBox.y1\n                                    ]\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                            if (options.line.visible) {\n                                lineStart = [\n                                    center.x,\n                                    targetBox.y1\n                                ];\n                                this.linePoints = [\n                                    lineStart,\n                                    [\n                                        center.x,\n                                        contentBox.y2\n                                    ]\n                                ];\n                                box = contentBox.clone().wrapPoint(lineStart);\n                            }\n                        }\n                    }\n                    if (marker) {\n                        marker.reflow(contentBox);\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                    this.contentBox = contentBox;\n                    this.targetBox = targetBox;\n                    this.box = box || contentBox;\n                }\n            },\n            createVisual: function () {\n                BoxElement.fn.createVisual.call(this);\n                this.visual.options.noclip = this.options.noclip;\n                if (this.options.visible) {\n                    this.createLine();\n                }\n            },\n            renderVisual: function () {\n                var this$1 = this;\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.createVisual();\n                            this$1.renderChildren();\n                            var defaultVisual = this$1.visual;\n                            delete this$1.visual;\n                            return defaultVisual;\n                        }\n                    }));\n                    this.addVisual();\n                } else {\n                    BoxElement.fn.renderVisual.call(this);\n                }\n            },\n            createLine: function () {\n                var options = this.options.line;\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                    alignPathToPixel(path);\n                    this.visual.append(path);\n                }\n            },\n            click: function (widget, e) {\n                var args = this.eventArgs(e);\n                if (!widget.trigger(NOTE_CLICK, args)) {\n                    e.preventDefault();\n                }\n            },\n            over: function (widget, e) {\n                var args = this.eventArgs(e);\n                if (!widget.trigger(NOTE_HOVER, args)) {\n                    e.preventDefault();\n                }\n            },\n            out: function (widget, e) {\n                var args = this.eventArgs(e);\n                widget.trigger(NOTE_LEAVE, args);\n            },\n            eventArgs: function (e) {\n                var options = this.options;\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        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: { visible: true },\n            visible: true,\n            position: TOP,\n            zIndex: 2\n        });\n        function createAxisTick(options, tickOptions) {\n            var tickX = options.tickX;\n            var tickY = options.tickY;\n            var position = options.position;\n            var tick = new Path({\n                stroke: {\n                    width: tickOptions.width,\n                    color: tickOptions.color\n                }\n            });\n            if (options.vertical) {\n                tick.moveTo(tickX, position).lineTo(tickX + tickOptions.size, position);\n            } else {\n                tick.moveTo(position, tickY).lineTo(position, tickY + tickOptions.size);\n            }\n            alignPathToPixel(tick);\n            return tick;\n        }\n        function createAxisGridLine(options, gridLine) {\n            var lineStart = options.lineStart;\n            var lineEnd = options.lineEnd;\n            var position = options.position;\n            var line = new Path({\n                stroke: {\n                    width: gridLine.width,\n                    color: gridLine.color,\n                    dashType: gridLine.dashType\n                }\n            });\n            if (options.vertical) {\n                line.moveTo(lineStart, position).lineTo(lineEnd, position);\n            } else {\n                line.moveTo(position, lineStart).lineTo(position, lineEnd);\n            }\n            alignPathToPixel(line);\n            return line;\n        }\n        var Axis = ChartElement.extend({\n            init: function (options, chartService) {\n                if (chartService === void 0) {\n                    chartService = new ChartService();\n                }\n                ChartElement.fn.init.call(this, options);\n                this.chartService = chartService;\n                if (!this.options.visible) {\n                    this.options = deepExtend({}, this.options, {\n                        labels: { visible: false },\n                        line: { visible: false },\n                        margin: 0,\n                        majorTickSize: 0,\n                        minorTickSize: 0\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                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                this.initFields();\n                if (!this.options._deferLabels) {\n                    this.createLabels();\n                }\n                this.createTitle();\n                this.createNotes();\n            },\n            initFields: function () {\n            },\n            labelsRange: function () {\n                return {\n                    min: this.options.labels.skip,\n                    max: this.labelsCount()\n                };\n            },\n            createLabels: function () {\n                var this$1 = this;\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                this.clearLabels();\n                if (labelOptions.visible) {\n                    var range = this.labelsRange();\n                    var rotation = labelOptions.rotation;\n                    if (isObject(rotation)) {\n                        labelOptions.alignRotation = rotation.align;\n                        labelOptions.rotation = rotation.angle;\n                    }\n                    if (labelOptions.rotation === 'auto') {\n                        labelOptions.rotation = 0;\n                        options.autoRotateLabels = true;\n                    }\n                    for (var idx = range.min; idx < range.max; idx += step) {\n                        var label = this$1.createAxisLabel(idx, labelOptions);\n                        if (label) {\n                            this$1.append(label);\n                            this$1.labels.push(label);\n                        }\n                    }\n                }\n            },\n            clearLabels: function () {\n                this.children = grep(this.children, function (child) {\n                    return !(child instanceof AxisLabel);\n                });\n                this.labels = [];\n            },\n            clearTitle: function () {\n                var this$1 = this;\n                if (this.title) {\n                    this.children = grep(this.children, function (child) {\n                        return child !== this$1.title;\n                    });\n                    this.title = undefined;\n                }\n            },\n            clear: function () {\n                this.clearLabels();\n                this.clearTitle();\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                return vertical ? new Box(axisX, box.y1, axisX, box.y2 - lineWidth) : new Box(box.x1, axisY, box.x2 - lineWidth, axisY);\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                if (titleOptions.visible && titleOptions.text) {\n                    var title = new TextBox(titleOptions.text, titleOptions);\n                    this.append(title);\n                    this.title = title;\n                }\n            },\n            createNotes: function () {\n                var this$1 = this;\n                var options = this.options;\n                var notes = options.notes;\n                var items = notes.data || [];\n                this.notes = [];\n                for (var i = 0; i < items.length; i++) {\n                    var item = deepExtend({}, notes, items[i]);\n                    item.value = this$1.parseNoteValue(item.value);\n                    var note = new Note({\n                        value: item.value,\n                        text: item.label.text,\n                        dataItem: item\n                    }, item, this$1.chartService);\n                    if (note.options.visible) {\n                        if (defined(note.options.position)) {\n                            if (options.vertical && !inArray(note.options.position, [\n                                    LEFT,\n                                    RIGHT\n                                ])) {\n                                note.options.position = options.reverse ? LEFT : RIGHT;\n                            } else if (!options.vertical && !inArray(note.options.position, [\n                                    TOP,\n                                    BOTTOM\n                                ])) {\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.append(note);\n                        this$1.notes.push(note);\n                    }\n                }\n            },\n            parseNoteValue: function (value) {\n                return value;\n            },\n            renderVisual: function () {\n                ChartElement.fn.renderVisual.call(this);\n                this.createPlotBands();\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                this.createBackground();\n                this.createLine();\n            },\n            gridLinesVisual: function () {\n                var gridLines = this._gridLines;\n                if (!gridLines) {\n                    gridLines = this._gridLines = new Group({ zIndex: -2 });\n                    this.appendVisual(this._gridLines);\n                }\n                return gridLines;\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 = { vertical: options.vertical };\n                function render(tickPositions, tickOptions, skipUnit) {\n                    var count = tickPositions.length;\n                    var step = Math.max(1, tickOptions.step);\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                            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                            lineGroup.append(createAxisTick(tickLineOptions, tickOptions));\n                        }\n                    }\n                }\n                render(this.getMajorTickPositions(), options.majorTicks);\n                render(this.getMinorTickPositions(), options.minorTicks, majorUnit / options.minorUnit);\n            },\n            createLine: function () {\n                var options = this.options;\n                var line = options.line;\n                var lineBox = this.lineBox();\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                    path.moveTo(lineBox.x1, lineBox.y1).lineTo(lineBox.x2, lineBox.y2);\n                    if (options._alignLines) {\n                        alignPathToPixel(path);\n                    }\n                    var group = this._lineGroup = new Group();\n                    group.append(path);\n                    this.visual.append(group);\n                    this.createTicks(group);\n                }\n            },\n            getActualTickSize: function () {\n                var options = this.options;\n                var tickSize = 0;\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                return tickSize;\n            },\n            createBackground: function () {\n                var ref = this;\n                var options = ref.options;\n                var box = ref.box;\n                var background = options.background;\n                if (background) {\n                    this._backgroundPath = Path.fromRect(box.toRect(), {\n                        fill: { color: background },\n                        stroke: null\n                    });\n                    this.visual.append(this._backgroundPath);\n                }\n            },\n            createPlotBands: function () {\n                var this$1 = this;\n                var options = this.options;\n                var plotBands = options.plotBands || [];\n                var vertical = options.vertical;\n                var plotArea = this.plotArea;\n                if (plotBands.length === 0) {\n                    return;\n                }\n                var group = this._plotbandGroup = new Group({ zIndex: -1 });\n                var altAxis = grep(this.pane.axes, function (axis) {\n                    return axis.options.vertical !== this$1.options.vertical;\n                })[0];\n                for (var idx = 0; idx < plotBands.length; idx++) {\n                    var item = plotBands[idx];\n                    var slotX = void 0, slotY = void 0;\n                    if (vertical) {\n                        slotX = (altAxis || plotArea.axisX).lineBox();\n                        slotY = this$1.getSlot(item.from, item.to, true);\n                    } else {\n                        slotX = this$1.getSlot(item.from, item.to, true);\n                        slotY = (altAxis || plotArea.axisY).lineBox();\n                    }\n                    if (slotX.width() !== 0 && slotY.height() !== 0) {\n                        var bandRect = new Rect([\n                            slotX.x1,\n                            slotY.y1\n                        ], [\n                            slotX.width(),\n                            slotY.height()\n                        ]);\n                        var path = Path.fromRect(bandRect, {\n                            fill: {\n                                color: item.color,\n                                opacity: item.opacity\n                            },\n                            stroke: null\n                        });\n                        group.append(path);\n                    }\n                }\n                this.appendVisual(group);\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                var container = this.gridLinesVisual();\n                function render(tickPositions, gridLine, skipUnit) {\n                    var count = tickPositions.length;\n                    var step = Math.max(1, gridLine.step);\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                                    majorTicks.push(pos);\n                                }\n                            }\n                        }\n                    }\n                }\n                render(this.getMajorTickPositions(), majorGridLines);\n                render(this.getMinorTickPositions(), minorGridLines, majorUnit / minorUnit);\n                return container.children;\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                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                if (vertical) {\n                    this.box = new Box(box.x1, box.y1, box.x1 + maxLabelSize + space, box.y2);\n                } else {\n                    this.box = new Box(box.x1, box.y1, box.x2, box.y1 + maxLabelSize + space);\n                }\n                this.arrangeTitle();\n                this.arrangeLabels();\n                this.arrangeNotes();\n            },\n            getLabelsTickPositions: function () {\n                return this.getMajorTickPositions();\n            },\n            labelTickIndex: function (label) {\n                return label.index;\n            },\n            arrangeLabels: function () {\n                var this$1 = this;\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 lineBox = this.lineBox();\n                var mirror = options.labels.mirror;\n                var tickPositions = this.getLabelsTickPositions();\n                var labelOffset = this.getActualTickSize() + options.margin;\n                for (var idx = 0; idx < labels.length; idx++) {\n                    var label = labels[idx];\n                    var tickIx = this$1.labelTickIndex(label);\n                    var labelSize = vertical ? label.box.height() : label.box.width();\n                    var labelPos = tickPositions[tickIx] - labelSize / 2;\n                    var labelBox = void 0, firstTickPosition = void 0, nextTickPosition = void 0;\n                    if (vertical) {\n                        if (labelsBetweenTicks) {\n                            firstTickPosition = tickPositions[tickIx];\n                            nextTickPosition = tickPositions[tickIx + 1];\n                            var middle = firstTickPosition + (nextTickPosition - firstTickPosition) / 2;\n                            labelPos = middle - labelSize / 2;\n                        }\n                        var labelX = lineBox.x2;\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                        labelBox = label.box.move(labelX, labelPos);\n                    } else {\n                        if (labelsBetweenTicks) {\n                            firstTickPosition = tickPositions[tickIx];\n                            nextTickPosition = tickPositions[tickIx + 1];\n                        } else {\n                            firstTickPosition = labelPos;\n                            nextTickPosition = labelPos + labelSize;\n                        }\n                        var labelY = lineBox.y1;\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                        labelBox = new Box(firstTickPosition, labelY, nextTickPosition, labelY + label.box.height());\n                    }\n                    label.reflow(labelBox);\n                }\n            },\n            autoRotateLabels: function () {\n                if (this.options.autoRotateLabels && !this.options.vertical) {\n                    var tickPositions = this.getMajorTickPositions();\n                    var labels = this.labels;\n                    var angle;\n                    for (var idx = 0; idx < labels.length; idx++) {\n                        var width = Math.abs(tickPositions[idx + 1] - tickPositions[idx]);\n                        var labelBox = labels[idx].box;\n                        if (labelBox.width() > width) {\n                            if (labelBox.height() > width) {\n                                angle = -90;\n                                break;\n                            }\n                            angle = -45;\n                        }\n                    }\n                    if (angle) {\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                        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                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                    title.reflow(this.box);\n                }\n            },\n            arrangeNotes: function () {\n                var this$1 = this;\n                for (var idx = 0; idx < this.notes.length; idx++) {\n                    var item = this$1.notes[idx];\n                    var value = item.options.value;\n                    var slot = void 0;\n                    if (defined(value)) {\n                        if (this$1.shouldRenderNote(value)) {\n                            item.show();\n                        } else {\n                            item.hide();\n                        }\n                        slot = this$1.noteSlot(value);\n                    } else {\n                        item.hide();\n                    }\n                    item.reflow(slot || this$1.lineBox());\n                }\n            },\n            noteSlot: function (value) {\n                return this.getSlot(value);\n            },\n            alignTo: function (secondAxis) {\n                var lineBox = secondAxis.lineBox();\n                var vertical = this.options.vertical;\n                var pos = vertical ? Y : X;\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            axisLabelText: function (value, dataItem, options) {\n                var tmpl = getTemplate(options);\n                var text = value;\n                if (tmpl) {\n                    text = tmpl({\n                        value: value,\n                        dataItem: dataItem,\n                        format: options.format,\n                        culture: options.culture\n                    });\n                } else if (options.format) {\n                    text = this.chartService.format.localeAuto(options.format, [value], options.culture);\n                }\n                return text;\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            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                return box;\n            },\n            maxLabelOffset: function () {\n                var this$1 = this;\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                for (var idx = 0; idx < labels.length; idx++) {\n                    var label = labels[idx];\n                    var tickIx = this$1.labelTickIndex(label);\n                    var startTick = void 0, endTick = void 0;\n                    if (labelsBetweenTicks) {\n                        startTick = tickPositions[tickIx + startPosition];\n                        endTick = tickPositions[tickIx + endPosition];\n                    } else {\n                        startTick = endTick = tickPositions[tickIx];\n                    }\n                    maxStartOffset = Math.max(maxStartOffset, startTick - label.box[offsetField + 1]);\n                    maxEndOffset = Math.max(maxEndOffset, label.box[offsetField + 2] - endTick);\n                }\n                return {\n                    start: maxStartOffset,\n                    end: maxEndOffset\n                };\n            },\n            limitRange: function (from, to, min, max, offset) {\n                var options = this.options;\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                if (to < min && offset > 0 || max < from && offset < 0) {\n                    return {\n                        min: from,\n                        max: to\n                    };\n                }\n                var rangeSize = to - from;\n                var minValue = from;\n                var maxValue = to;\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                return {\n                    min: minValue,\n                    max: maxValue\n                };\n            },\n            valueRange: function () {\n                return {\n                    min: this.seriesMin,\n                    max: this.seriesMax\n                };\n            },\n            labelsBetweenTicks: function () {\n                return !this.options.justified;\n            },\n            prepareUserOptions: function () {\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            margin: 5,\n            visible: true,\n            reverse: false,\n            justified: true,\n            notes: { label: { text: '' } },\n            _alignLines: true,\n            _deferLabels: false\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        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        function absoluteDateDiff(a, b) {\n            var diff = a.getTime() - b;\n            var offsetDiff = a.getTimezoneOffset() - b.getTimezoneOffset();\n            return diff - offsetDiff * TIME_PER_MINUTE;\n        }\n        function addTicks(date, ticks) {\n            return new Date(date.getTime() + ticks);\n        }\n        function toDate(value) {\n            var result;\n            if (value instanceof Date) {\n                result = value;\n            } else if (value) {\n                result = new Date(value);\n            }\n            return result;\n        }\n        function startOfWeek(date, weekStartDay) {\n            if (weekStartDay === void 0) {\n                weekStartDay = 0;\n            }\n            var daysToSubtract = 0;\n            var day = date.getDay();\n            if (!isNaN(day)) {\n                while (day !== weekStartDay) {\n                    if (day === 0) {\n                        day = 6;\n                    } else {\n                        day--;\n                    }\n                    daysToSubtract++;\n                }\n            }\n            return addTicks(date, -daysToSubtract * TIME_PER_DAY);\n        }\n        function adjustDST(date, hours) {\n            if (hours === 0 && date.getHours() === 23) {\n                date.setHours(date.getHours() + 2);\n                return true;\n            }\n            return false;\n        }\n        function addHours(date, hours) {\n            var roundedDate = new Date(date);\n            roundedDate.setMinutes(0, 0, 0);\n            var tzDiff = (date.getTimezoneOffset() - roundedDate.getTimezoneOffset()) * TIME_PER_MINUTE;\n            return addTicks(roundedDate, tzDiff + hours * TIME_PER_HOUR);\n        }\n        function addDuration(dateValue, value, unit, weekStartDay) {\n            var result = dateValue;\n            if (dateValue) {\n                var date = toDate(dateValue);\n                var hours = date.getHours();\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                    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                if (unit !== MILLISECONDS && result.getMilliseconds() > 0) {\n                    result.setMilliseconds(0);\n                }\n            }\n            return result;\n        }\n        function floorDate(date, unit, weekStartDay) {\n            return addDuration(toDate(date), 0, unit, weekStartDay);\n        }\n        function ceilDate(dateValue, unit, weekStartDay) {\n            var date = toDate(dateValue);\n            if (date && floorDate(date, unit, weekStartDay).getTime() === date.getTime()) {\n                return date;\n            }\n            return addDuration(date, 1, unit, weekStartDay);\n        }\n        function dateComparer(a, b) {\n            if (a && b) {\n                return a.getTime() - b.getTime();\n            }\n            return -1;\n        }\n        function dateDiff(a, b) {\n            return a.getTime() - b;\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                return result;\n            } else if (value) {\n                return toDate(value).getTime();\n            }\n        }\n        function dateEquals(a, b) {\n            if (a && b) {\n                return toTime(a) === toTime(b);\n            }\n            return a === b;\n        }\n        function timeIndex(date, start, baseUnit) {\n            return absoluteDateDiff(date, start) / TIME_PER_UNIT[baseUnit];\n        }\n        function dateIndex(value, start, baseUnit, baseUnitStep) {\n            var date = toDate(value);\n            var startDate = toDate(start);\n            var index;\n            if (baseUnit === MONTHS) {\n                index = date.getMonth() - startDate.getMonth() + (date.getFullYear() - startDate.getFullYear()) * 12 + 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            return index / baseUnitStep;\n        }\n        function duration(a, b, unit) {\n            var diff;\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            return diff;\n        }\n        function lteDateIndex(date, sortedDates) {\n            var low = 0;\n            var high = sortedDates.length - 1;\n            var index;\n            while (low <= high) {\n                index = Math.floor((low + high) / 2);\n                var currentDate = sortedDates[index];\n                if (currentDate < date) {\n                    low = index + 1;\n                    continue;\n                }\n                if (currentDate > date) {\n                    high = index - 1;\n                    continue;\n                }\n                while (dateEquals(sortedDates[index - 1], date)) {\n                    index--;\n                }\n                return index;\n            }\n            if (sortedDates[index] <= date) {\n                return index;\n            }\n            return index - 1;\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        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                return result;\n            }\n            return parseDate(intlService, dates);\n        }\n        var MIN_CATEGORY_POINTS_RANGE = 0.01;\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                return -1;\n            }\n            return arr.indexOf(value);\n        }\n        var CategoryAxis = Axis.extend({\n            initFields: function () {\n                this._ticks = {};\n            },\n            categoriesHash: function () {\n                return '';\n            },\n            clone: function () {\n                var copy = new CategoryAxis($.extend({}, this.options), this.chartService);\n                copy.createLabels();\n                return copy;\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                if ((definedMin || definedMax) && categories.length) {\n                    var min = definedMin ? Math.floor(options.min) : 0;\n                    var max;\n                    if (definedMax) {\n                        max = options.justified ? Math.floor(options.max) + 1 : Math.ceil(options.max);\n                    } else {\n                        max = categories.length;\n                    }\n                    options.categories = options.categories.slice(min, max);\n                }\n                return options;\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                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                return {\n                    min: min,\n                    max: max\n                };\n            },\n            totalRangeIndices: function (limit) {\n                var options = this.options;\n                var min = isNumber(options.min) ? options.min : 0;\n                var max;\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                if (limit) {\n                    var totalRange = this.totalRange();\n                    min = limitValue(min, 0, totalRange.max);\n                    max = limitValue(max, 0, totalRange.max);\n                }\n                return {\n                    min: min,\n                    max: max\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                return {\n                    min: min,\n                    max: max\n                };\n            },\n            roundedRange: function () {\n                return this.range();\n            },\n            totalRange: function () {\n                var options = this.options;\n                return {\n                    min: 0,\n                    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                return {\n                    scale: scale * (this.options.reverse ? -1 : 1),\n                    box: lineBox,\n                    min: min,\n                    max: max\n                };\n            },\n            arrangeLabels: function () {\n                Axis.fn.arrangeLabels.call(this);\n                this.hideOutOfRangeLabels();\n            },\n            hideOutOfRangeLabels: function () {\n                var ref = this;\n                var box = ref.box;\n                var labels = ref.labels;\n                if (labels.length) {\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                    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            getMajorTickPositions: function () {\n                return this.getTicks().majorTicks;\n            },\n            getMinorTickPositions: function () {\n                return this.getTicks().minorTicks;\n            },\n            getLabelsTickPositions: function () {\n                return this.getTicks().labelTicks;\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                while (current <= limit) {\n                    indices.push(current);\n                    current += stepSize;\n                }\n                return indices;\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                for (var idx = 0; idx < indices.length; idx++) {\n                    positions.push(pos + round(scale * (indices[idx] - min), COORD_PRECISION));\n                }\n                return positions;\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                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                return cache;\n            },\n            filterOutOfRangePositions: function (positions, lineBox) {\n                if (!positions.length) {\n                    return positions;\n                }\n                var axis = this.options.vertical ? Y : X;\n                var inRange = function (position) {\n                    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                var endIndex = end;\n                while (!inRange(positions[endIndex]) && endIndex >= 0) {\n                    endIndex--;\n                }\n                return positions.slice(startIndex, endIndex + 1);\n            },\n            getSlot: function (from, to, limit) {\n                var options = this.options;\n                var reverse = options.reverse;\n                var justified = options.justified;\n                var vertical = options.vertical;\n                var ref = this.scaleOptions();\n                var scale = ref.scale;\n                var box = ref.box;\n                var min = ref.min;\n                var valueAxis = vertical ? Y : X;\n                var lineStart = box[valueAxis + (reverse ? 2 : 1)];\n                var slotBox = box.clone();\n                var singleSlot = !defined(to);\n                var start = valueOrDefault(from, 0);\n                var end = valueOrDefault(to, start);\n                end = Math.max(end - 1, start);\n                end = Math.max(start, end);\n                var p1 = lineStart + (start - min) * scale;\n                var p2 = lineStart + (end + 1 - min) * scale;\n                if (singleSlot && justified) {\n                    p2 = p1;\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                slotBox[valueAxis + 1] = reverse ? p2 : p1;\n                slotBox[valueAxis + 2] = reverse ? p1 : p2;\n                return slotBox;\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                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                return limittedSlot;\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                if (typeof start === 'string') {\n                    start = this.categoryIndex(start);\n                } else if (isNumber(start)) {\n                    start -= min;\n                }\n                if (typeof end === 'string') {\n                    end = this.categoryIndex(end);\n                } else if (isNumber(end)) {\n                    end -= min;\n                }\n                return Axis.fn.slot.call(this, start, end, limit);\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                if (pos < lineStart || pos > lineEnd) {\n                    return null;\n                }\n                var value = startValue + (pos - lineStart) / scale;\n                var diff = value % 1;\n                if (justified) {\n                    value = Math.round(value);\n                } else if (diff === 0 && value > 0) {\n                    value--;\n                }\n                return Math.floor(value);\n            },\n            getCategory: function (point) {\n                var index = this.pointCategoryIndex(point);\n                if (index === null) {\n                    return null;\n                }\n                return this.options.categories[index];\n            },\n            categoryIndex: function (value) {\n                return this.totalIndex(value) - Math.floor(this.options.min || 0);\n            },\n            categoryAt: function (index, total) {\n                var options = this.options;\n                return (total ? options.srcCategories : options.categories)[index];\n            },\n            categoriesCount: function () {\n                return (this.options.categories || []).length;\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                return {\n                    min: offset,\n                    max: range + offset\n                };\n            },\n            zoomRange: function (rate) {\n                var rangeIndices = this.totalRangeIndices();\n                var ref = this.totalRange();\n                var totalMin = ref.min;\n                var totalMax = ref.max;\n                var min = limitValue(rangeIndices.min + rate, totalMin, totalMax);\n                var max = limitValue(rangeIndices.max - rate, totalMin, totalMax);\n                if (max - min > 0) {\n                    return {\n                        min: min,\n                        max: max\n                    };\n                }\n            },\n            scaleRange: function (scale) {\n                var range = this.options.categories.length;\n                var delta = scale * range;\n                return {\n                    min: -delta,\n                    max: range + delta\n                };\n            },\n            labelsCount: function () {\n                var labelsRange = this.labelsRange();\n                return labelsRange.max - labelsRange.min;\n            },\n            labelsRange: function () {\n                var options = this.options;\n                var justified = options.justified;\n                var labelOptions = options.labels;\n                var ref = this.totalRangeIndices(true);\n                var min = ref.min;\n                var max = ref.max;\n                var start = Math.floor(min);\n                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                var skip;\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                return {\n                    min: skip - start,\n                    max: (options.categories.length ? max + (justified ? 1 : 0) : 0) - start\n                };\n            },\n            createAxisLabel: function (index, labelOptions) {\n                var options = this.options;\n                var dataItem = options.dataItems ? options.dataItems[index] : null;\n                var category = valueOrDefault(options.categories[index], '');\n                var text = this.axisLabelText(category, dataItem, labelOptions);\n                return new AxisLabel(category, text, index, dataItem, labelOptions);\n            },\n            shouldRenderNote: function (value) {\n                var range = this.totalRangeIndices();\n                return Math.floor(range.min) <= value && value <= Math.ceil(range.max);\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            arrangeNotes: function () {\n                Axis.fn.arrangeNotes.call(this);\n                this.hideOutOfRangeNotes();\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                    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            pan: function (delta) {\n                var range = this.totalRangeIndices(true);\n                var ref = this.scaleOptions();\n                var scale = ref.scale;\n                var offset = round(delta / scale, DEFAULT_PRECISION);\n                var totalRange = this.totalRange();\n                var min = range.min + offset;\n                var max = range.max + offset;\n                return this.limitRange(min, max, 0, totalRange.max, offset);\n            },\n            pointsRange: function (start, end) {\n                var ref = this.options;\n                var reverse = ref.reverse;\n                var vertical = ref.vertical;\n                var valueAxis = vertical ? Y : X;\n                var range = this.totalRangeIndices(true);\n                var ref$1 = this.scaleOptions();\n                var scale = ref$1.scale;\n                var box = ref$1.box;\n                var lineStart = box[valueAxis + (reverse ? 2 : 1)];\n                var diffStart = start[valueAxis] - lineStart;\n                var diffEnd = end[valueAxis] - lineStart;\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                if (rangeMax - rangeMin >= MIN_CATEGORY_POINTS_RANGE) {\n                    return {\n                        min: rangeMin,\n                        max: rangeMax\n                    };\n                }\n            },\n            valueRange: function () {\n                return this.range();\n            },\n            totalIndex: function (value) {\n                var options = this.options;\n                var index = this._categoriesMap ? this._categoriesMap.get(value) : indexOf(value, options.srcCategories);\n                return index;\n            },\n            currentRangeIndices: function () {\n                var options = this.options;\n                var min = 0;\n                if (isNumber(options.min)) {\n                    min = Math.floor(options.min);\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                return {\n                    min: min,\n                    max: max\n                };\n            },\n            mapCategories: function () {\n                if (!this._categoriesMap) {\n                    var map$$1 = this._categoriesMap = new HashMap();\n                    var srcCategories = this.options.srcCategories;\n                    for (var idx = 0; idx < srcCategories.length; idx++) {\n                        map$$1.set(srcCategories[idx], idx);\n                    }\n                }\n            },\n            totalCount: function () {\n                return Math.max(this.options.srcCategories.length, this._seriesMax || 0);\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: { zIndex: 1 },\n            justified: false,\n            _deferLabels: true\n        });\n        var COORDINATE_LIMIT = 300000;\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        var ZERO_THRESHOLD = 0.2;\n        var AUTO = 'auto';\n        var BASE_UNITS = [\n            MILLISECONDS,\n            SECONDS,\n            MINUTES,\n            HOURS,\n            DAYS,\n            WEEKS,\n            MONTHS,\n            YEARS\n        ];\n        var FIT = 'fit';\n        function categoryRange(categories) {\n            var range = categories._range;\n            if (!range) {\n                range = categories._range = sparseArrayLimits(categories);\n                range.min = toDate(range.min);\n                range.max = toDate(range.max);\n            }\n            return range;\n        }\n        var EmptyDateRange = Class.extend({\n            init: function (options) {\n                this.options = options;\n            },\n            displayIndices: function () {\n                return {\n                    min: 0,\n                    max: 1\n                };\n            },\n            displayRange: function () {\n                return {};\n            },\n            total: function () {\n                return {};\n            },\n            valueRange: function () {\n                return {};\n            },\n            valueIndex: function () {\n                return -1;\n            },\n            values: function () {\n                return [];\n            },\n            totalIndex: function () {\n                return -1;\n            },\n            valuesCount: function () {\n                return 0;\n            },\n            totalCount: function () {\n                return 0;\n            },\n            dateAt: function () {\n                return null;\n            }\n        });\n        var DateRange = Class.extend({\n            init: function (start, end, options) {\n                this.options = options;\n                options.baseUnitStep = options.baseUnitStep || 1;\n                var roundToBaseUnit = options.roundToBaseUnit;\n                var justified = options.justified;\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                this.end = this.roundToTotalStep(end, !justified, expandEnd ? 1 : 0);\n                var min = options.min || start;\n                this.valueStart = this.roundToTotalStep(min);\n                this.displayStart = roundToBaseUnit ? this.valueStart : min;\n                var max = options.max;\n                if (!max) {\n                    this.valueEnd = lowerEnd;\n                    this.displayEnd = roundToBaseUnit || expandEnd ? this.end : end;\n                } else {\n                    this.valueEnd = this.roundToTotalStep(max, false, !justified && dateEquals(max, this.roundToTotalStep(max)) ? -1 : 0);\n                    this.displayEnd = roundToBaseUnit ? this.roundToTotalStep(max, !justified) : options.max;\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            displayRange: function () {\n                return {\n                    min: this.displayStart,\n                    max: this.displayEnd\n                };\n            },\n            displayIndices: function () {\n                if (!this._indices) {\n                    var options = this.options;\n                    var baseUnit = options.baseUnit;\n                    var baseUnitStep = options.baseUnitStep;\n                    var minIdx = dateIndex(this.displayStart, this.valueStart, baseUnit, baseUnitStep);\n                    var maxIdx = dateIndex(this.displayEnd, this.valueStart, baseUnit, baseUnitStep);\n                    this._indices = {\n                        min: minIdx,\n                        max: maxIdx\n                    };\n                }\n                return this._indices;\n            },\n            total: function () {\n                return {\n                    min: this.start,\n                    max: this.end\n                };\n            },\n            totalCount: function () {\n                var last$$1 = this.totalIndex(this.end);\n                return last$$1 + (this.options.justified ? 1 : 0);\n            },\n            valueRange: function () {\n                return {\n                    min: this.valueStart,\n                    max: this.valueEnd\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            totalIndex: function (value) {\n                var options = this.options;\n                return Math.floor(dateIndex(value, this.start, options.baseUnit, options.baseUnitStep));\n            },\n            dateIndex: function (value) {\n                var options = this.options;\n                return dateIndex(value, this.valueStart, options.baseUnit, options.baseUnitStep);\n            },\n            valuesCount: function () {\n                var maxIdx = this.valueIndex(this.valueEnd);\n                return maxIdx + 1;\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                    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                return values;\n            },\n            dateAt: function (index, total) {\n                var options = this.options;\n                return addDuration(total ? this.start : this.valueStart, options.baseUnitStep * index, options.baseUnit, options.weekStartDay);\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                var step = dateIndex(value, start, baseUnit, baseUnitStep);\n                var roundedStep = upper ? Math.ceil(step) : Math.floor(step);\n                if (next) {\n                    roundedStep += next;\n                }\n                return addDuration(start, roundedStep * baseUnitStep, baseUnit, weekStartDay);\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            while (!step || units >= maxDateGroups) {\n                unitSteps = unitSteps || autoBaseUnitSteps[baseUnit].slice(0);\n                do {\n                    nextStep = unitSteps.shift();\n                } while (nextStep && startUnit === baseUnit && nextStep < startStep);\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            options.baseUnitStep = step;\n            options.baseUnit = baseUnit;\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            for (var categoryIx = 0; categoryIx < count; categoryIx++) {\n                var category = categories[categoryIx];\n                if (category && lastCategory) {\n                    var diff = absoluteDateDiff(category, lastCategory);\n                    if (diff > 0) {\n                        minDiff = Math.min(minDiff, diff);\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                lastCategory = category;\n            }\n            options.baseUnit = unit || DAYS;\n        }\n        function initUnit(options) {\n            var baseUnit = (options.baseUnit || '').toLowerCase();\n            var useDefault = baseUnit !== FIT && !inArray(baseUnit, BASE_UNITS);\n            if (useDefault) {\n                defaultBaseUnit(options);\n            }\n            if (baseUnit === FIT || options.baseUnitStep === AUTO) {\n                autoBaseUnit(options);\n            }\n            return options;\n        }\n        var DateCategoryAxis = CategoryAxis.extend({\n            clone: function () {\n                var copy = new DateCategoryAxis($.extend({}, this.options), this.chartService);\n                copy.createLabels();\n                return copy;\n            },\n            categoriesHash: function () {\n                var start = this.dataRange.total().min;\n                return this.options.baseUnit + this.options.baseUnitStep + start;\n            },\n            initUserOptions: function (options) {\n                return options;\n            },\n            initFields: function () {\n                CategoryAxis.fn.initFields.call(this);\n                var chartService = this.chartService;\n                var intlService = chartService.intl;\n                var options = this.options;\n                var categories = options.categories || [];\n                if (!categories._parsed) {\n                    categories = parseDates(intlService, categories);\n                    categories._parsed = true;\n                }\n                options = deepExtend({ roundToBaseUnit: true }, options, {\n                    categories: categories,\n                    min: parseDate(intlService, options.min),\n                    max: parseDate(intlService, options.max)\n                });\n                if (chartService.panning && chartService.isPannable(options.vertical ? Y : X)) {\n                    options.roundToBaseUnit = false;\n                }\n                options.userSetBaseUnit = options.userSetBaseUnit || options.baseUnit;\n                options.userSetBaseUnitStep = options.userSetBaseUnitStep || options.baseUnitStep;\n                this.options = options;\n                options.srcCategories = categories;\n                if (categories.length > 0) {\n                    var range = categoryRange(categories);\n                    var maxDivisions = options.maxDivisions;\n                    this.dataRange = new DateRange(range.min, range.max, initUnit(options));\n                    if (maxDivisions) {\n                        var dataRange = this.dataRange.displayRange();\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                        var dataRangeOptions = this.dataRange.options;\n                        autoBaseUnit(divisionOptions, dataRangeOptions.baseUnit, dataRangeOptions.baseUnitStep);\n                        this.divisionRange = new DateRange(range.min, range.max, divisionOptions);\n                    } else {\n                        this.divisionRange = this.dataRange;\n                    }\n                } else {\n                    options.baseUnit = options.baseUnit || DAYS;\n                    this.dataRange = this.divisionRange = new EmptyDateRange(options);\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                if (!this.options.maxDivisions || !valuesCount) {\n                    return CategoryAxis.fn.tickIndices.call(this, stepSize);\n                }\n                var indices = [];\n                var values = divisionRange.values();\n                var offset = 0;\n                if (!this.options.justified) {\n                    values = values.concat(divisionRange.dateAt(valuesCount));\n                    offset = 0.5;\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                return indices;\n            },\n            shouldRenderNote: function (value) {\n                var range = this.range();\n                var categories = this.options.categories || [];\n                return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0 && categories.length;\n            },\n            parseNoteValue: function (value) {\n                return parseDate(this.chartService.intl, value);\n            },\n            noteSlot: function (value) {\n                return this.getSlot(value);\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                if (range.min && range.max) {\n                    var from = addTicks(options.min || range.min, offset);\n                    var to = addTicks(options.max || range.max, offset);\n                    range = {\n                        min: addDuration(from, 0, baseUnit, weekStartDay),\n                        max: addDuration(to, 0, baseUnit, weekStartDay)\n                    };\n                }\n                return range;\n            },\n            scaleRange: function (delta) {\n                var rounds = Math.abs(delta);\n                var result = this.range();\n                var from = result.min;\n                var to = result.max;\n                if (from && to) {\n                    while (rounds--) {\n                        var range = dateDiff(from, to);\n                        var step = Math.round(range * 0.1);\n                        if (delta < 0) {\n                            from = addTicks(from, step);\n                            to = addTicks(to, -step);\n                        } else {\n                            from = addTicks(from, -step);\n                            to = addTicks(to, step);\n                        }\n                    }\n                    result = {\n                        min: from,\n                        max: to\n                    };\n                }\n                return result;\n            },\n            labelsRange: function () {\n                return {\n                    min: this.options.labels.skip,\n                    max: this.divisionRange.valuesCount()\n                };\n            },\n            pan: function (delta) {\n                if (this.isEmpty()) {\n                    return null;\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                var panRange = this.limitRange(toTime(from), toTime(to), toTime(totalLimits.min), toTime(totalLimits.max), offset);\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                    return panRange;\n                }\n            },\n            pointsRange: function (start, end) {\n                if (this.isEmpty()) {\n                    return null;\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                var min = addTicks(datesRange.min, pointsRange.min * scale);\n                var max = addTicks(datesRange.min, pointsRange.max * scale);\n                return {\n                    min: min,\n                    max: max,\n                    baseUnit: options.userSetBaseUnit || options.baseUnit,\n                    baseUnitStep: options.userSetBaseUnitStep || options.baseUnitStep\n                };\n            },\n            zoomRange: function (delta) {\n                if (this.isEmpty()) {\n                    return null;\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                var ref$1 = this.dataRange.options;\n                var weekStartDay = ref$1.weekStartDay;\n                var baseUnit = ref$1.baseUnit;\n                var baseUnitStep = ref$1.baseUnitStep;\n                var min = addDuration(rangeMin, delta * baseUnitStep, baseUnit, weekStartDay);\n                var max = addDuration(rangeMax, -delta * baseUnitStep, baseUnit, weekStartDay);\n                if (fit) {\n                    var autoBaseUnitSteps = options.autoBaseUnitSteps;\n                    var maxDateGroups = options.maxDateGroups;\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                    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                    } else if (diff > maxDiff && baseUnit !== YEARS) {\n                        var stepIndex = 0;\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                        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                if (min < totalLimits.min) {\n                    min = totalLimits.min;\n                }\n                if (max > totalLimits.max) {\n                    max = totalLimits.max;\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            range: function () {\n                return this.dataRange.displayRange();\n            },\n            createAxisLabel: function (index, labelOptions) {\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                labelOptions.format = labelOptions.format || unitFormat;\n                var text = this.axisLabelText(date, dataItem, labelOptions);\n                if (text) {\n                    return new AxisLabel(date, text, index, dataItem, labelOptions);\n                }\n            },\n            categoryIndex: function (value) {\n                return this.dataRange.valueIndex(value);\n            },\n            slot: function (from, to, limit) {\n                var dateRange = this.dataRange;\n                var start = from;\n                var end = to;\n                if (start instanceof Date) {\n                    start = dateRange.dateIndex(start);\n                }\n                if (end instanceof Date) {\n                    end = dateRange.dateIndex(end);\n                }\n                var slot = this.getSlot(start, end, limit);\n                if (slot) {\n                    return slot.toRect();\n                }\n            },\n            getSlot: function (a, b, limit) {\n                var start = a;\n                var end = b;\n                if (typeof start === OBJECT) {\n                    start = this.categoryIndex(start);\n                }\n                if (typeof end === OBJECT) {\n                    end = this.categoryIndex(end);\n                }\n                return CategoryAxis.fn.getSlot.call(this, start, end, limit);\n            },\n            valueRange: function () {\n                var options = this.options;\n                var range = categoryRange(options.srcCategories);\n                return {\n                    min: toDate(range.min),\n                    max: toDate(range.max)\n                };\n            },\n            categoryAt: function (index, total) {\n                return this.dataRange.dateAt(index, total);\n            },\n            categoriesCount: function () {\n                return this.dataRange.valuesCount();\n            },\n            rangeIndices: function () {\n                return this.dataRange.displayIndices();\n            },\n            labelsBetweenTicks: function () {\n                return !this.divisionRange.options.justified;\n            },\n            prepareUserOptions: function () {\n                if (this.isEmpty()) {\n                    return;\n                }\n                this.options.categories = this.dataRange.values();\n            },\n            getCategory: function (point) {\n                var index = this.pointCategoryIndex(point);\n                if (index === null) {\n                    return null;\n                }\n                return this.dataRange.dateAt(index);\n            },\n            totalIndex: function (value) {\n                return this.dataRange.totalIndex(value);\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            totalRange: function () {\n                return this.dataRange.total();\n            },\n            totalCount: function () {\n                return this.dataRange.totalCount();\n            },\n            isEmpty: function () {\n                return !this.options.srcCategories.length;\n            },\n            roundedRange: function () {\n                if (this.options.roundToBaseUnit !== false || this.isEmpty()) {\n                    return this.range();\n                }\n                var options = this.options;\n                var datesRange = categoryRange(options.srcCategories);\n                var dateRange = new DateRange(datesRange.min, datesRange.max, $.extend({}, options, {\n                    justified: false,\n                    roundToBaseUnit: true,\n                    justifyEnd: options.justified\n                }));\n                return dateRange.displayRange();\n            }\n        });\n        setDefaultOptions(DateCategoryAxis, {\n            type: DATE,\n            labels: { dateFormats: DateLabelFormats },\n            autoBaseUnitSteps: {\n                milliseconds: [\n                    1,\n                    10,\n                    100\n                ],\n                seconds: [\n                    1,\n                    2,\n                    5,\n                    15,\n                    30\n                ],\n                minutes: [\n                    1,\n                    2,\n                    5,\n                    15,\n                    30\n                ],\n                hours: [\n                    1,\n                    2,\n                    3\n                ],\n                days: [\n                    1,\n                    2,\n                    3\n                ],\n                weeks: [\n                    1,\n                    2\n                ],\n                months: [\n                    1,\n                    2,\n                    3,\n                    6\n                ],\n                years: [\n                    1,\n                    2,\n                    3,\n                    5,\n                    10,\n                    25,\n                    50\n                ]\n            },\n            maxDateGroups: 10\n        });\n        function autoAxisMin(min, max, narrow) {\n            if (!min && !max) {\n                return 0;\n            }\n            var axisMin;\n            if (min >= 0 && max >= 0) {\n                var minValue = min === max ? 0 : min;\n                var diff = (max - minValue) / max;\n                if (narrow === false || !narrow && diff > ZERO_THRESHOLD) {\n                    return 0;\n                }\n                axisMin = Math.max(0, minValue - (max - minValue) / 2);\n            } else {\n                axisMin = min;\n            }\n            return axisMin;\n        }\n        function autoAxisMax(min, max, narrow) {\n            if (!min && !max) {\n                return 1;\n            }\n            var axisMax;\n            if (min <= 0 && max <= 0) {\n                var maxValue = min === max ? 0 : max;\n                var diff = Math.abs((maxValue - min) / maxValue);\n                if (narrow === false || !narrow && diff > ZERO_THRESHOLD) {\n                    return 0;\n                }\n                axisMax = Math.min(0, maxValue - (min - maxValue) / 2);\n            } else {\n                axisMax = max;\n            }\n            return axisMax;\n        }\n        function floor(value, step) {\n            return round(Math.floor(value / step) * step, DEFAULT_PRECISION);\n        }\n        function ceil(value, step) {\n            return round(Math.ceil(value / step) * step, DEFAULT_PRECISION);\n        }\n        function limitCoordinate(value) {\n            return Math.max(Math.min(value, COORDINATE_LIMIT), -COORDINATE_LIMIT);\n        }\n        var MIN_VALUE_RANGE = Math.pow(10, -DEFAULT_PRECISION + 1);\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            initUserOptions: function (options) {\n                var autoOptions = autoAxisOptions(options.seriesMin, options.seriesMax, options);\n                this.totalOptions = totalAxisOptions(autoOptions, options);\n                return axisOptions(autoOptions, options);\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            clone: function () {\n                return new NumericAxis(this.seriesMin, this.seriesMax, $.extend({}, this.options), this.chartService);\n            },\n            startValue: function () {\n                return 0;\n            },\n            range: function () {\n                var options = this.options;\n                return {\n                    min: options.min,\n                    max: options.max\n                };\n            },\n            getDivisions: function (stepValue) {\n                if (stepValue === 0) {\n                    return 1;\n                }\n                var options = this.options;\n                var range = options.max - options.min;\n                return Math.floor(round(range / stepValue, COORD_PRECISION)) + 1;\n            },\n            getTickPositions: function (unit, skipUnit) {\n                var options = this.options;\n                var vertical = options.vertical;\n                var reverse = options.reverse;\n                var lineBox = this.lineBox();\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\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 dir = (vertical ? -1 : 1) * (reverse ? -1 : 1);\n                var startEdge = dir === 1 ? 1 : 2;\n                var positions = [];\n                var pos = lineBox[(vertical ? Y : X) + startEdge];\n                var skipStep = 0;\n                if (skipUnit) {\n                    skipStep = skipUnit / unit;\n                }\n                for (var idx = 0; idx < divisions; idx++) {\n                    if (idx % skipStep !== 0) {\n                        positions.push(round(pos, COORD_PRECISION));\n                    }\n                    pos = pos + step * dir;\n                }\n                return positions;\n            },\n            getMajorTickPositions: function () {\n                return this.getTickPositions(this.options.majorUnit);\n            },\n            getMinorTickPositions: function () {\n                return this.getTickPositions(this.options.minorUnit);\n            },\n            getSlot: function (a, b, limit) {\n                if (limit === void 0) {\n                    limit = false;\n                }\n                var options = this.options;\n                var vertical = options.vertical;\n                var reverse = options.reverse;\n                var valueAxis = vertical ? Y : X;\n                var lineBox = this.lineBox();\n                var lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\n                var dir = reverse ? -1 : 1;\n                var step = dir * (lineSize / (options.max - options.min));\n                var slotBox = new Box(lineBox.x1, lineBox.y1, lineBox.x1, lineBox.y1);\n                var start = a;\n                var end = b;\n                if (!defined(start)) {\n                    start = end || 0;\n                }\n                if (!defined(end)) {\n                    end = start || 0;\n                }\n                if (limit) {\n                    start = Math.max(Math.min(start, options.max), options.min);\n                    end = Math.max(Math.min(end, options.max), options.min);\n                }\n                var p1, p2;\n                if (vertical) {\n                    p1 = options.max - Math.max(start, end);\n                    p2 = options.max - Math.min(start, end);\n                } else {\n                    p1 = Math.min(start, end) - options.min;\n                    p2 = Math.max(start, end) - options.min;\n                }\n                slotBox[valueAxis + 1] = limitCoordinate(lineStart + step * (reverse ? p2 : p1));\n                slotBox[valueAxis + 2] = limitCoordinate(lineStart + step * (reverse ? p1 : p2));\n                return slotBox;\n            },\n            getValue: function (point) {\n                var options = this.options;\n                var vertical = options.vertical;\n                var reverse = options.reverse;\n                var max = Number(options.max);\n                var min = Number(options.min);\n                var valueAxis = vertical ? Y : X;\n                var lineBox = this.lineBox();\n                var lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\n                var dir = reverse ? -1 : 1;\n                var offset = dir * (point[valueAxis] - lineStart);\n                var step = (max - min) / lineSize;\n                var valueOffset = offset * step;\n                if (offset < 0 || offset > lineSize) {\n                    return null;\n                }\n                var value = vertical ? max - valueOffset : min + valueOffset;\n                return round(value, DEFAULT_PRECISION);\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 lineBox = this.lineBox();\n                var size = vertical ? lineBox.height() : lineBox.width();\n                var range = max - min;\n                var scale = size / range;\n                var offset = round(delta / scale, DEFAULT_PRECISION);\n                if ((vertical || reverse) && !(vertical && reverse)) {\n                    offset = -offset;\n                }\n                return {\n                    min: min + offset,\n                    max: max + offset,\n                    offset: offset\n                };\n            },\n            scaleRange: function (delta) {\n                var options = this.options;\n                var offset = -delta * options.majorUnit;\n                return {\n                    min: options.min - offset,\n                    max: options.max + offset\n                };\n            },\n            labelsCount: function () {\n                return this.getDivisions(this.options.majorUnit);\n            },\n            createAxisLabel: function (index, labelOptions) {\n                var options = this.options;\n                var value = round(options.min + index * options.majorUnit, DEFAULT_PRECISION);\n                var text = this.axisLabelText(value, null, labelOptions);\n                return new AxisLabel(value, text, index, null, labelOptions);\n            },\n            shouldRenderNote: function (value) {\n                var range = this.range();\n                return range.min <= value && value <= range.max;\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            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                if (this.isValidRange(min, max)) {\n                    return {\n                        min: min,\n                        max: max\n                    };\n                }\n            },\n            zoomRange: function (delta) {\n                var ref = this;\n                var totalMin = ref.totalMin;\n                var totalMax = ref.totalMax;\n                var newRange = this.scaleRange(delta);\n                var min = limitValue(newRange.min, totalMin, totalMax);\n                var max = limitValue(newRange.max, totalMin, totalMax);\n                if (this.isValidRange(min, max)) {\n                    return {\n                        min: min,\n                        max: max\n                    };\n                }\n            },\n            isValidRange: function (min, max) {\n                return max - min > MIN_VALUE_RANGE;\n            }\n        });\n        function autoAxisOptions(seriesMin, seriesMax, options) {\n            var narrowRange = options.narrowRange;\n            var autoMin = autoAxisMin(seriesMin, seriesMax, narrowRange);\n            var autoMax = autoAxisMax(seriesMin, seriesMax, narrowRange);\n            var majorUnit = autoMajorUnit(autoMin, autoMax);\n            var autoOptions = { majorUnit: majorUnit };\n            if (options.roundToMajorUnit !== false) {\n                if (autoMin < 0 && remainderClose(autoMin, majorUnit, 1 / 3)) {\n                    autoMin -= majorUnit;\n                }\n                if (autoMax > 0 && remainderClose(autoMax, majorUnit, 1 / 3)) {\n                    autoMax += majorUnit;\n                }\n            }\n            autoOptions.min = floor(autoMin, majorUnit);\n            autoOptions.max = ceil(autoMax, majorUnit);\n            return autoOptions;\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        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        function axisOptions(autoOptions, userOptions) {\n            var options = userOptions;\n            var userSetMin, userSetMax;\n            if (userOptions) {\n                clearNullValues(userOptions, [\n                    'min',\n                    'max'\n                ]);\n                userSetMin = defined(userOptions.min);\n                userSetMax = defined(userOptions.max);\n                var userSetLimits = userSetMin || userSetMax;\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                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                    autoOptions.majorUnit = autoMajorUnit(options.min, options.max);\n                }\n            }\n            autoOptions.minorUnit = (options.majorUnit || autoOptions.majorUnit) / 5;\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            return result;\n        }\n        function remainderClose(value, divisor, ratio) {\n            var remainder = round(Math.abs(value % divisor), DEFAULT_PRECISION);\n            var threshold = divisor * (1 - ratio);\n            return remainder === 0 || remainder > threshold;\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: { format: '#.####################' },\n            zIndex: 1\n        });\n        var DateValueAxis = Axis.extend({\n            init: function (seriesMin, seriesMax, axisOptions, chartService) {\n                var min = toDate(seriesMin);\n                var max = toDate(seriesMax);\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                });\n                options = applyDefaults(min, max, options);\n                Axis.fn.init.call(this, options, chartService);\n                this.intlService = intlService;\n                this.seriesMin = min;\n                this.seriesMax = max;\n                this.totalMin = toTime(floorDate(toTime(min) - 1, options.baseUnit));\n                this.totalMax = toTime(ceilDate(toTime(max) + 1, options.baseUnit));\n            },\n            clone: function () {\n                return new DateValueAxis(this.seriesMin, this.seriesMax, $.extend({}, this.options), this.chartService);\n            },\n            range: function () {\n                var options = this.options;\n                return {\n                    min: options.min,\n                    max: options.max\n                };\n            },\n            getDivisions: function (stepValue) {\n                var options = this.options;\n                return Math.floor(duration(options.min, options.max, options.baseUnit) / stepValue + 1);\n            },\n            getTickPositions: function (step) {\n                var options = this.options;\n                var vertical = options.vertical;\n                var lineBox = this.lineBox();\n                var dir = (vertical ? -1 : 1) * (options.reverse ? -1 : 1);\n                var startEdge = dir === 1 ? 1 : 2;\n                var start = lineBox[(vertical ? Y : X) + startEdge];\n                var divisions = this.getDivisions(step);\n                var timeRange = dateDiff(options.max, options.min);\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\n                var scale = lineSize / timeRange;\n                var positions = [start];\n                for (var i = 1; i < divisions; i++) {\n                    var date = addDuration(options.min, i * step, options.baseUnit);\n                    var pos = start + dateDiff(date, options.min) * scale * dir;\n                    positions.push(round(pos, COORD_PRECISION));\n                }\n                return positions;\n            },\n            getMajorTickPositions: function () {\n                return this.getTickPositions(this.options.majorUnit);\n            },\n            getMinorTickPositions: function () {\n                return this.getTickPositions(this.options.minorUnit);\n            },\n            getSlot: function (a, b, limit) {\n                return NumericAxis.prototype.getSlot.call(this, parseDate(this.intlService, a), parseDate(this.intlService, b), limit);\n            },\n            getValue: function (point) {\n                var value = NumericAxis.prototype.getValue.call(this, point);\n                return value !== null ? toDate(value) : null;\n            },\n            labelsCount: function () {\n                return this.getDivisions(this.options.majorUnit);\n            },\n            createAxisLabel: function (index, labelOptions) {\n                var options = this.options;\n                var offset = index * options.majorUnit;\n                var date = options.min;\n                if (offset > 0) {\n                    date = addDuration(date, offset, options.baseUnit);\n                }\n                var unitFormat = labelOptions.dateFormats[options.baseUnit];\n                labelOptions.format = labelOptions.format || unitFormat;\n                var text = this.axisLabelText(date, null, labelOptions);\n                return new AxisLabel(date, text, index, null, labelOptions);\n            },\n            translateRange: function (delta, exact) {\n                var options = this.options;\n                var baseUnit = options.baseUnit;\n                var weekStartDay = options.weekStartDay;\n                var lineBox = this.lineBox();\n                var size = options.vertical ? lineBox.height() : lineBox.width();\n                var range = this.range();\n                var scale = size / dateDiff(range.max, range.min);\n                var offset = round(delta / scale, DEFAULT_PRECISION) * (options.reverse ? -1 : 1);\n                var from = addTicks(options.min, offset);\n                var to = addTicks(options.max, offset);\n                if (!exact) {\n                    from = addDuration(from, 0, baseUnit, weekStartDay);\n                    to = addDuration(to, 0, baseUnit, weekStartDay);\n                }\n                return {\n                    min: from,\n                    max: to,\n                    offset: offset\n                };\n            },\n            scaleRange: function (delta) {\n                var ref = this.options;\n                var from = ref.min;\n                var to = ref.max;\n                var rounds = Math.abs(delta);\n                while (rounds--) {\n                    var range = dateDiff(from, to);\n                    var step = Math.round(range * 0.1);\n                    if (delta < 0) {\n                        from = addTicks(from, step);\n                        to = addTicks(to, -step);\n                    } else {\n                        from = addTicks(from, -step);\n                        to = addTicks(to, step);\n                    }\n                }\n                return {\n                    min: from,\n                    max: to\n                };\n            },\n            shouldRenderNote: function (value) {\n                var range = this.range();\n                return dateComparer(value, range.min) >= 0 && dateComparer(value, range.max) <= 0;\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                if (limittedRange) {\n                    return {\n                        min: toDate(limittedRange.min),\n                        max: toDate(limittedRange.max)\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                return {\n                    min: toDate(min),\n                    max: toDate(max)\n                };\n            },\n            zoomRange: function (delta) {\n                var range = this.scaleRange(delta);\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                return {\n                    min: min,\n                    max: max\n                };\n            }\n        });\n        function timeUnits(delta) {\n            var unit = HOURS;\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            return unit;\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 autoMin = floorDate(toTime(min) - 1, baseUnit) || toDate(max);\n            var autoMax = ceilDate(toTime(max) + 1, baseUnit);\n            var userMajorUnit = options.majorUnit ? options.majorUnit : undefined;\n            var majorUnit = userMajorUnit || ceil(autoMajorUnit(autoMin.getTime(), autoMax.getTime()), baseUnitTime) / 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            if (!options.baseUnit) {\n                delete options.baseUnit;\n            }\n            options.baseUnit = options.baseUnit || baseUnit;\n            options.min = options.min || addDuration(autoMin, -head, baseUnit);\n            options.max = options.max || addDuration(autoMax, tail, baseUnit);\n            options.minorUnit = options.minorUnit || majorUnit / 5;\n            options.majorUnit = majorUnit;\n            return options;\n        }\n        setDefaultOptions(DateValueAxis, {\n            type: DATE,\n            majorGridLines: {\n                visible: true,\n                width: 1,\n                color: BLACK\n            },\n            labels: { dateFormats: DateLabelFormats }\n        });\n        var DEFAULT_MAJOR_UNIT = 10;\n        var LogarithmicAxis = Axis.extend({\n            init: function (seriesMin, seriesMax, options, chartService) {\n                var axisOptions = deepExtend({\n                    majorUnit: DEFAULT_MAJOR_UNIT,\n                    min: seriesMin,\n                    max: seriesMax\n                }, 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                axisOptions.max = range.max;\n                axisOptions.min = range.min;\n                axisOptions.minorUnit = options.minorUnit || round(base - 1, DEFAULT_PRECISION);\n                Axis.fn.init.call(this, axisOptions, chartService);\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                this.createLabels();\n            },\n            clone: function () {\n                return new LogarithmicAxis(this.seriesMin, this.seriesMax, $.extend({}, this.options), this.chartService);\n            },\n            startValue: function () {\n                return this.options.min;\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 reverse = options.reverse;\n                var vertical = options.vertical;\n                var base = options.majorUnit;\n                var valueAxis = vertical ? Y : X;\n                var lineBox = this.lineBox();\n                var lineStart = lineBox[valueAxis + (reverse ? 2 : 1)];\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\n                var dir = reverse ? -1 : 1;\n                var step = dir * (lineSize / (logMax - logMin));\n                var slotBox = new Box(lineBox.x1, lineBox.y1, lineBox.x1, lineBox.y1);\n                var start = a;\n                var end = b;\n                if (!defined(start)) {\n                    start = end || 1;\n                }\n                if (!defined(end)) {\n                    end = start || 1;\n                }\n                if (start <= 0 || end <= 0) {\n                    return null;\n                }\n                if (limit) {\n                    start = Math.max(Math.min(start, options.max), options.min);\n                    end = Math.max(Math.min(end, options.max), options.min);\n                }\n                start = log(start, base);\n                end = log(end, base);\n                var p1, p2;\n                if (vertical) {\n                    p1 = logMax - Math.max(start, end);\n                    p2 = logMax - Math.min(start, end);\n                } else {\n                    p1 = Math.min(start, end) - logMin;\n                    p2 = Math.max(start, end) - logMin;\n                }\n                slotBox[valueAxis + 1] = limitCoordinate(lineStart + step * (reverse ? p2 : p1));\n                slotBox[valueAxis + 2] = limitCoordinate(lineStart + step * (reverse ? p1 : p2));\n                return slotBox;\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 reverse = options.reverse;\n                var vertical = options.vertical;\n                var base = options.majorUnit;\n                var lineBox = this.lineBox();\n                var dir = vertical === reverse ? 1 : -1;\n                var startEdge = dir === 1 ? 1 : 2;\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\n                var step = (logMax - logMin) / lineSize;\n                var valueAxis = vertical ? Y : X;\n                var lineStart = lineBox[valueAxis + startEdge];\n                var offset = dir * (point[valueAxis] - lineStart);\n                var valueOffset = offset * step;\n                if (offset < 0 || offset > lineSize) {\n                    return null;\n                }\n                var value = logMin + valueOffset;\n                return round(Math.pow(base, value), DEFAULT_PRECISION);\n            },\n            range: function () {\n                var options = this.options;\n                return {\n                    min: options.min,\n                    max: options.max\n                };\n            },\n            scaleRange: function (delta) {\n                var base = this.options.majorUnit;\n                var offset = -delta;\n                return {\n                    min: Math.pow(base, this.logMin - offset),\n                    max: Math.pow(base, this.logMax + offset)\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                if ((vertical || reverse) && !(vertical && reverse)) {\n                    offset = -offset;\n                }\n                return {\n                    min: Math.pow(base, logMin + offset),\n                    max: Math.pow(base, logMax + offset),\n                    offset: offset\n                };\n            },\n            labelsCount: function () {\n                var floorMax = Math.floor(this.logMax);\n                var count = Math.floor(floorMax - this.logMin) + 1;\n                return count;\n            },\n            getMajorTickPositions: function () {\n                var ticks = [];\n                this.traverseMajorTicksPositions(function (position) {\n                    ticks.push(position);\n                }, {\n                    step: 1,\n                    skip: 0\n                });\n                return ticks;\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 = { vertical: vertical };\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                    lineGroup.append(createAxisTick(tickLineOptions, tickOptions));\n                }\n                if (majorTicks.visible) {\n                    this.traverseMajorTicksPositions(render, majorTicks);\n                }\n                if (minorTicks.visible) {\n                    this.traverseMinorTicksPositions(render, minorTicks);\n                }\n                return ticks;\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                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                        majorTicks.push(tickPosition);\n                    }\n                }\n                if (majorGridLines.visible) {\n                    this.traverseMajorTicksPositions(render, majorGridLines);\n                }\n                if (minorGridLines.visible) {\n                    this.traverseMinorTicksPositions(render, minorGridLines);\n                }\n                return container.children;\n            },\n            traverseMajorTicksPositions: function (callback, tickOptions) {\n                var ref = this._lineOptions();\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                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            traverseMinorTicksPositions: function (callback, tickOptions) {\n                var this$1 = this;\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._lineOptions();\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                for (var power = start; power < logMax; power++) {\n                    var minorOptions = this$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            createAxisLabel: function (index, labelOptions) {\n                var power = Math.ceil(this.logMin + index);\n                var value = Math.pow(this.options.majorUnit, power);\n                var text = this.axisLabelText(value, null, labelOptions);\n                return new AxisLabel(value, text, index, null, labelOptions);\n            },\n            shouldRenderNote: function (value) {\n                var range = this.range();\n                return range.min <= value && value <= range.max;\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            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                return {\n                    min: min,\n                    max: max\n                };\n            },\n            zoomRange: function (delta) {\n                var ref = this;\n                var options = ref.options;\n                var totalMin = ref.totalMin;\n                var totalMax = ref.totalMax;\n                var newRange = this.scaleRange(delta);\n                var min = limitValue(newRange.min, totalMin, totalMax);\n                var max = limitValue(newRange.max, totalMin, totalMax);\n                var base = options.majorUnit;\n                var acceptOptionsRange = max > min && options.min && options.max && round(log(options.max, base) - log(options.min, base), DEFAULT_PRECISION) < 1;\n                var acceptNewRange = !(options.min === totalMin && options.max === totalMax) && round(log(max, base) - log(min, base), DEFAULT_PRECISION) >= 1;\n                if (acceptOptionsRange || acceptNewRange) {\n                    return {\n                        min: min,\n                        max: max\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                return {\n                    value: value,\n                    minorStep: minorStep\n                };\n            },\n            _lineOptions: function () {\n                var ref = this.options;\n                var reverse = ref.reverse;\n                var vertical = ref.vertical;\n                var valueAxis = vertical ? Y : X;\n                var lineBox = this.lineBox();\n                var dir = vertical === reverse ? 1 : -1;\n                var startEdge = dir === 1 ? 1 : 2;\n                var lineSize = vertical ? lineBox.height() : lineBox.width();\n                var step = dir * (lineSize / (this.logMax - this.logMin));\n                var lineStart = lineBox[valueAxis + startEdge];\n                return {\n                    step: step,\n                    lineStart: lineStart,\n                    lineBox: lineBox\n                };\n            }\n        });\n        function initRange(autoMin, autoMax, axisOptions, options) {\n            var min = axisOptions.min;\n            var max = axisOptions.max;\n            if (defined(axisOptions.axisCrossingValue) && axisOptions.axisCrossingValue <= 0) {\n                throwNegativeValuesError();\n            }\n            if (!defined(options.max)) {\n                max = autoMax;\n            } else if (options.max <= 0) {\n                throwNegativeValuesError();\n            }\n            if (!defined(options.min)) {\n                min = autoMin;\n            } else if (options.min <= 0) {\n                throwNegativeValuesError();\n            }\n            return {\n                min: min,\n                max: max\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        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            return autoMax;\n        }\n        function throwNegativeValuesError() {\n            throw new Error('Non positive values cannot be used for a logarithmic axis');\n        }\n        function log(y, x) {\n            return Math.log(y) / Math.log(x);\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        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                if (options.majorGridLines.visible) {\n                    majorAngles = this.majorGridLineAngles(altAxis);\n                    skipMajor = true;\n                    gridLines = this.renderMajorGridLines(majorAngles, radius, options.majorGridLines);\n                }\n                if (options.minorGridLines.visible) {\n                    minorAngles = this.minorGridLineAngles(altAxis, skipMajor);\n                    append(gridLines, this.renderMinorGridLines(minorAngles, radius, options.minorGridLines, altAxis, skipMajor));\n                }\n                return gridLines;\n            },\n            renderMajorGridLines: function (angles, radius, options) {\n                return this.renderGridLines(angles, radius, options);\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            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                var center = this.box.center();\n                var circle = new Circle([\n                    center.x,\n                    center.y\n                ], radius);\n                var container = this.gridLinesVisual();\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                    line.moveTo(circle.center).lineTo(circle.pointAt(angles[i] + 180));\n                    container.append(line);\n                }\n                return container.children;\n            },\n            gridLineAngles: function (altAxis, size, skip, step, skipAngles) {\n                var this$1 = this;\n                var divs = this.intervals(size, skip, step, skipAngles);\n                var options = altAxis.options;\n                var altAxisVisible = options.visible && (options.line || {}).visible !== false;\n                return map(divs, function (d) {\n                    var alpha = this$1.intervalAngle(d);\n                    if (!altAxisVisible || alpha !== 90) {\n                        return alpha;\n                    }\n                });\n            }\n        };\n        var RadarCategoryAxis = CategoryAxis.extend({\n            range: function () {\n                return {\n                    min: 0,\n                    max: this.options.categories.length\n                };\n            },\n            reflow: function (box) {\n                this.box = box;\n                this.reflowLabels();\n            },\n            lineBox: function () {\n                return this.box;\n            },\n            reflowLabels: function () {\n                var this$1 = this;\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                for (var i = 0; i < labels.length; i++) {\n                    labels[i].reflow(measureBox);\n                    var labelBox = labels[i].box;\n                    labels[i].reflow(this$1.getSlot(skip + i * step).adjacentBox(0, labelBox.width(), labelBox.height()));\n                }\n            },\n            intervals: function (size, skipOption, stepOption, skipAngles) {\n                if (skipAngles === void 0) {\n                    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                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                    angle = round(angle, COORD_PRECISION) % 360;\n                    if (!(skipAngles && inArray(angle, skipAngles))) {\n                        divs.push(angle);\n                    }\n                }\n                return divs;\n            },\n            majorIntervals: function () {\n                return this.intervals(1);\n            },\n            minorIntervals: function () {\n                return this.intervals(0.5);\n            },\n            intervalAngle: function (interval) {\n                return (360 + interval + this.options.startAngle) % 360;\n            },\n            majorAngles: function () {\n                var this$1 = this;\n                return map(this.majorIntervals(), function (interval) {\n                    return this$1.intervalAngle(interval);\n                });\n            },\n            createLine: function () {\n                return [];\n            },\n            majorGridLineAngles: function (altAxis) {\n                var majorGridLines = this.options.majorGridLines;\n                return this.gridLineAngles(altAxis, 1, majorGridLines.skip, majorGridLines.step);\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                return this.gridLineAngles(altAxis, 0.5, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);\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                    var radiusCallback = function (angle) {\n                        if (!skipMajor && inArray(angle, majorAngles)) {\n                            return radius;\n                        }\n                        return minorRadius;\n                    };\n                    return radiusCallback;\n                }\n            },\n            createPlotBands: function () {\n                var this$1 = this;\n                var plotBands = this.options.plotBands || [];\n                var group = this._plotbandGroup = new Group({ zIndex: -1 });\n                for (var i = 0; i < plotBands.length; i++) {\n                    var band = plotBands[i];\n                    var slot = this$1.plotBandSlot(band);\n                    var singleSlot = this$1.getSlot(band.from);\n                    var head = band.from - Math.floor(band.from);\n                    slot.startAngle += head * singleSlot.angle;\n                    var tail = Math.ceil(band.to) - band.to;\n                    slot.angle -= (tail + head) * singleSlot.angle;\n                    var ring = ShapeBuilder.current.createRing(slot, {\n                        fill: {\n                            color: band.color,\n                            opacity: band.opacity\n                        },\n                        stroke: { opacity: band.opacity }\n                    });\n                    group.append(ring);\n                }\n                this.appendVisual(group);\n            },\n            plotBandSlot: function (band) {\n                return this.getSlot(band.from, band.to - 1);\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                if (options.reverse && !justified) {\n                    fromValue = (fromValue + 1) % totalDivs;\n                }\n                fromValue = limitValue(Math.floor(fromValue), 0, totalDivs - 1);\n                var slotStart = divs[fromValue];\n                if (justified) {\n                    slotStart = slotStart - slotAngle / 2;\n                    if (slotStart < 0) {\n                        slotStart += 360;\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                return new Ring(box.center(), 0, box.height() / 2, slotStart, angle);\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                return new geometry.Arc([\n                    slot.center.x,\n                    slot.center.y\n                ], {\n                    startAngle: startAngle,\n                    endAngle: endAngle,\n                    radiusX: slot.radius,\n                    radiusY: slot.radius\n                });\n            },\n            pointCategoryIndex: function (point) {\n                var this$1 = this;\n                var length = this.options.categories.length;\n                var index = null;\n                for (var i = 0; i < length; i++) {\n                    var slot = this$1.getSlot(i);\n                    if (slot.containsPoint(point)) {\n                        index = i;\n                        break;\n                    }\n                }\n                return index;\n            }\n        });\n        setDefaultOptions(RadarCategoryAxis, {\n            startAngle: 90,\n            labels: { margin: getSpacing(10) },\n            majorGridLines: { visible: true },\n            justified: true\n        });\n        deepExtend(RadarCategoryAxis.prototype, GridLinesMixin);\n        var PolarAxis = Axis.extend({\n            init: function (options, chartService) {\n                Axis.fn.init.call(this, options, chartService);\n                var instanceOptions = this.options;\n                instanceOptions.minorUnit = instanceOptions.minorUnit || instanceOptions.majorUnit / 2;\n            },\n            getDivisions: function (stepValue) {\n                return NumericAxis.prototype.getDivisions.call(this, stepValue) - 1;\n            },\n            reflow: function (box) {\n                this.box = box;\n                this.reflowLabels();\n            },\n            reflowLabels: function () {\n                var this$1 = this;\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                var measureBox = new Box();\n                var divs = this.intervals(options.majorUnit, skip, step);\n                for (var i = 0; i < labels.length; i++) {\n                    labels[i].reflow(measureBox);\n                    var labelBox = labels[i].box;\n                    labels[i].reflow(this$1.getSlot(divs[i]).adjacentBox(0, labelBox.width(), labelBox.height()));\n                }\n            },\n            lineBox: function () {\n                return this.box;\n            },\n            intervals: function (size, skipOption, stepOption, skipAngles) {\n                if (skipAngles === void 0) {\n                    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                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                return divs;\n            },\n            majorIntervals: function () {\n                return this.intervals(this.options.majorUnit);\n            },\n            minorIntervals: function () {\n                return this.intervals(this.options.minorUnit);\n            },\n            intervalAngle: function (i) {\n                return (540 - i - this.options.startAngle) % 360;\n            },\n            createLine: function () {\n                return [];\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            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                return this.gridLineAngles(altAxis, options.minorUnit, minorGridLines.skip, minorGridLines.step, majorGridLineAngles);\n            },\n            plotBandSlot: function (band) {\n                return this.getSlot(band.from, band.to);\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                if (options.reverse) {\n                    start *= -1;\n                    end *= -1;\n                }\n                start = (540 - start - startAngle) % 360;\n                end = (540 - end - startAngle) % 360;\n                if (end < start) {\n                    var tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                return new Ring(box.center(), 0, box.height() / 2, start, end - start);\n            },\n            slot: function (from, to) {\n                if (to === void 0) {\n                    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                if (options.reverse) {\n                    startAngle = min;\n                    endAngle = max;\n                } else {\n                    startAngle = 360 - max;\n                    endAngle = 360 - min;\n                }\n                startAngle = (startAngle + start) % 360;\n                endAngle = (endAngle + start) % 360;\n                return new geometry.Arc([\n                    slot.center.x,\n                    slot.center.y\n                ], {\n                    startAngle: startAngle,\n                    endAngle: endAngle,\n                    radiusX: slot.radius,\n                    radiusY: slot.radius\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                if (!options.reverse) {\n                    theta *= -1;\n                    start *= -1;\n                }\n                return (theta + start + 360) % 360;\n            },\n            valueRange: function () {\n                return {\n                    min: 0,\n                    max: Math.PI * 2\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: { margin: getSpacing(10) },\n            majorGridLines: {\n                color: BLACK,\n                visible: true,\n                width: 1\n            },\n            minorGridLines: { color: '#aaa' }\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        var RadarNumericAxisMixin = {\n            options: { majorGridLines: { visible: true } },\n            createPlotBands: function () {\n                var this$1 = this;\n                var ref = this.options;\n                var type = ref.majorGridLines.type;\n                var plotBands = ref.plotBands;\n                if (plotBands === void 0) {\n                    plotBands = [];\n                }\n                var altAxis = this.plotArea.polarAxis;\n                var majorAngles = altAxis.majorAngles();\n                var center = altAxis.box.center();\n                var group = this._plotbandGroup = new Group({ zIndex: -1 });\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: { opacity: band.opacity }\n                    };\n                    var slot = this$1.getSlot(band.from, band.to, true);\n                    var ring = new Ring(center, center.y - slot.y2, center.y - slot.y1, 0, 360);\n                    var shape = void 0;\n                    if (type === ARC) {\n                        shape = ShapeBuilder.current.createRing(ring, bandStyle);\n                    } else {\n                        shape = Path.fromPoints(this$1.plotBandPoints(ring, majorAngles), bandStyle).close();\n                    }\n                    group.append(shape);\n                }\n                this.appendVisual(group);\n            },\n            plotBandPoints: function (ring, angles) {\n                var innerPoints = [];\n                var outerPoints = [];\n                var center = [\n                    ring.center.x,\n                    ring.center.y\n                ];\n                var innerCircle = new Circle(center, ring.innerRadius);\n                var outerCircle = new Circle(center, ring.radius);\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                innerPoints.reverse();\n                innerPoints.push(innerPoints[0]);\n                outerPoints.push(outerPoints[0]);\n                return outerPoints.concat(innerPoints);\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                if (options.majorGridLines.visible) {\n                    gridLines = this.renderGridLines(center, majorTicks, majorAngles, options.majorGridLines);\n                }\n                if (options.minorGridLines.visible) {\n                    var minorTicks = this.radarMinorGridLinePositions();\n                    append(gridLines, this.renderGridLines(center, minorTicks, majorAngles, options.minorGridLines));\n                }\n                return gridLines;\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;\n                if (skip === void 0) {\n                    skip = 0;\n                }\n                var step = options.step;\n                if (step === void 0) {\n                    step = 0;\n                }\n                var container = this.gridLinesVisual();\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([\n                            center.x,\n                            center.y\n                        ], 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                            line.close();\n                            container.append(line);\n                        }\n                    }\n                }\n                return container.children;\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                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                    majorAngles.sort(function (a, b) {\n                        return angularDistance(a, theta) - angularDistance(b, theta);\n                    });\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                    distance = radius * (Math.sin(rad(beta)) / Math.sin(rad(gamma)));\n                }\n                return this.axisType().prototype.getValue.call(this, new Point(lineBox.x1, lineBox.y2 - distance));\n            }\n        };\n        function angularDistance(a, b) {\n            return 180 - Math.abs(Math.abs(a - b) - 180);\n        }\n        var RadarNumericAxis = NumericAxis.extend({\n            radarMajorGridLinePositions: function () {\n                return this.getTickPositions(this.options.majorUnit);\n            },\n            radarMinorGridLinePositions: function () {\n                var options = this.options;\n                var minorSkipStep = 0;\n                if (options.majorGridLines.visible) {\n                    minorSkipStep = options.majorUnit;\n                }\n                return this.getTickPositions(options.minorUnit, minorSkipStep);\n            },\n            axisType: function () {\n                return NumericAxis;\n            }\n        });\n        deepExtend(RadarNumericAxis.prototype, RadarNumericAxisMixin);\n        var RadarLogarithmicAxis = LogarithmicAxis.extend({\n            radarMajorGridLinePositions: function () {\n                var positions = [];\n                this.traverseMajorTicksPositions(function (position) {\n                    positions.push(position);\n                }, this.options.majorGridLines);\n                return positions;\n            },\n            radarMinorGridLinePositions: function () {\n                var positions = [];\n                this.traverseMinorTicksPositions(function (position) {\n                    positions.push(position);\n                }, this.options.minorGridLines);\n                return positions;\n            },\n            axisType: function () {\n                return LogarithmicAxis;\n            }\n        });\n        deepExtend(RadarLogarithmicAxis.prototype, RadarNumericAxisMixin);\n        var WEIGHT = 0.333;\n        var EXTREMUM_ALLOWED_DEVIATION = 0.01;\n        var CurveProcessor = Class.extend({\n            init: function (closed) {\n                this.closed = closed;\n            },\n            process: function (dataPoints) {\n                var this$1 = this;\n                var points = dataPoints.slice(0);\n                var segments = [];\n                var closed = this.closed;\n                var length = points.length;\n                if (length > 2) {\n                    this.removeDuplicates(0, points);\n                    length = points.length;\n                }\n                if (length < 2 || length === 2 && points[0].equals(points[1])) {\n                    return segments;\n                }\n                var p0 = points[0];\n                var p1 = points[1];\n                var p2 = points[2];\n                segments.push(new Segment(p0));\n                while (p0.equals(points[length - 1])) {\n                    closed = true;\n                    points.pop();\n                    length--;\n                }\n                if (length === 2) {\n                    var tangent = this.tangent(p0, p1, X, Y);\n                    last(segments).controlOut(this.firstControlPoint(tangent, p0, p1, X, Y));\n                    segments.push(new Segment(p1, this.secondControlPoint(tangent, p0, p1, X, Y)));\n                    return segments;\n                }\n                var initialControlPoint, lastControlPoint;\n                if (closed) {\n                    p0 = points[length - 1];\n                    p1 = points[0];\n                    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                var cp0 = initialControlPoint;\n                for (var idx = 0; idx <= length - 3; idx++) {\n                    this$1.removeDuplicates(idx, points);\n                    length = points.length;\n                    if (idx + 3 <= length) {\n                        p0 = points[idx];\n                        p1 = points[idx + 1];\n                        p2 = points[idx + 2];\n                        var controlPoints$1 = this$1.controlPoints(p0, p1, p2);\n                        last(segments).controlOut(cp0);\n                        cp0 = controlPoints$1[1];\n                        var cp1 = controlPoints$1[0];\n                        segments.push(new Segment(p1, cp1));\n                    }\n                }\n                if (closed) {\n                    p0 = points[length - 2];\n                    p1 = points[length - 1];\n                    p2 = points[0];\n                    var controlPoints$2 = this.controlPoints(p0, p1, p2);\n                    last(segments).controlOut(cp0);\n                    segments.push(new Segment(p1, controlPoints$2[0]));\n                    last(segments).controlOut(controlPoints$2[1]);\n                    segments.push(new Segment(p2, lastControlPoint));\n                } else {\n                    var tangent$2 = this.tangent(p1, p2, X, Y);\n                    last(segments).controlOut(cp0);\n                    segments.push(new Segment(p2, this.secondControlPoint(tangent$2, p1, p2, X, Y)));\n                }\n                return segments;\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            invertAxis: function (p0, p1, p2) {\n                var invertAxis = false;\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) && !(p1.y <= p0.y && p2.y >= y2)) {\n                        invertAxis = true;\n                    }\n                }\n                return invertAxis;\n            },\n            isLine: function (p0, p1, p2) {\n                var fn = this.lineFunction(p0, p1);\n                var y2 = this.calculateFunction(fn, p2.x);\n                return p0.x === p1.x && p1.x === p2.x || round(y2, 1) === round(p2.y, 1);\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                return [\n                    b,\n                    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                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                    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                        if (monotonic[xField]) {\n                            tangent = 0;\n                        } else {\n                            var sign;\n                            if (p2[yField] < p0[yField] && p0[yField] <= p1[yField] || 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                            tangent = EXTREMUM_ALLOWED_DEVIATION * sign;\n                            switchOrientation = true;\n                        }\n                    }\n                }\n                var secondControlPoint = this.secondControlPoint(tangent, p0, p1, xField, yField);\n                if (switchOrientation) {\n                    var oldXField = xField;\n                    xField = yField;\n                    yField = oldXField;\n                }\n                var firstControlPoint = this.firstControlPoint(tangent, p1, p2, xField, yField);\n                if (restrict) {\n                    this.restrictControlPoint(p0, p1, secondControlPoint, tangent);\n                    this.restrictControlPoint(p1, p2, firstControlPoint, tangent);\n                }\n                return [\n                    secondControlPoint,\n                    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            tangent: function (p0, p1, xField, yField) {\n                var x = p1[xField] - p0[xField];\n                var y = p1[yField] - p0[yField];\n                var tangent;\n                if (x === 0) {\n                    tangent = 0;\n                } else {\n                    tangent = y / x;\n                }\n                return tangent;\n            },\n            isMonotonicByField: function (p0, p1, p2, field) {\n                return p2[field] > p1[field] && p1[field] > p0[field] || p2[field] < p1[field] && p1[field] < p0[field];\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                return this.point(t1 + distance, p0[yField] + distance * tangent, xField, yField);\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                return this.point(t2 - distance, p3[yField] - distance * tangent, xField, yField);\n            },\n            point: function (xValue, yValue, xField, yField) {\n                var controlPoint = new geometry.Point();\n                controlPoint[xField] = xValue;\n                controlPoint[yField] = yValue;\n                return controlPoint;\n            },\n            calculateFunction: function (fn, x) {\n                var length = fn.length;\n                var result = 0;\n                for (var i = 0; i < length; i++) {\n                    result += Math.pow(x, i) * fn[i];\n                }\n                return result;\n            }\n        });\n        function numberSign(value) {\n            return value <= 0 ? -1 : 1;\n        }\n        dataviz.Gradients = GRADIENTS;\n        kendo.deepExtend(kendo.dataviz, {\n            constants: constants,\n            services: services,\n            autoMajorUnit: autoMajorUnit,\n            Point: Point,\n            Box: Box,\n            Ring: Ring,\n            Sector: Sector,\n            ShapeBuilder: ShapeBuilder,\n            ShapeElement: ShapeElement,\n            ChartElement: ChartElement,\n            BoxElement: BoxElement,\n            RootElement: RootElement,\n            FloatElement: FloatElement,\n            Text: Text,\n            TextBox: TextBox,\n            Title: Title,\n            AxisLabel: AxisLabel,\n            Axis: Axis,\n            Note: Note,\n            CategoryAxis: CategoryAxis,\n            DateCategoryAxis: DateCategoryAxis,\n            DateValueAxis: DateValueAxis,\n            NumericAxis: NumericAxis,\n            LogarithmicAxis: LogarithmicAxis,\n            PolarAxis: PolarAxis,\n            RadarCategoryAxis: RadarCategoryAxis,\n            RadarNumericAxis: RadarNumericAxis,\n            RadarLogarithmicAxis: RadarLogarithmicAxis,\n            CurveProcessor: CurveProcessor,\n            rectToBox: rectToBox,\n            addClass: addClass,\n            removeClass: removeClass,\n            alignPathToPixel: alignPathToPixel,\n            clockwise: clockwise,\n            convertableToNumber: convertableToNumber,\n            deepExtend: deepExtend,\n            elementStyles: elementStyles,\n            getSpacing: getSpacing,\n            getTemplate: getTemplate,\n            getter: __common_getter_js,\n            grep: grep,\n            hasClasses: hasClasses,\n            HashMap: HashMap,\n            inArray: inArray,\n            interpolateValue: interpolateValue,\n            InstanceObserver: InstanceObserver,\n            isArray: isArray,\n            isFunction: isFunction,\n            isNumber: isNumber,\n            isObject: isObject,\n            isString: isString,\n            map: map,\n            mousewheelDelta: mousewheelDelta,\n            FontLoader: FontLoader,\n            setDefaultOptions: setDefaultOptions,\n            sparseArrayLimits: sparseArrayLimits,\n            styleValue: styleValue,\n            append: append,\n            bindEvents: bindEvents,\n            Class: Class,\n            defined: defined,\n            deg: deg,\n            elementOffset: elementOffset,\n            elementSize: elementSize,\n            eventElement: eventElement,\n            eventCoordinates: eventCoordinates,\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        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/core/core', ['dataviz/core/kendo-core'], f);\n}(function () {\n    (function ($) {\n        var dataviz = kendo.dataviz;\n        var services = dataviz.services;\n        var draw = kendo.drawing;\n        dataviz.SASS_THEMES = [\n            'sass',\n            'default-v2',\n            'bootstrap-v4',\n            '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                proto.exportSVG = this.exportSVG;\n                proto.exportImage = this.exportImage;\n                proto.exportPDF = this.exportPDF;\n                if (!skipLegacy) {\n                    proto.svg = this.svg;\n                    proto.imageDataURL = this.imageDataURL;\n                }\n            },\n            exportSVG: function (options) {\n                return draw.exportSVG(this.exportVisual(), options);\n            },\n            exportImage: function (options) {\n                return draw.exportImage(this.exportVisual(options), options);\n            },\n            exportPDF: function (options) {\n                return draw.exportPDF(this.exportVisual(), options);\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            imageDataURL: function () {\n                if (!kendo.support.canvas) {\n                    return null;\n                }\n                if (draw.canvas.Surface) {\n                    var container = $('<div />').css({\n                        display: 'none',\n                        width: this.element.width(),\n                        height: this.element.height()\n                    }).appendTo(document.body);\n                    var surface = new draw.canvas.Surface(container[0]);\n                    surface.draw(this.exportVisual());\n                    var image = surface._rootElement.toDataURL();\n                    surface.destroy();\n                    container.remove();\n                    return image;\n                } else {\n                    throw new Error('Image Export failed. Unable to export instantiate kendo.drawing.canvas.Surface');\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        });\n        services.TemplateService.register({ compile: kendo.template });\n        dataviz.Point2D = dataviz.Point;\n        dataviz.Box2D = dataviz.Box;\n        dataviz.mwDelta = function (e) {\n            return dataviz.mousewheelDelta(e.originalEvent);\n        };\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.core', [\n        'dataviz/core/kendo-core',\n        'dataviz/core/core'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.core',\n        name: 'Core',\n        description: 'The DataViz core functions',\n        category: 'dataviz',\n        depends: [\n            'core',\n            'drawing'\n        ],\n        hidden: true\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/themes/chart-base-theme', ['kendo.dataviz.core'], f);\n}(function () {\n    (function () {\n        window.kendo.dataviz = window.kendo.dataviz || {};\n        var BAR_GAP = 1.5;\n        var BAR_SPACING = 0.4;\n        var BLACK = '#000';\n        var SANS = 'Arial, Helvetica, sans-serif';\n        var SANS11 = '11px ' + SANS;\n        var SANS12 = '12px ' + SANS;\n        var SANS16 = '16px ' + SANS;\n        var TRANSPARENT = 'transparent';\n        var WHITE = '#fff';\n        var notes = function () {\n            return {\n                icon: { border: { width: 1 } },\n                label: {\n                    font: SANS12,\n                    padding: 3\n                },\n                line: {\n                    length: 10,\n                    width: 2\n                },\n                visible: true\n            };\n        };\n        var axisDefaults = function () {\n            return {\n                labels: { font: SANS12 },\n                notes: notes(),\n                title: {\n                    font: SANS16,\n                    margin: 5\n                }\n            };\n        };\n        var areaSeries = function () {\n            return {\n                highlight: { markers: { border: {} } },\n                line: {\n                    opacity: 1,\n                    width: 0\n                },\n                markers: {\n                    size: 6,\n                    visible: false\n                },\n                opacity: 0.4\n            };\n        };\n        var rangeAreaSeries = function () {\n            return {\n                highlight: { markers: { border: {} } },\n                line: {\n                    opacity: 1,\n                    width: 0\n                },\n                markers: {\n                    size: 6,\n                    visible: false\n                },\n                opacity: 0.4\n            };\n        };\n        var barSeries = function () {\n            return {\n                gap: BAR_GAP,\n                spacing: BAR_SPACING\n            };\n        };\n        var boxPlotSeries = function () {\n            return {\n                outliersField: '',\n                meanField: '',\n                border: {\n                    _brightness: 0.8,\n                    width: 1\n                },\n                downColor: WHITE,\n                gap: 1,\n                highlight: {\n                    border: {\n                        opacity: 1,\n                        width: 2\n                    },\n                    whiskers: { width: 3 },\n                    mean: { width: 2 },\n                    median: { width: 2 }\n                },\n                mean: { width: 2 },\n                median: { width: 2 },\n                spacing: 0.3,\n                whiskers: { width: 2 }\n            };\n        };\n        var bubbleSeries = function () {\n            return {\n                border: { width: 0 },\n                labels: { background: TRANSPARENT },\n                opacity: 0.6\n            };\n        };\n        var bulletSeries = function () {\n            return {\n                gap: BAR_GAP,\n                spacing: BAR_SPACING,\n                target: { color: '#ff0000' }\n            };\n        };\n        var candlestickSeries = function () {\n            return {\n                border: {\n                    _brightness: 0.8,\n                    width: 1\n                },\n                downColor: WHITE,\n                gap: 1,\n                highlight: {\n                    border: {\n                        opacity: 1,\n                        width: 2\n                    },\n                    line: { width: 2 }\n                },\n                line: {\n                    color: BLACK,\n                    width: 1\n                },\n                spacing: 0.3\n            };\n        };\n        var columnSeries = function () {\n            return {\n                gap: BAR_GAP,\n                spacing: BAR_SPACING\n            };\n        };\n        var donutSeries = function () {\n            return { margin: 1 };\n        };\n        var lineSeries = function () {\n            return { width: 2 };\n        };\n        var ohlcSeries = function () {\n            return {\n                gap: 1,\n                highlight: {\n                    line: {\n                        opacity: 1,\n                        width: 3\n                    }\n                },\n                line: { width: 1 },\n                spacing: 0.3\n            };\n        };\n        var radarAreaSeries = function () {\n            return {\n                line: {\n                    opacity: 1,\n                    width: 0\n                },\n                markers: {\n                    size: 6,\n                    visible: false\n                },\n                opacity: 0.5\n            };\n        };\n        var radarLineSeries = function () {\n            return {\n                markers: { visible: false },\n                width: 2\n            };\n        };\n        var rangeBarSeries = function () {\n            return {\n                gap: BAR_GAP,\n                spacing: BAR_SPACING\n            };\n        };\n        var rangeColumnSeries = function () {\n            return {\n                gap: BAR_GAP,\n                spacing: BAR_SPACING\n            };\n        };\n        var scatterLineSeries = function () {\n            return { width: 1 };\n        };\n        var waterfallSeries = function () {\n            return {\n                gap: 0.5,\n                line: {\n                    color: BLACK,\n                    width: 1\n                },\n                spacing: BAR_SPACING\n            };\n        };\n        var pieSeries = function () {\n            return {\n                labels: {\n                    background: '',\n                    color: '',\n                    padding: {\n                        top: 5,\n                        bottom: 5,\n                        left: 7,\n                        right: 7\n                    }\n                }\n            };\n        };\n        var funnelSeries = function () {\n            return {\n                labels: {\n                    background: '',\n                    color: '',\n                    padding: {\n                        top: 5,\n                        bottom: 5,\n                        left: 7,\n                        right: 7\n                    }\n                }\n            };\n        };\n        var seriesDefaults = function (options) {\n            return {\n                visible: true,\n                labels: { font: SANS11 },\n                overlay: options.gradients ? {} : { gradient: 'none' },\n                area: areaSeries(),\n                rangeArea: rangeAreaSeries(),\n                verticalRangeArea: rangeAreaSeries(),\n                bar: barSeries(),\n                boxPlot: boxPlotSeries(),\n                bubble: bubbleSeries(),\n                bullet: bulletSeries(),\n                candlestick: candlestickSeries(),\n                column: columnSeries(),\n                pie: pieSeries(),\n                donut: donutSeries(),\n                funnel: funnelSeries(),\n                horizontalWaterfall: waterfallSeries(),\n                line: lineSeries(),\n                notes: notes(),\n                ohlc: ohlcSeries(),\n                radarArea: radarAreaSeries(),\n                radarLine: radarLineSeries(),\n                polarArea: radarAreaSeries(),\n                polarLine: radarLineSeries(),\n                rangeBar: rangeBarSeries(),\n                rangeColumn: rangeColumnSeries(),\n                scatterLine: scatterLineSeries(),\n                verticalArea: areaSeries(),\n                verticalBoxPlot: boxPlotSeries(),\n                verticalBullet: bulletSeries(),\n                verticalLine: lineSeries(),\n                waterfall: waterfallSeries()\n            };\n        };\n        var title = function () {\n            return { font: SANS16 };\n        };\n        var legend = function () {\n            return { labels: { font: SANS12 } };\n        };\n        var baseTheme = function (options) {\n            if (options === void 0) {\n                options = {};\n            }\n            return {\n                axisDefaults: axisDefaults(),\n                categoryAxis: { majorGridLines: { visible: true } },\n                navigator: {\n                    pane: {\n                        height: 90,\n                        margin: { top: 10 }\n                    }\n                },\n                seriesDefaults: seriesDefaults(options),\n                title: title(),\n                legend: legend()\n            };\n        };\n        kendo.deepExtend(kendo.dataviz, { chartBaseTheme: baseTheme });\n    }());\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/themes/auto-theme', ['kendo.dataviz.core'], f);\n}(function () {\n    (function ($) {\n        var cache;\n        function autoTheme(force) {\n            if (!force && cache) {\n                return cache;\n            }\n            var theme = { chart: kendo.dataviz.chartBaseTheme() };\n            var hook = $('<div style=\"display: none\">' + '  <div class=\"k-var--accent\"></div>' + '  <div class=\"k-var--accent-contrast\"></div>' + '  <div class=\"k-var--base\"></div>' + '  <div class=\"k-var--background\"></div>' + '  <div class=\"k-var--normal-background\"></div>' + '  <div class=\"k-var--normal-text-color\"></div>' + '  <div class=\"k-var--hover-background\"></div>' + '  <div class=\"k-var--hover-text-color\"></div>' + '  <div class=\"k-var--selected-background\"></div>' + '  <div class=\"k-var--selected-text-color\"></div>' + '  <div class=\"k-var--chart-error-bars-background\"></div>' + '  <div class=\"k-var--chart-notes-background\"></div>' + '  <div class=\"k-var--chart-notes-border\"></div>' + '  <div class=\"k-var--chart-notes-lines\"></div>' + '  <div class=\"k-var--chart-crosshair-background\"></div>' + '  <div class=\"k-var--chart-inactive\"></div>' + '  <div class=\"k-var--chart-major-lines\"></div>' + '  <div class=\"k-var--chart-minor-lines\"></div>' + '  <div class=\"k-var--chart-area-opacity\"></div>' + '  <div class=\"k-widget\">' + '      <div class=\"k-var--chart-font\"></div>' + '      <div class=\"k-var--chart-title-font\"></div>' + '      <div class=\"k-var--chart-label-font\"></div>' + '  </div>' + '  <div class=\"k-var--series\">' + '    <div class=\"k-var--series-a\"></div>' + '    <div class=\"k-var--series-b\"></div>' + '    <div class=\"k-var--series-c\"></div>' + '    <div class=\"k-var--series-d\"></div>' + '    <div class=\"k-var--series-e\"></div>' + '    <div class=\"k-var--series-f\"></div>' + '  </div>' + '  <div class=\"k-var--gauge-pointer\"></div>' + '  <div class=\"k-var--gauge-track\"></div>' + '</div>').appendTo(document.body);\n            function mapColor(key, varName) {\n                set(key, queryStyle(varName, 'backgroundColor'));\n            }\n            function queryStyle(varName, prop) {\n                return hook.find('.k-var--' + varName).css(prop);\n            }\n            function set(path, value) {\n                var store = theme;\n                var parts = path.split('.');\n                var key = parts.shift();\n                while (parts.length > 0) {\n                    store = store[key] = store[key] || {};\n                    key = parts.shift();\n                }\n                store[key] = value;\n            }\n            (function setColors() {\n                mapColor('chart.axisDefaults.crosshair.color', 'chart-crosshair-background');\n                mapColor('chart.axisDefaults.labels.color', 'normal-text-color');\n                mapColor('chart.axisDefaults.line.color', 'chart-major-lines');\n                mapColor('chart.axisDefaults.majorGridLines.color', 'chart-major-lines');\n                mapColor('chart.axisDefaults.minorGridLines.color', 'chart-minor-lines');\n                mapColor('chart.axisDefaults.notes.icon.background', 'chart-notes-background');\n                mapColor('chart.axisDefaults.notes.icon.border.color', 'chart-notes-border');\n                mapColor('chart.axisDefaults.notes.line.color', 'chart-notes-lines');\n                mapColor('chart.axisDefaults.title.color', 'normal-text-color');\n                mapColor('chart.chartArea.background', 'background');\n                mapColor('chart.legend.inactiveItems.labels.color', 'chart-inactive');\n                mapColor('chart.legend.inactiveItems.markers.color', 'chart-inactive');\n                mapColor('chart.legend.labels.color', 'normal-text-color');\n                mapColor('chart.seriesDefaults.boxPlot.downColor', 'chart-major-lines');\n                mapColor('chart.seriesDefaults.boxPlot.mean.color', 'base');\n                mapColor('chart.seriesDefaults.boxPlot.median.color', 'base');\n                mapColor('chart.seriesDefaults.boxPlot.whiskers.color', 'accent');\n                mapColor('chart.seriesDefaults.bullet.target.color', 'accent');\n                mapColor('chart.seriesDefaults.candlestick.downColor', 'normal-text-color');\n                mapColor('chart.seriesDefaults.candlestick.line.color', 'normal-text-color');\n                mapColor('chart.seriesDefaults.errorBars.color', 'chart-error-bars-background');\n                mapColor('chart.seriesDefaults.horizontalWaterfall.line.color', 'chart-major-lines');\n                mapColor('chart.seriesDefaults.icon.border.color', 'chart-major-lines');\n                mapColor('chart.seriesDefaults.labels.background', 'background');\n                mapColor('chart.seriesDefaults.labels.color', 'normal-text-color');\n                mapColor('chart.seriesDefaults.notes.icon.background', 'chart-notes-background');\n                mapColor('chart.seriesDefaults.notes.icon.border.color', 'chart-notes-border');\n                mapColor('chart.seriesDefaults.notes.line.color', 'chart-notes-lines');\n                mapColor('chart.seriesDefaults.verticalBoxPlot.downColor', 'chart-major-lines');\n                mapColor('chart.seriesDefaults.verticalBoxPlot.mean.color', 'base');\n                mapColor('chart.seriesDefaults.verticalBoxPlot.median.color', 'base');\n                mapColor('chart.seriesDefaults.verticalBoxPlot.whiskers.color', 'accent');\n                mapColor('chart.seriesDefaults.verticalBullet.target.color', 'accent');\n                mapColor('chart.seriesDefaults.waterfall.line.color', 'chart-major-lines');\n                mapColor('chart.title.color', 'normal-text-color');\n                set('chart.seriesDefaults.labels.opacity', queryStyle('chart-area-opacity', 'opacity'));\n                mapColor('diagram.shapeDefaults.fill.color', 'accent');\n                mapColor('diagram.shapeDefaults.content.color', 'accent-contrast');\n                mapColor('diagram.shapeDefaults.connectorDefaults.fill.color', 'normal-text-color');\n                mapColor('diagram.shapeDefaults.connectorDefaults.stroke.color', 'accent-contrast');\n                mapColor('diagram.shapeDefaults.connectorDefaults.hover.fill.color', 'accent-contrast');\n                mapColor('diagram.shapeDefaults.connectorDefaults.hover.stroke.color', 'normal-text-color');\n                mapColor('diagram.editable.resize.handles.stroke.color', 'normal-text-color');\n                mapColor('diagram.editable.resize.handles.fill.color', 'normal-background');\n                mapColor('diagram.editable.resize.handles.hover.stroke.color', 'normal-text-color');\n                mapColor('diagram.editable.resize.handles.hover.fill.color', 'normal-text-color');\n                mapColor('diagram.selectable.stroke.color', 'normal-text-color');\n                mapColor('diagram.connectionDefaults.stroke.color', 'normal-text-color');\n                mapColor('diagram.connectionDefaults.content.color', 'normal-text-color');\n                mapColor('diagram.connectionDefaults.selection.handles.fill.color', 'accent-contrast');\n                mapColor('diagram.connectionDefaults.selection.handles.stroke.color', 'normal-text-color');\n                mapColor('diagram.connectionDefaults.selection.stroke.color', 'normal-text-color');\n                mapColor('gauge.pointer.color', 'gauge-pointer');\n                mapColor('gauge.scale.labels.color', 'normal-text-color');\n                mapColor('gauge.scale.minorTicks.color', 'normal-text-color');\n                mapColor('gauge.scale.majorTicks.color', 'normal-text-color');\n                mapColor('gauge.scale.line.color', 'normal-text-color');\n                mapColor('gauge.scale.rangePlaceholderColor', 'gauge-track');\n            }());\n            (function setFonts() {\n                function font(varName) {\n                    return queryStyle(varName, 'fontSize') + ' ' + queryStyle(varName, 'fontFamily');\n                }\n                var defaultFont = font('chart-font');\n                var titleFont = font('chart-title-font');\n                var labelFont = font('chart-label-font');\n                set('chart.axisDefaults.labels.font', labelFont);\n                set('chart.axisDefaults.notes.label.font', defaultFont);\n                set('chart.axisDefaults.title.font', defaultFont);\n                set('chart.legend.labels.font', defaultFont);\n                set('chart.seriesDefaults.labels.font', labelFont);\n                set('chart.seriesDefaults.notes.label.font', defaultFont);\n                set('chart.title.font', titleFont);\n            }());\n            (function setSeriesColors() {\n                function letterPos(letter) {\n                    return letter.toLowerCase().charCodeAt(0) - 'a'.charCodeAt(0);\n                }\n                function seriesPos(name) {\n                    return letterPos(name.match(/series-([a-z])$/)[1]);\n                }\n                var series = $('.k-var--series div').toArray();\n                var seriesColors = series.reduce(function (arr, el) {\n                    var pos = seriesPos(el.className);\n                    arr[pos] = $(el).css('backgroundColor');\n                    return arr;\n                }, []);\n                set('chart.seriesColors', seriesColors);\n            }());\n            hook.remove();\n            cache = theme;\n            return theme;\n        }\n        kendo.dataviz.autoTheme = autoTheme;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/themes/themes', ['dataviz/themes/chart-base-theme'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo, ui = kendo.dataviz.ui, deepExtend = kendo.deepExtend;\n        var BLACK = '#000', SANS = 'Arial,Helvetica,sans-serif', SANS12 = '12px ' + SANS, WHITE = '#fff';\n        var chartBaseTheme = kendo.dataviz.chartBaseTheme({ gradients: true });\n        var gaugeBaseTheme = { scale: { labels: { font: SANS12 } } };\n        var diagramBaseTheme = {\n            shapeDefaults: {\n                hover: { opacity: 0.2 },\n                stroke: { width: 0 }\n            },\n            editable: {\n                resize: {\n                    handles: {\n                        width: 7,\n                        height: 7\n                    }\n                }\n            },\n            selectable: {\n                stroke: {\n                    width: 1,\n                    dashType: 'dot'\n                }\n            },\n            connectionDefaults: {\n                stroke: { width: 2 },\n                selection: {\n                    handles: {\n                        width: 8,\n                        height: 8\n                    }\n                },\n                editable: {\n                    tools: [\n                        'edit',\n                        'delete'\n                    ]\n                }\n            }\n        };\n        var themes = ui.themes, registerTheme = ui.registerTheme = function (themeName, options) {\n                var result = {};\n                result.chart = deepExtend({}, chartBaseTheme, options.chart);\n                result.gauge = deepExtend({}, gaugeBaseTheme, options.gauge);\n                result.diagram = deepExtend({}, diagramBaseTheme, options.diagram);\n                result.treeMap = deepExtend({}, options.treeMap);\n                var defaults = result.chart.seriesDefaults;\n                defaults.verticalLine = deepExtend({}, defaults.line);\n                defaults.verticalArea = deepExtend({}, defaults.area);\n                defaults.rangeArea = deepExtend({}, defaults.area);\n                defaults.verticalRangeArea = deepExtend({}, defaults.rangeArea);\n                defaults.verticalBoxPlot = deepExtend({}, defaults.boxPlot);\n                defaults.polarArea = deepExtend({}, defaults.radarArea);\n                defaults.polarLine = deepExtend({}, defaults.radarLine);\n                themes[themeName] = result;\n            };\n        registerTheme('black', {\n            chart: {\n                title: { color: WHITE },\n                legend: {\n                    labels: { color: WHITE },\n                    inactiveItems: {\n                        labels: { color: '#919191' },\n                        markers: { color: '#919191' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: WHITE },\n                    errorBars: { color: WHITE },\n                    notes: {\n                        icon: {\n                            background: '#3b3b3b',\n                            border: { color: '#8e8e8e' }\n                        },\n                        label: { color: WHITE },\n                        line: { color: '#8e8e8e' }\n                    },\n                    pie: { overlay: { gradient: 'sharpBevel' } },\n                    donut: { overlay: { gradient: 'sharpGlass' } },\n                    line: { markers: { background: '#3d3d3d' } },\n                    scatter: { markers: { background: '#3d3d3d' } },\n                    scatterLine: { markers: { background: '#3d3d3d' } },\n                    waterfall: { line: { color: '#8e8e8e' } },\n                    horizontalWaterfall: { line: { color: '#8e8e8e' } },\n                    candlestick: {\n                        downColor: '#555',\n                        line: { color: WHITE },\n                        border: {\n                            _brightness: 1.5,\n                            opacity: 1\n                        },\n                        highlight: {\n                            border: {\n                                color: WHITE,\n                                opacity: 0.2\n                            }\n                        }\n                    },\n                    ohlc: { line: { color: WHITE } }\n                },\n                chartArea: { background: '#3d3d3d' },\n                seriesColors: [\n                    '#0081da',\n                    '#3aafff',\n                    '#99c900',\n                    '#ffeb3d',\n                    '#b20753',\n                    '#ff4195'\n                ],\n                axisDefaults: {\n                    line: { color: '#8e8e8e' },\n                    labels: { color: WHITE },\n                    majorGridLines: { color: '#545454' },\n                    minorGridLines: { color: '#454545' },\n                    title: { color: WHITE },\n                    crosshair: { color: '#8e8e8e' },\n                    notes: {\n                        icon: {\n                            background: '#3b3b3b',\n                            border: { color: '#8e8e8e' }\n                        },\n                        label: { color: WHITE },\n                        line: { color: '#8e8e8e' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#0070e4' },\n                scale: {\n                    rangePlaceholderColor: '#1d1d1d',\n                    labels: { color: WHITE },\n                    minorTicks: { color: WHITE },\n                    majorTicks: { color: WHITE },\n                    line: { color: WHITE }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#0066cc' },\n                    connectorDefaults: {\n                        fill: { color: WHITE },\n                        stroke: { color: '#384049' },\n                        hover: {\n                            fill: { color: '#3d3d3d' },\n                            stroke: { color: '#efefef' }\n                        }\n                    },\n                    content: { color: WHITE }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: '#3d3d3d' },\n                            stroke: { color: WHITE },\n                            hover: {\n                                fill: { color: WHITE },\n                                stroke: { color: WHITE }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: WHITE },\n                            fill: { color: WHITE }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: WHITE } },\n                connectionDefaults: {\n                    stroke: { color: WHITE },\n                    content: { color: WHITE },\n                    selection: {\n                        handles: {\n                            fill: { color: '#3d3d3d' },\n                            stroke: { color: '#efefef' }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#0081da',\n                        '#314b5c'\n                    ],\n                    [\n                        '#3aafff',\n                        '#3c5464'\n                    ],\n                    [\n                        '#99c900',\n                        '#4f5931'\n                    ],\n                    [\n                        '#ffeb3d',\n                        '#64603d'\n                    ],\n                    [\n                        '#b20753',\n                        '#543241'\n                    ],\n                    [\n                        '#ff4195',\n                        '#643e4f'\n                    ]\n                ]\n            }\n        });\n        registerTheme('blueopal', {\n            chart: {\n                title: { color: '#293135' },\n                legend: {\n                    labels: { color: '#293135' },\n                    inactiveItems: {\n                        labels: { color: '#27A5BA' },\n                        markers: { color: '#27A5BA' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: {\n                        color: BLACK,\n                        background: WHITE,\n                        opacity: 0.5\n                    },\n                    errorBars: { color: '#293135' },\n                    candlestick: {\n                        downColor: '#c4d0d5',\n                        line: { color: '#9aabb2' }\n                    },\n                    waterfall: { line: { color: '#9aabb2' } },\n                    horizontalWaterfall: { line: { color: '#9aabb2' } },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#9aabb2' }\n                        },\n                        label: { color: '#293135' },\n                        line: { color: '#9aabb2' }\n                    }\n                },\n                seriesColors: [\n                    '#0069a5',\n                    '#0098ee',\n                    '#7bd2f6',\n                    '#ffb800',\n                    '#ff8517',\n                    '#e34a00'\n                ],\n                axisDefaults: {\n                    line: { color: '#9aabb2' },\n                    labels: { color: '#293135' },\n                    majorGridLines: { color: '#c4d0d5' },\n                    minorGridLines: { color: '#edf1f2' },\n                    title: { color: '#293135' },\n                    crosshair: { color: '#9aabb2' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#9aabb2' }\n                        },\n                        label: { color: '#293135' },\n                        line: { color: '#9aabb2' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#005c83' },\n                scale: {\n                    rangePlaceholderColor: '#daecf4',\n                    labels: { color: '#293135' },\n                    minorTicks: { color: '#293135' },\n                    majorTicks: { color: '#293135' },\n                    line: { color: '#293135' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#7ec6e3' },\n                    connectorDefaults: {\n                        fill: { color: '#003f59' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#003f59' }\n                        }\n                    },\n                    content: { color: '#293135' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#003f59' },\n                            hover: {\n                                fill: { color: '#003f59' },\n                                stroke: { color: '#003f59' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#003f59' },\n                            fill: { color: '#003f59' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#003f59' } },\n                connectionDefaults: {\n                    stroke: { color: '#003f59' },\n                    content: { color: '#293135' },\n                    selection: {\n                        handles: {\n                            fill: { color: '#3d3d3d' },\n                            stroke: { color: '#efefef' }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#0069a5',\n                        '#bad7e7'\n                    ],\n                    [\n                        '#0098ee',\n                        '#b9e0f5'\n                    ],\n                    [\n                        '#7bd2f6',\n                        '#ceeaf6'\n                    ],\n                    [\n                        '#ffb800',\n                        '#e6e3c4'\n                    ],\n                    [\n                        '#ff8517',\n                        '#e4d8c8'\n                    ],\n                    [\n                        '#e34a00',\n                        '#ddccc2'\n                    ]\n                ]\n            }\n        });\n        registerTheme('highcontrast', {\n            chart: {\n                title: { color: '#ffffff' },\n                legend: {\n                    labels: { color: '#ffffff' },\n                    inactiveItems: {\n                        labels: { color: '#66465B' },\n                        markers: { color: '#66465B' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#ffffff' },\n                    errorBars: { color: '#ffffff' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#ffffff' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#ffffff' }\n                    },\n                    pie: { overlay: { gradient: 'sharpGlass' } },\n                    donut: { overlay: { gradient: 'sharpGlass' } },\n                    line: { markers: { background: '#2c232b' } },\n                    scatter: { markers: { background: '#2c232b' } },\n                    scatterLine: { markers: { background: '#2c232b' } },\n                    area: { opacity: 0.5 },\n                    waterfall: { line: { color: '#ffffff' } },\n                    horizontalWaterfall: { line: { color: '#ffffff' } },\n                    candlestick: {\n                        downColor: '#664e62',\n                        line: { color: '#ffffff' },\n                        border: {\n                            _brightness: 1.5,\n                            opacity: 1\n                        },\n                        highlight: {\n                            border: {\n                                color: '#ffffff',\n                                opacity: 1\n                            }\n                        }\n                    },\n                    ohlc: { line: { color: '#ffffff' } }\n                },\n                chartArea: { background: '#2c232b' },\n                seriesColors: [\n                    '#a7008f',\n                    '#ffb800',\n                    '#3aafff',\n                    '#99c900',\n                    '#b20753',\n                    '#ff4195'\n                ],\n                axisDefaults: {\n                    line: { color: '#ffffff' },\n                    labels: { color: '#ffffff' },\n                    majorGridLines: { color: '#664e62' },\n                    minorGridLines: { color: '#4f394b' },\n                    title: { color: '#ffffff' },\n                    crosshair: { color: '#ffffff' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#ffffff' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#ffffff' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#a7008f' },\n                scale: {\n                    rangePlaceholderColor: '#2c232b',\n                    labels: { color: '#ffffff' },\n                    minorTicks: { color: '#2c232b' },\n                    majorTicks: { color: '#664e62' },\n                    line: { color: '#ffffff' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#a7018f' },\n                    connectorDefaults: {\n                        fill: { color: WHITE },\n                        stroke: { color: '#2c232b' },\n                        hover: {\n                            fill: { color: '#2c232b' },\n                            stroke: { color: WHITE }\n                        }\n                    },\n                    content: { color: WHITE }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: '#2c232b' },\n                            stroke: { color: WHITE },\n                            hover: {\n                                fill: { color: WHITE },\n                                stroke: { color: WHITE }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: WHITE },\n                            fill: { color: WHITE }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: WHITE } },\n                connectionDefaults: {\n                    stroke: { color: WHITE },\n                    content: { color: WHITE },\n                    selection: {\n                        handles: {\n                            fill: { color: '#2c232b' },\n                            stroke: { color: WHITE }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#a7008f',\n                        '#451c3f'\n                    ],\n                    [\n                        '#ffb800',\n                        '#564122'\n                    ],\n                    [\n                        '#3aafff',\n                        '#2f3f55'\n                    ],\n                    [\n                        '#99c900',\n                        '#424422'\n                    ],\n                    [\n                        '#b20753',\n                        '#471d33'\n                    ],\n                    [\n                        '#ff4195',\n                        '#562940'\n                    ]\n                ]\n            }\n        });\n        registerTheme('default', {\n            chart: {\n                title: { color: '#8e8e8e' },\n                legend: {\n                    labels: { color: '#232323' },\n                    inactiveItems: {\n                        labels: { color: '#919191' },\n                        markers: { color: '#919191' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: {\n                        color: BLACK,\n                        background: WHITE,\n                        opacity: 0.5\n                    },\n                    errorBars: { color: '#232323' },\n                    candlestick: {\n                        downColor: '#dedede',\n                        line: { color: '#8d8d8d' }\n                    },\n                    waterfall: { line: { color: '#8e8e8e' } },\n                    horizontalWaterfall: { line: { color: '#8e8e8e' } },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#8e8e8e' }\n                        },\n                        label: { color: '#232323' },\n                        line: { color: '#8e8e8e' }\n                    }\n                },\n                seriesColors: [\n                    '#ff6800',\n                    '#a0a700',\n                    '#ff8d00',\n                    '#678900',\n                    '#ffb53c',\n                    '#396000'\n                ],\n                axisDefaults: {\n                    line: { color: '#8e8e8e' },\n                    labels: { color: '#232323' },\n                    minorGridLines: { color: '#f0f0f0' },\n                    majorGridLines: { color: '#dfdfdf' },\n                    title: { color: '#232323' },\n                    crosshair: { color: '#8e8e8e' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#8e8e8e' }\n                        },\n                        label: { color: '#232323' },\n                        line: { color: '#8e8e8e' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#ea7001' },\n                scale: {\n                    rangePlaceholderColor: '#dedede',\n                    labels: { color: '#2e2e2e' },\n                    minorTicks: { color: '#2e2e2e' },\n                    majorTicks: { color: '#2e2e2e' },\n                    line: { color: '#2e2e2e' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#e15613' },\n                    connectorDefaults: {\n                        fill: { color: '#282828' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#282828' }\n                        }\n                    },\n                    content: { color: '#2e2e2e' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#282828' },\n                            hover: {\n                                fill: { color: '#282828' },\n                                stroke: { color: '#282828' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#282828' },\n                            fill: { color: '#282828' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#a7018f' } },\n                connectionDefaults: {\n                    stroke: { color: '#282828' },\n                    content: { color: '#2e2e2e' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#282828' }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#ff6800',\n                        '#edcfba'\n                    ],\n                    [\n                        '#a0a700',\n                        '#dadcba'\n                    ],\n                    [\n                        '#ff8d00',\n                        '#edd7ba'\n                    ],\n                    [\n                        '#678900',\n                        '#cfd6ba'\n                    ],\n                    [\n                        '#ffb53c',\n                        '#eddfc6'\n                    ],\n                    [\n                        '#396000',\n                        '#c6ceba'\n                    ]\n                ]\n            }\n        });\n        registerTheme('silver', {\n            chart: {\n                title: { color: '#4e5968' },\n                legend: {\n                    labels: { color: '#4e5968' },\n                    inactiveItems: {\n                        labels: { color: '#B1BCC8' },\n                        markers: { color: '#B1BCC8' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: {\n                        color: '#293135',\n                        background: '#eaeaec',\n                        opacity: 0.5\n                    },\n                    errorBars: { color: '#4e5968' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#4e5968' }\n                        },\n                        label: { color: '#4e5968' },\n                        line: { color: '#4e5968' }\n                    },\n                    line: { markers: { background: '#eaeaec' } },\n                    scatter: { markers: { background: '#eaeaec' } },\n                    scatterLine: { markers: { background: '#eaeaec' } },\n                    pie: { connectors: { color: '#A6B1C0' } },\n                    donut: { connectors: { color: '#A6B1C0' } },\n                    waterfall: { line: { color: '#a6b1c0' } },\n                    horizontalWaterfall: { line: { color: '#a6b1c0' } },\n                    candlestick: { downColor: '#a6afbe' }\n                },\n                chartArea: { background: '#eaeaec' },\n                seriesColors: [\n                    '#007bc3',\n                    '#76b800',\n                    '#ffae00',\n                    '#ef4c00',\n                    '#a419b7',\n                    '#430B62'\n                ],\n                axisDefaults: {\n                    line: { color: '#a6b1c0' },\n                    labels: { color: '#4e5968' },\n                    majorGridLines: { color: '#dcdcdf' },\n                    minorGridLines: { color: '#eeeeef' },\n                    title: { color: '#4e5968' },\n                    crosshair: { color: '#a6b1c0' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#4e5968' }\n                        },\n                        label: { color: '#4e5968' },\n                        line: { color: '#4e5968' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#0879c0' },\n                scale: {\n                    rangePlaceholderColor: '#f3f3f4',\n                    labels: { color: '#515967' },\n                    minorTicks: { color: '#515967' },\n                    majorTicks: { color: '#515967' },\n                    line: { color: '#515967' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#1c82c2' },\n                    connectorDefaults: {\n                        fill: { color: '#515967' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#282828' }\n                        }\n                    },\n                    content: { color: '#515967' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#515967' },\n                            hover: {\n                                fill: { color: '#515967' },\n                                stroke: { color: '#515967' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#515967' },\n                            fill: { color: '#515967' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#515967' } },\n                connectionDefaults: {\n                    stroke: { color: '#515967' },\n                    content: { color: '#515967' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#515967' }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#007bc3',\n                        '#c2dbea'\n                    ],\n                    [\n                        '#76b800',\n                        '#dae7c3'\n                    ],\n                    [\n                        '#ffae00',\n                        '#f5e5c3'\n                    ],\n                    [\n                        '#ef4c00',\n                        '#f2d2c3'\n                    ],\n                    [\n                        '#a419b7',\n                        '#e3c7e8'\n                    ],\n                    [\n                        '#430b62',\n                        '#d0c5d7'\n                    ]\n                ]\n            }\n        });\n        registerTheme('metro', {\n            chart: {\n                title: { color: '#777777' },\n                legend: {\n                    labels: { color: '#777777' },\n                    inactiveItems: {\n                        labels: { color: '#CBCBCB' },\n                        markers: { color: '#CBCBCB' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: BLACK },\n                    errorBars: { color: '#777777' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#777777' }\n                        },\n                        label: { color: '#777777' },\n                        line: { color: '#777777' }\n                    },\n                    candlestick: {\n                        downColor: '#c7c7c7',\n                        line: { color: '#787878' }\n                    },\n                    waterfall: { line: { color: '#c7c7c7' } },\n                    horizontalWaterfall: { line: { color: '#c7c7c7' } },\n                    overlay: { gradient: 'none' },\n                    border: { _brightness: 1 }\n                },\n                seriesColors: [\n                    '#8ebc00',\n                    '#309b46',\n                    '#25a0da',\n                    '#ff6900',\n                    '#e61e26',\n                    '#d8e404',\n                    '#16aba9',\n                    '#7e51a1',\n                    '#313131',\n                    '#ed1691'\n                ],\n                axisDefaults: {\n                    line: { color: '#c7c7c7' },\n                    labels: { color: '#777777' },\n                    minorGridLines: { color: '#c7c7c7' },\n                    majorGridLines: { color: '#c7c7c7' },\n                    title: { color: '#777777' },\n                    crosshair: { color: '#c7c7c7' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#777777' }\n                        },\n                        label: { color: '#777777' },\n                        line: { color: '#777777' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#8ebc00' },\n                scale: {\n                    rangePlaceholderColor: '#e6e6e6',\n                    labels: { color: '#777' },\n                    minorTicks: { color: '#777' },\n                    majorTicks: { color: '#777' },\n                    line: { color: '#777' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#8ebc00' },\n                    connectorDefaults: {\n                        fill: { color: BLACK },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: BLACK }\n                        }\n                    },\n                    content: { color: '#777' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#787878' },\n                            hover: {\n                                fill: { color: '#787878' },\n                                stroke: { color: '#787878' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#787878' },\n                            fill: { color: '#787878' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#515967' } },\n                connectionDefaults: {\n                    stroke: { color: '#787878' },\n                    content: { color: '#777' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#787878' }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#8ebc00',\n                        '#e8f2cc'\n                    ],\n                    [\n                        '#309b46',\n                        '#d6ebda'\n                    ],\n                    [\n                        '#25a0da',\n                        '#d3ecf8'\n                    ],\n                    [\n                        '#ff6900',\n                        '#ffe1cc'\n                    ],\n                    [\n                        '#e61e26',\n                        '#fad2d4'\n                    ],\n                    [\n                        '#d8e404',\n                        '#f7facd'\n                    ],\n                    [\n                        '#16aba9',\n                        '#d0eeee'\n                    ],\n                    [\n                        '#7e51a1',\n                        '#e5dcec'\n                    ],\n                    [\n                        '#313131',\n                        '#d6d6d6'\n                    ],\n                    [\n                        '#ed1691',\n                        '#fbd0e9'\n                    ]\n                ]\n            }\n        });\n        registerTheme('metroblack', {\n            chart: {\n                title: { color: '#ffffff' },\n                legend: {\n                    labels: { color: '#ffffff' },\n                    inactiveItems: {\n                        labels: { color: '#797979' },\n                        markers: { color: '#797979' }\n                    }\n                },\n                seriesDefaults: {\n                    border: { _brightness: 1 },\n                    labels: { color: '#ffffff' },\n                    errorBars: { color: '#ffffff' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#cecece' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#cecece' }\n                    },\n                    line: { markers: { background: '#0e0e0e' } },\n                    bubble: { opacity: 0.6 },\n                    scatter: { markers: { background: '#0e0e0e' } },\n                    scatterLine: { markers: { background: '#0e0e0e' } },\n                    candlestick: {\n                        downColor: '#828282',\n                        line: { color: '#ffffff' }\n                    },\n                    waterfall: { line: { color: '#cecece' } },\n                    horizontalWaterfall: { line: { color: '#cecece' } },\n                    overlay: { gradient: 'none' }\n                },\n                chartArea: { background: '#0e0e0e' },\n                seriesColors: [\n                    '#00aba9',\n                    '#309b46',\n                    '#8ebc00',\n                    '#ff6900',\n                    '#e61e26',\n                    '#d8e404',\n                    '#25a0da',\n                    '#7e51a1',\n                    '#313131',\n                    '#ed1691'\n                ],\n                axisDefaults: {\n                    line: { color: '#cecece' },\n                    labels: { color: '#ffffff' },\n                    minorGridLines: { color: '#2d2d2d' },\n                    majorGridLines: { color: '#333333' },\n                    title: { color: '#ffffff' },\n                    crosshair: { color: '#cecece' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#cecece' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#cecece' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#00aba9' },\n                scale: {\n                    rangePlaceholderColor: '#2d2d2d',\n                    labels: { color: '#ffffff' },\n                    minorTicks: { color: '#333333' },\n                    majorTicks: { color: '#cecece' },\n                    line: { color: '#cecece' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#00aba9' },\n                    connectorDefaults: {\n                        fill: { color: WHITE },\n                        stroke: { color: '#0e0e0e' },\n                        hover: {\n                            fill: { color: '#0e0e0e' },\n                            stroke: { color: WHITE }\n                        }\n                    },\n                    content: { color: WHITE }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: '#0e0e0e' },\n                            stroke: { color: '#787878' },\n                            hover: {\n                                fill: { color: '#787878' },\n                                stroke: { color: '#787878' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: WHITE },\n                            fill: { color: WHITE }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#787878' } },\n                connectionDefaults: {\n                    stroke: { color: WHITE },\n                    content: { color: WHITE },\n                    selection: {\n                        handles: {\n                            fill: { color: '#0e0e0e' },\n                            stroke: { color: WHITE }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#00aba9',\n                        '#0b2d2d'\n                    ],\n                    [\n                        '#309b46',\n                        '#152a19'\n                    ],\n                    [\n                        '#8ebc00',\n                        '#28310b'\n                    ],\n                    [\n                        '#ff6900',\n                        '#3e200b'\n                    ],\n                    [\n                        '#e61e26',\n                        '#391113'\n                    ],\n                    [\n                        '#d8e404',\n                        '#36390c'\n                    ],\n                    [\n                        '#25a0da',\n                        '#132b37'\n                    ],\n                    [\n                        '#7e51a1',\n                        '#241b2b'\n                    ],\n                    [\n                        '#313131',\n                        '#151515'\n                    ],\n                    [\n                        '#ed1691',\n                        '#3b1028'\n                    ]\n                ]\n            }\n        });\n        registerTheme('moonlight', {\n            chart: {\n                title: { color: '#ffffff' },\n                legend: {\n                    labels: { color: '#ffffff' },\n                    inactiveItems: {\n                        labels: { color: '#A1A7AB' },\n                        markers: { color: '#A1A7AB' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#ffffff' },\n                    errorBars: { color: '#ffffff' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#8c909e' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#8c909e' }\n                    },\n                    pie: { overlay: { gradient: 'sharpBevel' } },\n                    donut: { overlay: { gradient: 'sharpGlass' } },\n                    line: { markers: { background: '#212a33' } },\n                    bubble: { opacity: 0.6 },\n                    scatter: { markers: { background: '#212a33' } },\n                    scatterLine: { markers: { background: '#212a33' } },\n                    area: { opacity: 0.3 },\n                    candlestick: {\n                        downColor: '#757d87',\n                        line: { color: '#ea9d06' },\n                        border: {\n                            _brightness: 1.5,\n                            opacity: 1\n                        },\n                        highlight: {\n                            border: {\n                                color: WHITE,\n                                opacity: 0.2\n                            }\n                        }\n                    },\n                    waterfall: { line: { color: '#8c909e' } },\n                    horizontalWaterfall: { line: { color: '#8c909e' } },\n                    ohlc: { line: { color: '#ea9d06' } }\n                },\n                chartArea: { background: '#212a33' },\n                seriesColors: [\n                    '#ffca08',\n                    '#ff710f',\n                    '#ed2e24',\n                    '#ff9f03',\n                    '#e13c02',\n                    '#a00201'\n                ],\n                axisDefaults: {\n                    line: { color: '#8c909e' },\n                    minorTicks: { color: '#8c909e' },\n                    majorTicks: { color: '#8c909e' },\n                    labels: { color: '#ffffff' },\n                    majorGridLines: { color: '#3e424d' },\n                    minorGridLines: { color: '#2f3640' },\n                    title: { color: '#ffffff' },\n                    crosshair: { color: '#8c909e' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#8c909e' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#8c909e' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#f4af03' },\n                scale: {\n                    rangePlaceholderColor: '#2f3640',\n                    labels: { color: WHITE },\n                    minorTicks: { color: '#8c909e' },\n                    majorTicks: { color: '#8c909e' },\n                    line: { color: '#8c909e' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#f3ae03' },\n                    connectorDefaults: {\n                        fill: { color: WHITE },\n                        stroke: { color: '#414550' },\n                        hover: {\n                            fill: { color: '#414550' },\n                            stroke: { color: WHITE }\n                        }\n                    },\n                    content: { color: WHITE }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: '#414550' },\n                            stroke: { color: WHITE },\n                            hover: {\n                                fill: { color: WHITE },\n                                stroke: { color: WHITE }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: WHITE },\n                            fill: { color: WHITE }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: WHITE } },\n                connectionDefaults: {\n                    stroke: { color: WHITE },\n                    content: { color: WHITE },\n                    selection: {\n                        handles: {\n                            fill: { color: '#414550' },\n                            stroke: { color: WHITE }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#ffca08',\n                        '#4e4b2b'\n                    ],\n                    [\n                        '#ff710f',\n                        '#4e392d'\n                    ],\n                    [\n                        '#ed2e24',\n                        '#4b2c31'\n                    ],\n                    [\n                        '#ff9f03',\n                        '#4e422a'\n                    ],\n                    [\n                        '#e13c02',\n                        '#482e2a'\n                    ],\n                    [\n                        '#a00201',\n                        '#3b232a'\n                    ]\n                ]\n            }\n        });\n        registerTheme('uniform', {\n            chart: {\n                title: { color: '#686868' },\n                legend: {\n                    labels: { color: '#686868' },\n                    inactiveItems: {\n                        labels: { color: '#B6B6B6' },\n                        markers: { color: '#B6B6B6' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#686868' },\n                    errorBars: { color: '#686868' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#9e9e9e' }\n                        },\n                        label: { color: '#686868' },\n                        line: { color: '#9e9e9e' }\n                    },\n                    pie: { overlay: { gradient: 'sharpBevel' } },\n                    donut: { overlay: { gradient: 'sharpGlass' } },\n                    line: { markers: { background: '#ffffff' } },\n                    bubble: { opacity: 0.6 },\n                    scatter: { markers: { background: '#ffffff' } },\n                    scatterLine: { markers: { background: '#ffffff' } },\n                    area: { opacity: 0.3 },\n                    candlestick: {\n                        downColor: '#cccccc',\n                        line: { color: '#cccccc' },\n                        border: {\n                            _brightness: 1.5,\n                            opacity: 1\n                        },\n                        highlight: {\n                            border: {\n                                color: '#cccccc',\n                                opacity: 0.2\n                            }\n                        }\n                    },\n                    waterfall: { line: { color: '#9e9e9e' } },\n                    horizontalWaterfall: { line: { color: '#9e9e9e' } },\n                    ohlc: { line: { color: '#cccccc' } }\n                },\n                chartArea: { background: '#ffffff' },\n                seriesColors: [\n                    '#527aa3',\n                    '#6f91b3',\n                    '#8ca7c2',\n                    '#a8bdd1',\n                    '#c5d3e0',\n                    '#e2e9f0'\n                ],\n                axisDefaults: {\n                    line: { color: '#9e9e9e' },\n                    minorTicks: { color: '#aaaaaa' },\n                    majorTicks: { color: '#888888' },\n                    labels: { color: '#686868' },\n                    majorGridLines: { color: '#dadada' },\n                    minorGridLines: { color: '#e7e7e7' },\n                    title: { color: '#686868' },\n                    crosshair: { color: '#9e9e9e' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#9e9e9e' }\n                        },\n                        label: { color: '#686868' },\n                        line: { color: '#9e9e9e' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#527aa3' },\n                scale: {\n                    rangePlaceholderColor: '#e7e7e7',\n                    labels: { color: '#686868' },\n                    minorTicks: { color: '#aaaaaa' },\n                    majorTicks: { color: '#888888' },\n                    line: { color: '#9e9e9e' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#d1d1d1' },\n                    connectorDefaults: {\n                        fill: { color: '#686868' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#686868' }\n                        }\n                    },\n                    content: { color: '#686868' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#686868' },\n                            hover: {\n                                fill: { color: '#686868' },\n                                stroke: { color: '#686868' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#686868' },\n                            fill: { color: '#686868' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#686868' } },\n                connectionDefaults: {\n                    stroke: { color: '#686868' },\n                    content: { color: '#686868' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#686868' }\n                        }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#527aa3',\n                        '#d0d8e1'\n                    ],\n                    [\n                        '#6f91b3',\n                        '#d6dde4'\n                    ],\n                    [\n                        '#8ca7c2',\n                        '#dce1e7'\n                    ],\n                    [\n                        '#a8bdd1',\n                        '#e2e6ea'\n                    ],\n                    [\n                        '#c5d3e0',\n                        '#e7eaed'\n                    ],\n                    [\n                        '#e2e9f0',\n                        '#edeff0'\n                    ]\n                ]\n            }\n        });\n        registerTheme('bootstrap', {\n            chart: {\n                title: { color: '#333333' },\n                legend: {\n                    labels: { color: '#333333' },\n                    inactiveItems: {\n                        labels: { color: '#999999' },\n                        markers: { color: '#9A9A9A' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#333333' },\n                    overlay: { gradient: 'none' },\n                    errorBars: { color: '#343434' },\n                    notes: {\n                        icon: {\n                            background: '#000000',\n                            border: { color: '#000000' }\n                        },\n                        label: { color: '#333333' },\n                        line: { color: '#000000' }\n                    },\n                    pie: { overlay: { gradient: 'none' } },\n                    donut: { overlay: { gradient: 'none' } },\n                    line: { markers: { background: '#ffffff' } },\n                    bubble: { opacity: 0.6 },\n                    scatter: { markers: { background: '#ffffff' } },\n                    scatterLine: { markers: { background: '#ffffff' } },\n                    area: { opacity: 0.8 },\n                    candlestick: {\n                        downColor: '#d0d0d0',\n                        line: { color: '#333333' },\n                        border: {\n                            _brightness: 1.5,\n                            opacity: 1\n                        },\n                        highlight: {\n                            border: {\n                                color: '#b8b8b8',\n                                opacity: 0.2\n                            }\n                        }\n                    },\n                    waterfall: { line: { color: '#cccccc' } },\n                    horizontalWaterfall: { line: { color: '#cccccc' } },\n                    ohlc: { line: { color: '#333333' } }\n                },\n                chartArea: { background: '#ffffff' },\n                seriesColors: [\n                    '#428bca',\n                    '#5bc0de',\n                    '#5cb85c',\n                    '#f2b661',\n                    '#e67d4a',\n                    '#da3b36'\n                ],\n                axisDefaults: {\n                    line: { color: '#cccccc' },\n                    minorTicks: { color: '#ebebeb' },\n                    majorTicks: { color: '#cccccc' },\n                    labels: { color: '#333333' },\n                    majorGridLines: { color: '#cccccc' },\n                    minorGridLines: { color: '#ebebeb' },\n                    title: { color: '#333333' },\n                    crosshair: { color: '#000000' },\n                    notes: {\n                        icon: {\n                            background: '#000000',\n                            border: { color: '#000000' }\n                        },\n                        label: { color: '#ffffff' },\n                        line: { color: '#000000' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#428bca' },\n                scale: {\n                    rangePlaceholderColor: '#cccccc',\n                    labels: { color: '#333333' },\n                    minorTicks: { color: '#ebebeb' },\n                    majorTicks: { color: '#cccccc' },\n                    line: { color: '#cccccc' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#428bca' },\n                    connectorDefaults: {\n                        fill: { color: '#333333' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#333333' }\n                        }\n                    },\n                    content: { color: '#333333' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#333333' },\n                            hover: {\n                                fill: { color: '#333333' },\n                                stroke: { color: '#333333' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#333333' },\n                            fill: { color: '#333333' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#333333' } },\n                connectionDefaults: {\n                    stroke: { color: '#c4c4c4' },\n                    content: { color: '#333333' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#333333' }\n                        },\n                        stroke: { color: '#333333' }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#428bca',\n                        '#d1e0ec'\n                    ],\n                    [\n                        '#5bc0de',\n                        '#d6eaf0'\n                    ],\n                    [\n                        '#5cb85c',\n                        '#d6e9d6'\n                    ],\n                    [\n                        '#5cb85c',\n                        '#f4e8d7'\n                    ],\n                    [\n                        '#e67d4a',\n                        '#f2ddd3'\n                    ],\n                    [\n                        '#da3b36',\n                        '#f0d0cf'\n                    ]\n                ]\n            }\n        });\n        registerTheme('flat', {\n            chart: {\n                title: { color: '#4c5356' },\n                legend: {\n                    labels: { color: '#4c5356' },\n                    inactiveItems: {\n                        labels: { color: '#CBCBCB' },\n                        markers: { color: '#CBCBCB' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#4c5356' },\n                    errorBars: { color: '#4c5356' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#cdcdcd' }\n                        },\n                        label: { color: '#4c5356' },\n                        line: { color: '#cdcdcd' }\n                    },\n                    candlestick: {\n                        downColor: '#c7c7c7',\n                        line: { color: '#787878' }\n                    },\n                    area: { opacity: 0.9 },\n                    waterfall: { line: { color: '#cdcdcd' } },\n                    horizontalWaterfall: { line: { color: '#cdcdcd' } },\n                    overlay: { gradient: 'none' },\n                    border: { _brightness: 1 }\n                },\n                seriesColors: [\n                    '#10c4b2',\n                    '#ff7663',\n                    '#ffb74f',\n                    '#a2df53',\n                    '#1c9ec4',\n                    '#ff63a5',\n                    '#1cc47b'\n                ],\n                axisDefaults: {\n                    line: { color: '#cdcdcd' },\n                    labels: { color: '#4c5356' },\n                    minorGridLines: { color: '#cdcdcd' },\n                    majorGridLines: { color: '#cdcdcd' },\n                    title: { color: '#4c5356' },\n                    crosshair: { color: '#cdcdcd' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#cdcdcd' }\n                        },\n                        label: { color: '#4c5356' },\n                        line: { color: '#cdcdcd' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#10c4b2' },\n                scale: {\n                    rangePlaceholderColor: '#cdcdcd',\n                    labels: { color: '#4c5356' },\n                    minorTicks: { color: '#4c5356' },\n                    majorTicks: { color: '#4c5356' },\n                    line: { color: '#4c5356' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#10c4b2' },\n                    connectorDefaults: {\n                        fill: { color: '#363940' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#363940' }\n                        }\n                    },\n                    content: { color: '#4c5356' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#363940' },\n                            hover: {\n                                fill: { color: '#363940' },\n                                stroke: { color: '#363940' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#363940' },\n                            fill: { color: '#363940' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#363940' } },\n                connectionDefaults: {\n                    stroke: { color: '#cdcdcd' },\n                    content: { color: '#4c5356' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#363940' }\n                        },\n                        stroke: { color: '#363940' }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#10c4b2',\n                        '#cff3f0'\n                    ],\n                    [\n                        '#ff7663',\n                        '#ffe4e0'\n                    ],\n                    [\n                        '#ffb74f',\n                        '#fff1dc'\n                    ],\n                    [\n                        '#a2df53',\n                        '#ecf9dd'\n                    ],\n                    [\n                        '#1c9ec4',\n                        '#d2ecf3'\n                    ],\n                    [\n                        '#ff63a5',\n                        '#ffe0ed'\n                    ],\n                    [\n                        '#1cc47b',\n                        '#d2f3e5'\n                    ]\n                ]\n            }\n        });\n        registerTheme('material', {\n            chart: {\n                title: { color: '#444444' },\n                legend: {\n                    labels: { color: '#444444' },\n                    inactiveItems: {\n                        labels: { color: '#CBCBCB' },\n                        markers: { color: '#CBCBCB' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#444444' },\n                    errorBars: { color: '#444444' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#e5e5e5' }\n                        },\n                        label: { color: '#444444' },\n                        line: { color: '#e5e5e5' }\n                    },\n                    candlestick: {\n                        downColor: '#c7c7c7',\n                        line: { color: '#787878' }\n                    },\n                    area: { opacity: 0.9 },\n                    waterfall: { line: { color: '#e5e5e5' } },\n                    horizontalWaterfall: { line: { color: '#e5e5e5' } },\n                    overlay: { gradient: 'none' },\n                    border: { _brightness: 1 }\n                },\n                seriesColors: [\n                    '#3f51b5',\n                    '#03a9f4',\n                    '#4caf50',\n                    '#f9ce1d',\n                    '#ff9800',\n                    '#ff5722'\n                ],\n                axisDefaults: {\n                    line: { color: '#e5e5e5' },\n                    labels: { color: '#444444' },\n                    minorGridLines: { color: '#e5e5e5' },\n                    majorGridLines: { color: '#e5e5e5' },\n                    title: { color: '#444444' },\n                    crosshair: { color: '#7f7f7f' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#e5e5e5' }\n                        },\n                        label: { color: '#444444' },\n                        line: { color: '#e5e5e5' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#3f51b5' },\n                scale: {\n                    rangePlaceholderColor: '#e5e5e5',\n                    labels: { color: '#444444' },\n                    minorTicks: { color: '#444444' },\n                    majorTicks: { color: '#444444' },\n                    line: { color: '#444444' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#3f51b5' },\n                    connectorDefaults: {\n                        fill: { color: '#7f7f7f' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#7f7f7f' }\n                        }\n                    },\n                    content: { color: '#444444' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#444444' },\n                            hover: {\n                                fill: { color: '#444444' },\n                                stroke: { color: '#444444' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#444444' },\n                            fill: { color: '#444444' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#444444' } },\n                connectionDefaults: {\n                    stroke: { color: '#7f7f7f' },\n                    content: { color: '#444444' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#444444' }\n                        },\n                        stroke: { color: '#444444' }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#3f51b5',\n                        '#cff3f0'\n                    ],\n                    [\n                        '#03a9f4',\n                        '#e5f6fe'\n                    ],\n                    [\n                        '#4caf50',\n                        '#edf7ed'\n                    ],\n                    [\n                        '#f9ce1d',\n                        '#fefae8'\n                    ],\n                    [\n                        '#ff9800',\n                        '#fff4e5'\n                    ],\n                    [\n                        '#ff5722',\n                        '#ffeee8'\n                    ]\n                ]\n            }\n        });\n        registerTheme('materialblack', {\n            chart: {\n                title: { color: '#fff' },\n                legend: {\n                    labels: { color: '#fff' },\n                    inactiveItems: {\n                        labels: { color: '#CBCBCB' },\n                        markers: { color: '#CBCBCB' }\n                    }\n                },\n                seriesDefaults: {\n                    labels: { color: '#fff' },\n                    errorBars: { color: '#fff' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#e5e5e5' }\n                        },\n                        label: { color: '#fff' },\n                        line: { color: '#e5e5e5' }\n                    },\n                    candlestick: {\n                        downColor: '#c7c7c7',\n                        line: { color: '#787878' }\n                    },\n                    area: { opacity: 0.9 },\n                    waterfall: { line: { color: '#4d4d4d' } },\n                    horizontalWaterfall: { line: { color: '#4d4d4d' } },\n                    overlay: { gradient: 'none' },\n                    border: { _brightness: 1 }\n                },\n                chartArea: { background: '#1c1c1c' },\n                seriesColors: [\n                    '#3f51b5',\n                    '#03a9f4',\n                    '#4caf50',\n                    '#f9ce1d',\n                    '#ff9800',\n                    '#ff5722'\n                ],\n                axisDefaults: {\n                    line: { color: '#4d4d4d' },\n                    labels: { color: '#fff' },\n                    minorGridLines: { color: '#4d4d4d' },\n                    majorGridLines: { color: '#4d4d4d' },\n                    title: { color: '#fff' },\n                    crosshair: { color: '#7f7f7f' },\n                    notes: {\n                        icon: {\n                            background: 'transparent',\n                            border: { color: '#4d4d4d' }\n                        },\n                        label: { color: '#fff' },\n                        line: { color: '#4d4d4d' }\n                    }\n                }\n            },\n            gauge: {\n                pointer: { color: '#3f51b5' },\n                scale: {\n                    rangePlaceholderColor: '#4d4d4d',\n                    labels: { color: '#fff' },\n                    minorTicks: { color: '#fff' },\n                    majorTicks: { color: '#fff' },\n                    line: { color: '#fff' }\n                }\n            },\n            diagram: {\n                shapeDefaults: {\n                    fill: { color: '#3f51b5' },\n                    connectorDefaults: {\n                        fill: { color: '#7f7f7f' },\n                        stroke: { color: WHITE },\n                        hover: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#7f7f7f' }\n                        }\n                    },\n                    content: { color: '#fff' }\n                },\n                editable: {\n                    resize: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#fff' },\n                            hover: {\n                                fill: { color: '#fff' },\n                                stroke: { color: '#fff' }\n                            }\n                        }\n                    },\n                    rotate: {\n                        thumb: {\n                            stroke: { color: '#fff' },\n                            fill: { color: '#fff' }\n                        }\n                    }\n                },\n                selectable: { stroke: { color: '#fff' } },\n                connectionDefaults: {\n                    stroke: { color: '#7f7f7f' },\n                    content: { color: '#fff' },\n                    selection: {\n                        handles: {\n                            fill: { color: WHITE },\n                            stroke: { color: '#fff' }\n                        },\n                        stroke: { color: '#fff' }\n                    }\n                }\n            },\n            treeMap: {\n                colors: [\n                    [\n                        '#3f51b5',\n                        '#cff3f0'\n                    ],\n                    [\n                        '#03a9f4',\n                        '#e5f6fe'\n                    ],\n                    [\n                        '#4caf50',\n                        '#edf7ed'\n                    ],\n                    [\n                        '#f9ce1d',\n                        '#fefae8'\n                    ],\n                    [\n                        '#ff9800',\n                        '#fff4e5'\n                    ],\n                    [\n                        '#ff5722',\n                        '#ffeee8'\n                    ]\n                ]\n            }\n        });\n        (function () {\n            var TEXT = '#333333';\n            var INACTIVE = '#7f7f7f';\n            var INACTIVE_SHAPE = '#bdbdbd';\n            var AXIS = '#c8c8c8';\n            var AXIS_MINOR = '#dddddd';\n            var SERIES = [\n                '#008fd3',\n                '#99d101',\n                '#f39b02',\n                '#f05662',\n                '#c03c53',\n                '#acacac'\n            ];\n            var SERIES_LIGHT = [\n                '#cbe8f5',\n                '#eaf5cb',\n                '#fceacc',\n                '#fbdcdf',\n                '#f2d7dc',\n                '#eeeeee'\n            ];\n            var PRIMARY = SERIES[0];\n            var DIAGRAM_HOVER = WHITE;\n            function noteStyle() {\n                return {\n                    icon: {\n                        background: '#007cc0',\n                        border: { color: '#007cc0' }\n                    },\n                    label: { color: '#ffffff' },\n                    line: { color: AXIS }\n                };\n            }\n            registerTheme('fiori', {\n                chart: {\n                    title: { color: TEXT },\n                    legend: {\n                        labels: { color: TEXT },\n                        inactiveItems: {\n                            labels: { color: INACTIVE },\n                            markers: { color: INACTIVE }\n                        }\n                    },\n                    seriesDefaults: {\n                        labels: { color: TEXT },\n                        errorBars: { color: TEXT },\n                        notes: noteStyle(),\n                        candlestick: {\n                            downColor: AXIS,\n                            line: { color: INACTIVE_SHAPE }\n                        },\n                        area: { opacity: 0.8 },\n                        waterfall: { line: { color: AXIS } },\n                        horizontalWaterfall: { line: { color: AXIS } },\n                        overlay: { gradient: 'none' },\n                        border: { _brightness: 1 }\n                    },\n                    seriesColors: SERIES,\n                    axisDefaults: {\n                        line: { color: AXIS },\n                        labels: { color: TEXT },\n                        minorGridLines: { color: AXIS_MINOR },\n                        majorGridLines: { color: AXIS },\n                        title: { color: TEXT },\n                        crosshair: { color: INACTIVE },\n                        notes: noteStyle()\n                    }\n                },\n                gauge: {\n                    pointer: { color: PRIMARY },\n                    scale: {\n                        rangePlaceholderColor: AXIS,\n                        labels: { color: TEXT },\n                        minorTicks: { color: TEXT },\n                        majorTicks: { color: TEXT },\n                        line: { color: TEXT }\n                    }\n                },\n                diagram: {\n                    shapeDefaults: {\n                        fill: { color: PRIMARY },\n                        connectorDefaults: {\n                            fill: { color: TEXT },\n                            stroke: { color: DIAGRAM_HOVER },\n                            hover: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: TEXT }\n                            }\n                        },\n                        content: { color: TEXT }\n                    },\n                    editable: {\n                        resize: {\n                            handles: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: INACTIVE_SHAPE },\n                                hover: {\n                                    fill: { color: INACTIVE_SHAPE },\n                                    stroke: { color: INACTIVE_SHAPE }\n                                }\n                            }\n                        },\n                        rotate: {\n                            thumb: {\n                                stroke: { color: INACTIVE_SHAPE },\n                                fill: { color: INACTIVE_SHAPE }\n                            }\n                        }\n                    },\n                    selectable: { stroke: { color: INACTIVE_SHAPE } },\n                    connectionDefaults: {\n                        stroke: { color: INACTIVE_SHAPE },\n                        content: { color: INACTIVE_SHAPE },\n                        selection: {\n                            handles: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: INACTIVE_SHAPE }\n                            },\n                            stroke: { color: INACTIVE_SHAPE }\n                        }\n                    }\n                },\n                treeMap: { colors: fuse(SERIES, SERIES_LIGHT) }\n            });\n        }());\n        (function () {\n            var TEXT = '#4e4e4e';\n            var INACTIVE = '#7f7f7f';\n            var INACTIVE_SHAPE = '#bdbdbd';\n            var AXIS = '#c8c8c8';\n            var AXIS_MINOR = '#e5e5e5';\n            var SERIES = [\n                '#0072c6',\n                '#5db2ff',\n                '#008a17',\n                '#82ba00',\n                '#ff8f32',\n                '#ac193d'\n            ];\n            var SERIES_LIGHT = [\n                '#cbe2f3',\n                '#deeffe',\n                '#cbe7d0',\n                '#e5f0cb',\n                '#fee8d5',\n                '#eed0d7'\n            ];\n            var PRIMARY = SERIES[0];\n            var DIAGRAM_HOVER = WHITE;\n            function noteStyle() {\n                return {\n                    icon: {\n                        background: '#00b0ff',\n                        border: { color: '#00b0ff' }\n                    },\n                    label: { color: '#ffffff' },\n                    line: { color: AXIS }\n                };\n            }\n            registerTheme('office365', {\n                chart: {\n                    title: { color: TEXT },\n                    legend: {\n                        labels: { color: TEXT },\n                        inactiveItems: {\n                            labels: { color: INACTIVE },\n                            markers: { color: INACTIVE }\n                        }\n                    },\n                    seriesDefaults: {\n                        labels: { color: TEXT },\n                        errorBars: { color: TEXT },\n                        notes: noteStyle(),\n                        candlestick: {\n                            downColor: AXIS,\n                            line: { color: INACTIVE_SHAPE }\n                        },\n                        area: { opacity: 0.8 },\n                        waterfall: { line: { color: AXIS } },\n                        horizontalWaterfall: { line: { color: AXIS } },\n                        overlay: { gradient: 'none' },\n                        border: { _brightness: 1 }\n                    },\n                    seriesColors: SERIES,\n                    axisDefaults: {\n                        line: { color: AXIS },\n                        labels: { color: TEXT },\n                        minorGridLines: { color: AXIS_MINOR },\n                        majorGridLines: { color: AXIS },\n                        title: { color: TEXT },\n                        crosshair: { color: INACTIVE },\n                        notes: noteStyle()\n                    }\n                },\n                gauge: {\n                    pointer: { color: PRIMARY },\n                    scale: {\n                        rangePlaceholderColor: AXIS,\n                        labels: { color: TEXT },\n                        minorTicks: { color: TEXT },\n                        majorTicks: { color: TEXT },\n                        line: { color: TEXT }\n                    }\n                },\n                diagram: {\n                    shapeDefaults: {\n                        fill: { color: PRIMARY },\n                        connectorDefaults: {\n                            fill: { color: TEXT },\n                            stroke: { color: DIAGRAM_HOVER },\n                            hover: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: TEXT }\n                            }\n                        },\n                        content: { color: TEXT }\n                    },\n                    editable: {\n                        resize: {\n                            handles: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: INACTIVE_SHAPE },\n                                hover: {\n                                    fill: { color: INACTIVE_SHAPE },\n                                    stroke: { color: INACTIVE_SHAPE }\n                                }\n                            }\n                        },\n                        rotate: {\n                            thumb: {\n                                stroke: { color: INACTIVE_SHAPE },\n                                fill: { color: INACTIVE_SHAPE }\n                            }\n                        }\n                    },\n                    selectable: { stroke: { color: INACTIVE_SHAPE } },\n                    connectionDefaults: {\n                        stroke: { color: INACTIVE_SHAPE },\n                        content: { color: INACTIVE_SHAPE },\n                        selection: {\n                            handles: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: INACTIVE_SHAPE }\n                            },\n                            stroke: { color: INACTIVE_SHAPE }\n                        }\n                    }\n                },\n                treeMap: { colors: fuse(SERIES, SERIES_LIGHT) }\n            });\n        }());\n        (function () {\n            var TEXT = '#32364c';\n            var INACTIVE = '#7f7f7f';\n            var INACTIVE_SHAPE = '#bdbdbd';\n            var AXIS = '#dfe0e1';\n            var AXIS_MINOR = '#dfe0e1';\n            var SERIES = [\n                '#ff4350',\n                '#ff9ea5',\n                '#00acc1',\n                '#80deea',\n                '#ffbf46',\n                '#ffd78c'\n            ];\n            var SERIES_LIGHT = [\n                '#ffd9dc',\n                '#ffeced',\n                '#cceef3',\n                '#e6f8fb',\n                '#fff2da',\n                '#fff7e8'\n            ];\n            var PRIMARY = SERIES[0];\n            var DIAGRAM_HOVER = WHITE;\n            function noteStyle() {\n                return {\n                    icon: {\n                        background: '#007cc0',\n                        border: { color: '#007cc0' }\n                    },\n                    label: { color: '#ffffff' },\n                    line: { color: AXIS }\n                };\n            }\n            registerTheme('nova', {\n                chart: {\n                    title: { color: TEXT },\n                    legend: {\n                        labels: { color: TEXT },\n                        inactiveItems: {\n                            labels: { color: INACTIVE },\n                            markers: { color: INACTIVE }\n                        }\n                    },\n                    seriesDefaults: {\n                        labels: { color: TEXT },\n                        errorBars: { color: TEXT },\n                        notes: noteStyle(),\n                        candlestick: {\n                            downColor: AXIS,\n                            line: { color: INACTIVE_SHAPE }\n                        },\n                        area: { opacity: 0.8 },\n                        waterfall: { line: { color: AXIS } },\n                        horizontalWaterfall: { line: { color: AXIS } },\n                        overlay: { gradient: 'none' },\n                        border: { _brightness: 1 }\n                    },\n                    seriesColors: SERIES,\n                    axisDefaults: {\n                        line: { color: AXIS },\n                        labels: { color: TEXT },\n                        minorGridLines: { color: AXIS_MINOR },\n                        majorGridLines: { color: AXIS },\n                        title: { color: TEXT },\n                        crosshair: { color: TEXT },\n                        notes: noteStyle()\n                    }\n                },\n                gauge: {\n                    pointer: { color: PRIMARY },\n                    scale: {\n                        rangePlaceholderColor: AXIS,\n                        labels: { color: TEXT },\n                        minorTicks: { color: TEXT },\n                        majorTicks: { color: TEXT },\n                        line: { color: TEXT }\n                    }\n                },\n                diagram: {\n                    shapeDefaults: {\n                        fill: { color: PRIMARY },\n                        connectorDefaults: {\n                            fill: { color: TEXT },\n                            stroke: { color: DIAGRAM_HOVER },\n                            hover: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: TEXT }\n                            }\n                        },\n                        content: { color: TEXT }\n                    },\n                    editable: {\n                        resize: {\n                            handles: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: INACTIVE_SHAPE },\n                                hover: {\n                                    fill: { color: INACTIVE_SHAPE },\n                                    stroke: { color: INACTIVE_SHAPE }\n                                }\n                            }\n                        },\n                        rotate: {\n                            thumb: {\n                                stroke: { color: INACTIVE_SHAPE },\n                                fill: { color: INACTIVE_SHAPE }\n                            }\n                        }\n                    },\n                    selectable: { stroke: { color: INACTIVE_SHAPE } },\n                    connectionDefaults: {\n                        stroke: { color: INACTIVE_SHAPE },\n                        content: { color: INACTIVE_SHAPE },\n                        selection: {\n                            handles: {\n                                fill: { color: DIAGRAM_HOVER },\n                                stroke: { color: INACTIVE_SHAPE }\n                            },\n                            stroke: { color: INACTIVE_SHAPE }\n                        }\n                    }\n                },\n                treeMap: { colors: fuse(SERIES, SERIES_LIGHT) }\n            });\n        }());\n        (function () {\n            var SERIES = [\n                '#ff6358',\n                '#ffd246',\n                '#78d237',\n                '#28b4c8',\n                '#2d73f5',\n                '#aa46be'\n            ];\n            var SERIES_LIGHT = [\n                '#ffd9dc',\n                '#ffeced',\n                '#cceef3',\n                '#e6f8fb',\n                '#fff2da',\n                '#fff7e8'\n            ];\n            registerTheme('default-v2', {\n                chart: {},\n                gauge: {},\n                diagram: {},\n                treeMap: { colors: fuse(SERIES, SERIES_LIGHT) }\n            });\n            themes.sass = themes['default-v2'];\n        }());\n        (function () {\n            var TEXT = '#292b2c';\n            var AXIS = 'rgba(0, 0, 0, .04)';\n            var SERIES = [\n                '#0275d8',\n                '#5bc0de',\n                '#5cb85c',\n                '#f0ad4e',\n                '#e67d4a',\n                '#d9534f'\n            ];\n            var SERIES_LIGHT = [\n                '#ffd9dc',\n                '#ffeced',\n                '#cceef3',\n                '#e6f8fb',\n                '#fff2da',\n                '#fff7e8'\n            ];\n            var PRIMARY = SERIES[0];\n            registerTheme('bootstrap-v4', {\n                chart: {},\n                gauge: {\n                    pointer: { color: PRIMARY },\n                    scale: {\n                        rangePlaceholderColor: AXIS,\n                        labels: { color: TEXT },\n                        minorTicks: { color: TEXT },\n                        majorTicks: { color: TEXT },\n                        line: { color: TEXT }\n                    }\n                },\n                diagram: {},\n                treeMap: { colors: fuse(SERIES, SERIES_LIGHT) }\n            });\n        }());\n        function fuse(arr1, arr2) {\n            return $.map(arr1, function (item, index) {\n                return [[\n                        item,\n                        arr2[index]\n                    ]];\n            });\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.themes', [\n        'kendo.dataviz.core',\n        'dataviz/themes/chart-base-theme',\n        'dataviz/themes/auto-theme',\n        'dataviz/themes/themes'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.themes',\n        name: 'Themes',\n        description: 'Built-in themes for the DataViz widgets',\n        category: 'dataviz',\n        depends: ['dataviz.core'],\n        hidden: true\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/chart/kendo-chart', [\n        'kendo.core',\n        'kendo.color',\n        'kendo.drawing',\n        'kendo.dataviz.core'\n    ], f);\n}(function () {\n    (function ($) {\n        window.kendo.dataviz = window.kendo.dataviz || {};\n        var dataviz = kendo.dataviz;\n        var Class = dataviz.Class;\n        var isNumber = dataviz.isNumber;\n        var datavizConstants = dataviz.constants;\n        var MAX_VALUE = datavizConstants.MAX_VALUE;\n        var MIN_VALUE = datavizConstants.MIN_VALUE;\n        var VALUE = datavizConstants.VALUE;\n        var CENTER = datavizConstants.CENTER;\n        var TOP = datavizConstants.TOP;\n        var BOTTOM = datavizConstants.BOTTOM;\n        var LEFT = datavizConstants.LEFT;\n        var WHITE = datavizConstants.WHITE;\n        var CIRCLE = datavizConstants.CIRCLE;\n        var X = datavizConstants.X;\n        var Y = datavizConstants.Y;\n        var RIGHT = datavizConstants.RIGHT;\n        var BLACK = datavizConstants.BLACK;\n        var DATE = datavizConstants.DATE;\n        var DEFAULT_PRECISION = datavizConstants.DEFAULT_PRECISION;\n        var ARC = datavizConstants.ARC;\n        var defined = dataviz.defined;\n        var getter = dataviz.getter;\n        var isArray = dataviz.isArray;\n        var ChartElement = dataviz.ChartElement;\n        var Point = dataviz.Point;\n        var Box = dataviz.Box;\n        var alignPathToPixel = dataviz.alignPathToPixel;\n        var setDefaultOptions = dataviz.setDefaultOptions;\n        var inArray = dataviz.inArray;\n        var isFunction = dataviz.isFunction;\n        var valueOrDefault = dataviz.valueOrDefault;\n        var isObject = dataviz.isObject;\n        var deepExtend = dataviz.deepExtend;\n        var last = dataviz.last;\n        var eventElement = dataviz.eventElement;\n        var getTemplate = dataviz.getTemplate;\n        var TextBox = dataviz.TextBox;\n        var ShapeElement = dataviz.ShapeElement;\n        var getSpacing = dataviz.getSpacing;\n        var CurveProcessor = dataviz.CurveProcessor;\n        var append = dataviz.append;\n        var isString = dataviz.isString;\n        var parseDate = dataviz.parseDate;\n        var styleValue = dataviz.styleValue;\n        var CategoryAxis = dataviz.CategoryAxis;\n        var BoxElement = dataviz.BoxElement;\n        var round = dataviz.round;\n        var limitValue = dataviz.limitValue;\n        var grep = dataviz.grep;\n        var elementStyles = dataviz.elementStyles;\n        var hasClasses = dataviz.hasClasses;\n        var bindEvents = dataviz.bindEvents;\n        var services = dataviz.services;\n        var unbindEvents = dataviz.unbindEvents;\n        var support = kendo.support;\n        var drawing = kendo.drawing;\n        var Path = drawing.Path;\n        var Animation = drawing.Animation;\n        var AnimationFactory = drawing.AnimationFactory;\n        var Group = drawing.Group;\n        var Color = kendo.Color;\n        var geometry = kendo.geometry;\n        var GeometryPoint = geometry.Point;\n        var transform = geometry.transform;\n        var ChartAxis = Class.extend({\n            init: function (axis) {\n                this._axis = axis;\n                this.options = axis.options;\n            },\n            value: function (point) {\n                var axis = this._axis;\n                var value = axis.getCategory ? axis.getCategory(point) : axis.getValue(point);\n                return value;\n            },\n            slot: function (from, to, limit) {\n                if (limit === void 0) {\n                    limit = true;\n                }\n                return this._axis.slot(from, to, limit);\n            },\n            range: function () {\n                return this._axis.range();\n            },\n            valueRange: function () {\n                return this._axis.valueRange();\n            }\n        });\n        function findAxisByName(name, axes) {\n            for (var idx = 0; idx < axes.length; idx++) {\n                if (axes[idx].options.name === name) {\n                    axes[idx].prepareUserOptions();\n                    return new ChartAxis(axes[idx]);\n                }\n            }\n        }\n        var ChartPane = kendo.Class.extend({\n            init: function (pane) {\n                this.visual = pane.visual;\n                this.chartsVisual = pane.chartContainer.visual;\n                this._pane = pane;\n            },\n            findAxisByName: function (name) {\n                return findAxisByName(name, this._pane.axes);\n            }\n        });\n        var ChartPlotArea = Class.extend({\n            init: function (plotArea) {\n                this._plotArea = plotArea;\n                this.visual = plotArea.visual;\n                this.backgroundVisual = plotArea._bgVisual;\n            }\n        });\n        function countNumbers(values) {\n            var length = values.length;\n            var count = 0;\n            for (var i = 0; i < length; i++) {\n                var num = values[i];\n                if (isNumber(num)) {\n                    count++;\n                }\n            }\n            return count;\n        }\n        var Aggregates = {\n            min: function (values) {\n                var length = values.length;\n                var min = MAX_VALUE;\n                for (var i = 0; i < length; i++) {\n                    var value = values[i];\n                    if (isNumber(value)) {\n                        min = Math.min(min, value);\n                    }\n                }\n                return min === MAX_VALUE ? values[0] : min;\n            },\n            max: function (values) {\n                var length = values.length;\n                var max = MIN_VALUE;\n                for (var i = 0; i < length; i++) {\n                    var value = values[i];\n                    if (isNumber(value)) {\n                        max = Math.max(max, value);\n                    }\n                }\n                return max === MIN_VALUE ? values[0] : max;\n            },\n            sum: function (values) {\n                var length = values.length;\n                var sum = 0;\n                for (var i = 0; i < length; i++) {\n                    var value = values[i];\n                    if (isNumber(value)) {\n                        sum += value;\n                    }\n                }\n                return sum;\n            },\n            sumOrNull: function (values) {\n                var result = null;\n                if (countNumbers(values)) {\n                    result = Aggregates.sum(values);\n                }\n                return result;\n            },\n            count: function (values) {\n                var length = values.length;\n                var count = 0;\n                for (var i = 0; i < length; i++) {\n                    var value = values[i];\n                    if (value !== null && defined(value)) {\n                        count++;\n                    }\n                }\n                return count;\n            },\n            avg: function (values) {\n                var count = countNumbers(values);\n                var result = values[0];\n                if (count > 0) {\n                    result = Aggregates.sum(values) / count;\n                }\n                return result;\n            },\n            first: function (values) {\n                var length = values.length;\n                for (var i = 0; i < length; i++) {\n                    var value = values[i];\n                    if (value !== null && defined(value)) {\n                        return value;\n                    }\n                }\n                return values[0];\n            }\n        };\n        function getField(field, row) {\n            if (row === null) {\n                return row;\n            }\n            var get = getter(field, true);\n            return get(row);\n        }\n        var SeriesBinder = Class.extend({\n            init: function () {\n                this._valueFields = {};\n                this._otherFields = {};\n                this._nullValue = {};\n                this._undefinedValue = {};\n            },\n            register: function (seriesTypes, valueFields, otherFields) {\n                var this$1 = this;\n                if (valueFields === void 0) {\n                    valueFields = [VALUE];\n                }\n                if (otherFields === void 0) {\n                    otherFields = {};\n                }\n                for (var i = 0; i < seriesTypes.length; i++) {\n                    var type = seriesTypes[i];\n                    this$1._valueFields[type] = valueFields;\n                    this$1._otherFields[type] = otherFields;\n                    this$1._nullValue[type] = this$1._makeValue(valueFields, null);\n                    this$1._undefinedValue[type] = this$1._makeValue(valueFields, undefined);\n                }\n            },\n            canonicalFields: function (series) {\n                return this.valueFields(series).concat(this.otherFields(series));\n            },\n            valueFields: function (series) {\n                return this._valueFields[series.type] || [VALUE];\n            },\n            otherFields: function (series) {\n                return this._otherFields[series.type] || [VALUE];\n            },\n            bindPoint: function (series, pointIx, item) {\n                var data = series.data;\n                var pointData = defined(item) ? item : data[pointIx];\n                var result = { valueFields: { value: pointData } };\n                var valueFields = this.valueFields(series);\n                var otherFields = this._otherFields[series.type];\n                var fields, value;\n                if (pointData === null) {\n                    value = this._nullValue[series.type];\n                } else if (!defined(pointData)) {\n                    value = this._undefinedValue[series.type];\n                } else if (Array.isArray(pointData)) {\n                    var fieldData = pointData.slice(valueFields.length);\n                    value = this._bindFromArray(pointData, valueFields);\n                    fields = this._bindFromArray(fieldData, otherFields);\n                } else if (typeof pointData === 'object') {\n                    var srcValueFields = this.sourceFields(series, valueFields);\n                    var srcPointFields = this.sourceFields(series, otherFields);\n                    value = this._bindFromObject(pointData, valueFields, srcValueFields);\n                    fields = this._bindFromObject(pointData, otherFields, srcPointFields);\n                }\n                if (defined(value)) {\n                    if (valueFields.length === 1) {\n                        result.valueFields.value = value[valueFields[0]];\n                    } else {\n                        result.valueFields = value;\n                    }\n                }\n                result.fields = fields || {};\n                return result;\n            },\n            _makeValue: function (fields, initialValue) {\n                var value = {};\n                var length = fields.length;\n                for (var i = 0; i < length; i++) {\n                    var fieldName = fields[i];\n                    value[fieldName] = initialValue;\n                }\n                return value;\n            },\n            _bindFromArray: function (array, fields) {\n                var value = {};\n                if (fields) {\n                    var length = Math.min(fields.length, array.length);\n                    for (var i = 0; i < length; i++) {\n                        value[fields[i]] = array[i];\n                    }\n                }\n                return value;\n            },\n            _bindFromObject: function (object, fields, srcFields) {\n                if (srcFields === void 0) {\n                    srcFields = fields;\n                }\n                var value = {};\n                if (fields) {\n                    var length = fields.length;\n                    for (var i = 0; i < length; i++) {\n                        var fieldName = fields[i];\n                        var srcFieldName = srcFields[i];\n                        if (srcFieldName !== null) {\n                            value[fieldName] = getField(srcFieldName, object);\n                        }\n                    }\n                }\n                return value;\n            },\n            sourceFields: function (series, canonicalFields) {\n                var sourceFields = [];\n                if (canonicalFields) {\n                    var length = canonicalFields.length;\n                    for (var i = 0; i < length; i++) {\n                        var fieldName = canonicalFields[i];\n                        var sourceFieldName = fieldName === VALUE ? 'field' : fieldName + 'Field';\n                        sourceFields.push(series[sourceFieldName] !== null ? series[sourceFieldName] || fieldName : null);\n                    }\n                }\n                return sourceFields;\n            }\n        });\n        SeriesBinder.current = new SeriesBinder();\n        var STD_ERR = 'stderr';\n        var STD_DEV = 'stddev';\n        var percentRegex = /percent(?:\\w*)\\((\\d+)\\)/;\n        var standardDeviationRegex = new RegExp('^' + STD_DEV + '(?:\\\\((\\\\d+(?:\\\\.\\\\d+)?)\\\\))?$');\n        var ErrorRangeCalculator = Class.extend({\n            init: function (errorValue, series, field) {\n                this.initGlobalRanges(errorValue, series, field);\n            },\n            initGlobalRanges: function (errorValue, series, field) {\n                var data = series.data;\n                var deviationMatch = standardDeviationRegex.exec(errorValue);\n                if (deviationMatch) {\n                    this.valueGetter = this.createValueGetter(series, field);\n                    var average = this.getAverage(data);\n                    var deviation = this.getStandardDeviation(data, average, false);\n                    var multiple = deviationMatch[1] ? parseFloat(deviationMatch[1]) : 1;\n                    var errorRange = {\n                        low: average.value - deviation * multiple,\n                        high: average.value + deviation * multiple\n                    };\n                    this.globalRange = function () {\n                        return errorRange;\n                    };\n                } else if (errorValue.indexOf && errorValue.indexOf(STD_ERR) >= 0) {\n                    this.valueGetter = this.createValueGetter(series, field);\n                    var standardError = this.getStandardError(data, this.getAverage(data));\n                    this.globalRange = function (value) {\n                        return {\n                            low: value - standardError,\n                            high: value + standardError\n                        };\n                    };\n                }\n            },\n            createValueGetter: function (series, field) {\n                var data = series.data;\n                var binder = SeriesBinder.current;\n                var valueFields = binder.valueFields(series);\n                var item = defined(data[0]) ? data[0] : {};\n                var valueGetter;\n                if (isArray(item)) {\n                    var index = field ? valueFields.indexOf(field) : 0;\n                    valueGetter = getter('[' + index + ']');\n                } else if (isNumber(item)) {\n                    valueGetter = getter();\n                } else if (typeof item === datavizConstants.OBJECT) {\n                    var srcValueFields = binder.sourceFields(series, valueFields);\n                    valueGetter = getter(srcValueFields[valueFields.indexOf(field)]);\n                }\n                return valueGetter;\n            },\n            getErrorRange: function (pointValue, errorValue) {\n                var low, high, value;\n                if (!defined(errorValue)) {\n                    return null;\n                }\n                if (this.globalRange) {\n                    return this.globalRange(pointValue);\n                }\n                if (isArray(errorValue)) {\n                    low = pointValue - errorValue[0];\n                    high = pointValue + errorValue[1];\n                } else if (isNumber(value = parseFloat(errorValue))) {\n                    low = pointValue - value;\n                    high = pointValue + value;\n                } else if (value = percentRegex.exec(errorValue)) {\n                    var percentValue = pointValue * (parseFloat(value[1]) / 100);\n                    low = pointValue - Math.abs(percentValue);\n                    high = pointValue + Math.abs(percentValue);\n                } else {\n                    throw new Error('Invalid ErrorBar value: ' + errorValue);\n                }\n                return {\n                    low: low,\n                    high: high\n                };\n            },\n            getStandardError: function (data, average) {\n                return this.getStandardDeviation(data, average, true) / Math.sqrt(average.count);\n            },\n            getStandardDeviation: function (data, average, isSample) {\n                var this$1 = this;\n                var length = data.length;\n                var total = isSample ? average.count - 1 : average.count;\n                var squareDifferenceSum = 0;\n                for (var idx = 0; idx < length; idx++) {\n                    var value = this$1.valueGetter(data[idx]);\n                    if (isNumber(value)) {\n                        squareDifferenceSum += Math.pow(value - average.value, 2);\n                    }\n                }\n                return Math.sqrt(squareDifferenceSum / total);\n            },\n            getAverage: function (data) {\n                var this$1 = this;\n                var length = data.length;\n                var sum = 0;\n                var count = 0;\n                for (var idx = 0; idx < length; idx++) {\n                    var value = this$1.valueGetter(data[idx]);\n                    if (isNumber(value)) {\n                        sum += value;\n                        count++;\n                    }\n                }\n                return {\n                    value: sum / count,\n                    count: count\n                };\n            }\n        });\n        var browser = support.browser || {};\n        var INITIAL_ANIMATION_DURATION = 600;\n        var FADEIN = 'fadeIn';\n        var GLASS = 'glass';\n        var BORDER_BRIGHTNESS = 0.8;\n        var TOOLTIP_OFFSET = 5;\n        var START_SCALE = browser.msie ? 0.001 : 0;\n        var ERROR_LOW_FIELD = 'errorLow';\n        var ERROR_HIGH_FIELD = 'errorHigh';\n        var X_ERROR_LOW_FIELD = 'xErrorLow';\n        var X_ERROR_HIGH_FIELD = 'xErrorHigh';\n        var Y_ERROR_LOW_FIELD = 'yErrorLow';\n        var Y_ERROR_HIGH_FIELD = 'yErrorHigh';\n        var LINE_MARKER_SIZE = 8;\n        var ZERO = 'zero';\n        var INTERPOLATE = 'interpolate';\n        var GAP = 'gap';\n        var ABOVE = 'above';\n        var BELOW = 'below';\n        var SMOOTH = 'smooth';\n        var STEP = 'step';\n        var AREA = 'area';\n        var BAR = 'bar';\n        var BOX_PLOT = 'boxPlot';\n        var BUBBLE = 'bubble';\n        var BULLET = 'bullet';\n        var CANDLESTICK = 'candlestick';\n        var COLUMN = 'column';\n        var DONUT = 'donut';\n        var FUNNEL = 'funnel';\n        var HORIZONTAL_WATERFALL = 'horizontalWaterfall';\n        var LINE = 'line';\n        var OHLC = 'ohlc';\n        var PIE = 'pie';\n        var POLAR_AREA = 'polarArea';\n        var POLAR_LINE = 'polarLine';\n        var POLAR_SCATTER = 'polarScatter';\n        var RADAR_AREA = 'radarArea';\n        var RADAR_COLUMN = 'radarColumn';\n        var RADAR_LINE = 'radarLine';\n        var RANGE_AREA = 'rangeArea';\n        var RANGE_BAR = 'rangeBar';\n        var RANGE_COLUMN = 'rangeColumn';\n        var SCATTER = 'scatter';\n        var SCATTER_LINE = 'scatterLine';\n        var VERTICAL_AREA = 'verticalArea';\n        var VERTICAL_BOX_PLOT = 'verticalBoxPlot';\n        var VERTICAL_BULLET = 'verticalBullet';\n        var VERTICAL_LINE = 'verticalLine';\n        var VERTICAL_RANGE_AREA = 'verticalRangeArea';\n        var WATERFALL = 'waterfall';\n        var EQUALLY_SPACED_SERIES = [\n            BAR,\n            COLUMN,\n            OHLC,\n            CANDLESTICK,\n            BOX_PLOT,\n            VERTICAL_BOX_PLOT,\n            BULLET,\n            RANGE_COLUMN,\n            RANGE_BAR,\n            WATERFALL,\n            HORIZONTAL_WATERFALL\n        ];\n        var LEGEND_ITEM_CLICK = 'legendItemClick';\n        var LEGEND_ITEM_HOVER = 'legendItemHover';\n        var LEGEND_ITEM_LEAVE = 'legendItemLeave';\n        var SERIES_CLICK = 'seriesClick';\n        var SERIES_HOVER = 'seriesHover';\n        var SERIES_OVER = 'seriesOver';\n        var SERIES_LEAVE = 'seriesLeave';\n        var PLOT_AREA_CLICK = 'plotAreaClick';\n        var PLOT_AREA_HOVER = 'plotAreaHover';\n        var PLOT_AREA_LEAVE = 'plotAreaLeave';\n        var DRAG = 'drag';\n        var DRAG_END = 'dragEnd';\n        var DRAG_START = 'dragStart';\n        var ZOOM_START = 'zoomStart';\n        var ZOOM = 'zoom';\n        var ZOOM_END = 'zoomEnd';\n        var SELECT_START = 'selectStart';\n        var SELECT = 'select';\n        var SELECT_END = 'selectEnd';\n        var RENDER = 'render';\n        var SHOW_TOOLTIP = 'showTooltip';\n        var HIDE_TOOLTIP = 'hideTooltip';\n        var PANE_RENDER = 'paneRender';\n        var LOGARITHMIC = 'log';\n        var CATEGORY = 'category';\n        var INSIDE_END = 'insideEnd';\n        var INSIDE_BASE = 'insideBase';\n        var OUTSIDE_END = 'outsideEnd';\n        var MOUSEWHEEL = 'DOMMouseScroll mousewheel';\n        var MOUSEWHEEL_DELAY = 150;\n        var constants = {\n            INITIAL_ANIMATION_DURATION: INITIAL_ANIMATION_DURATION,\n            FADEIN: FADEIN,\n            LEGEND_ITEM_CLICK: LEGEND_ITEM_CLICK,\n            LEGEND_ITEM_HOVER: LEGEND_ITEM_HOVER,\n            LEGEND_ITEM_LEAVE: LEGEND_ITEM_LEAVE,\n            SERIES_CLICK: SERIES_CLICK,\n            SERIES_HOVER: SERIES_HOVER,\n            SERIES_OVER: SERIES_OVER,\n            SERIES_LEAVE: SERIES_LEAVE,\n            GLASS: GLASS,\n            BORDER_BRIGHTNESS: BORDER_BRIGHTNESS,\n            TOOLTIP_OFFSET: TOOLTIP_OFFSET,\n            START_SCALE: START_SCALE,\n            ERROR_LOW_FIELD: ERROR_LOW_FIELD,\n            ERROR_HIGH_FIELD: ERROR_HIGH_FIELD,\n            X_ERROR_LOW_FIELD: X_ERROR_LOW_FIELD,\n            X_ERROR_HIGH_FIELD: X_ERROR_HIGH_FIELD,\n            Y_ERROR_LOW_FIELD: Y_ERROR_LOW_FIELD,\n            Y_ERROR_HIGH_FIELD: Y_ERROR_HIGH_FIELD,\n            LINE_MARKER_SIZE: LINE_MARKER_SIZE,\n            INTERPOLATE: INTERPOLATE,\n            ZERO: ZERO,\n            SMOOTH: SMOOTH,\n            STEP: STEP,\n            CATEGORY: CATEGORY,\n            FUNNEL: FUNNEL,\n            BAR: BAR,\n            CANDLESTICK: CANDLESTICK,\n            PIE: PIE,\n            COLUMN: COLUMN,\n            AREA: AREA,\n            VERTICAL_BULLET: VERTICAL_BULLET,\n            BOX_PLOT: BOX_PLOT,\n            OHLC: OHLC,\n            WATERFALL: WATERFALL,\n            LINE: LINE,\n            BULLET: BULLET,\n            VERTICAL_LINE: VERTICAL_LINE,\n            VERTICAL_AREA: VERTICAL_AREA,\n            RANGE_AREA: RANGE_AREA,\n            VERTICAL_RANGE_AREA: VERTICAL_RANGE_AREA,\n            RANGE_COLUMN: RANGE_COLUMN,\n            VERTICAL_BOX_PLOT: VERTICAL_BOX_PLOT,\n            RANGE_BAR: RANGE_BAR,\n            HORIZONTAL_WATERFALL: HORIZONTAL_WATERFALL,\n            SCATTER: SCATTER,\n            SCATTER_LINE: SCATTER_LINE,\n            BUBBLE: BUBBLE,\n            RADAR_AREA: RADAR_AREA,\n            RADAR_LINE: RADAR_LINE,\n            RADAR_COLUMN: RADAR_COLUMN,\n            POLAR_LINE: POLAR_LINE,\n            POLAR_AREA: POLAR_AREA,\n            POLAR_SCATTER: POLAR_SCATTER,\n            RENDER: RENDER,\n            PLOT_AREA_CLICK: PLOT_AREA_CLICK,\n            PLOT_AREA_HOVER: PLOT_AREA_HOVER,\n            PLOT_AREA_LEAVE: PLOT_AREA_LEAVE,\n            LOGARITHMIC: LOGARITHMIC,\n            DRAG: DRAG,\n            DRAG_START: DRAG_START,\n            DRAG_END: DRAG_END,\n            ZOOM_START: ZOOM_START,\n            ZOOM: ZOOM,\n            ZOOM_END: ZOOM_END,\n            SELECT_START: SELECT_START,\n            SELECT: SELECT,\n            SELECT_END: SELECT_END,\n            PANE_RENDER: PANE_RENDER,\n            GAP: GAP,\n            DONUT: DONUT,\n            INSIDE_END: INSIDE_END,\n            INSIDE_BASE: INSIDE_BASE,\n            OUTSIDE_END: OUTSIDE_END,\n            MOUSEWHEEL: MOUSEWHEEL,\n            MOUSEWHEEL_DELAY: MOUSEWHEEL_DELAY,\n            SHOW_TOOLTIP: SHOW_TOOLTIP,\n            HIDE_TOOLTIP: HIDE_TOOLTIP,\n            EQUALLY_SPACED_SERIES: EQUALLY_SPACED_SERIES,\n            ABOVE: ABOVE,\n            BELOW: BELOW\n        };\n        var DEFAULT_ERROR_BAR_WIDTH = 4;\n        var ErrorBarBase = ChartElement.extend({\n            init: function (low, high, isVertical, chart, series, options) {\n                ChartElement.fn.init.call(this, options);\n                this.low = low;\n                this.high = high;\n                this.isVertical = isVertical;\n                this.chart = chart;\n                this.series = series;\n            },\n            reflow: function (targetBox) {\n                var endCaps = this.options.endCaps;\n                var isVertical = this.isVertical;\n                var axis = this.getAxis();\n                var valueBox = axis.getSlot(this.low, this.high);\n                var centerBox = targetBox.center();\n                var capsWidth = this.getCapsWidth(targetBox, isVertical);\n                var capValue = isVertical ? centerBox.x : centerBox.y;\n                var capStart = capValue - capsWidth;\n                var capEnd = capValue + capsWidth;\n                var linePoints;\n                if (isVertical) {\n                    linePoints = [\n                        new Point(centerBox.x, valueBox.y1),\n                        new Point(centerBox.x, valueBox.y2)\n                    ];\n                    if (endCaps) {\n                        linePoints.push(new Point(capStart, valueBox.y1), new Point(capEnd, valueBox.y1), new Point(capStart, valueBox.y2), new Point(capEnd, valueBox.y2));\n                    }\n                    this.box = new Box(capStart, valueBox.y1, capEnd, valueBox.y2);\n                } else {\n                    linePoints = [\n                        new Point(valueBox.x1, centerBox.y),\n                        new Point(valueBox.x2, centerBox.y)\n                    ];\n                    if (endCaps) {\n                        linePoints.push(new Point(valueBox.x1, capStart), new Point(valueBox.x1, capEnd), new Point(valueBox.x2, capStart), new Point(valueBox.x2, capEnd));\n                    }\n                    this.box = new Box(valueBox.x1, capStart, valueBox.x2, capEnd);\n                }\n                this.linePoints = linePoints;\n            },\n            getCapsWidth: function (box, isVertical) {\n                var boxSize = isVertical ? box.width() : box.height();\n                var capsWidth = Math.min(Math.floor(boxSize / 2), DEFAULT_ERROR_BAR_WIDTH) || DEFAULT_ERROR_BAR_WIDTH;\n                return capsWidth;\n            },\n            createVisual: function () {\n                var this$1 = this;\n                var options = this.options;\n                var visual = options.visual;\n                if (visual) {\n                    this.visual = visual({\n                        low: this.low,\n                        high: this.high,\n                        rect: this.box.toRect(),\n                        sender: this.getSender(),\n                        options: {\n                            endCaps: options.endCaps,\n                            color: options.color,\n                            line: options.line\n                        },\n                        createVisual: function () {\n                            this$1.createDefaultVisual();\n                            var defaultVisual = this$1.visual;\n                            delete this$1.visual;\n                            return defaultVisual;\n                        }\n                    });\n                } else {\n                    this.createDefaultVisual();\n                }\n            },\n            createDefaultVisual: function () {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var linePoints = ref.linePoints;\n                var lineOptions = {\n                    stroke: {\n                        color: options.color,\n                        width: options.line.width,\n                        dashType: options.line.dashType\n                    }\n                };\n                ChartElement.fn.createVisual.call(this);\n                for (var idx = 0; idx < linePoints.length; idx += 2) {\n                    var line = new Path(lineOptions).moveTo(linePoints[idx].x, linePoints[idx].y).lineTo(linePoints[idx + 1].x, linePoints[idx + 1].y);\n                    alignPathToPixel(line);\n                    this$1.visual.append(line);\n                }\n            }\n        });\n        setDefaultOptions(ErrorBarBase, {\n            animation: {\n                type: FADEIN,\n                delay: INITIAL_ANIMATION_DURATION\n            },\n            endCaps: true,\n            line: { width: 2 },\n            zIndex: 1\n        });\n        var CategoricalErrorBar = ErrorBarBase.extend({\n            getAxis: function () {\n                var axis = this.chart.seriesValueAxis(this.series);\n                return axis;\n            }\n        });\n        var MAX_EXPAND_DEPTH = 5;\n        function evalOptions(options, context, state, dryRun) {\n            if (state === void 0) {\n                state = {};\n            }\n            if (dryRun === void 0) {\n                dryRun = false;\n            }\n            var defaults = state.defaults = state.defaults || {};\n            var depth = state.depth = state.depth || 0;\n            var needsEval = false;\n            state.excluded = state.excluded || [];\n            if (depth > MAX_EXPAND_DEPTH) {\n                return null;\n            }\n            for (var property in options) {\n                if (!inArray(property, state.excluded) && options.hasOwnProperty(property)) {\n                    var propValue = options[property];\n                    if (isFunction(propValue)) {\n                        needsEval = true;\n                        if (!dryRun) {\n                            options[property] = valueOrDefault(propValue(context), defaults[property]);\n                        }\n                    } else if (isObject(propValue)) {\n                        if (!dryRun) {\n                            state.defaults = defaults[property];\n                        }\n                        state.depth++;\n                        needsEval = evalOptions(propValue, context, state, dryRun) || needsEval;\n                        state.depth--;\n                    }\n                }\n            }\n            return needsEval;\n        }\n        function categoriesCount(series) {\n            var seriesCount = series.length;\n            var categories = 0;\n            for (var i = 0; i < seriesCount; i++) {\n                categories = Math.max(categories, series[i].data.length);\n            }\n            return categories;\n        }\n        var CategoricalChart = ChartElement.extend({\n            init: function (plotArea, options) {\n                ChartElement.fn.init.call(this, options);\n                this.plotArea = plotArea;\n                this.chartService = plotArea.chartService;\n                this.categoryAxis = plotArea.seriesCategoryAxis(options.series[0]);\n                this.valueAxisRanges = {};\n                this.points = [];\n                this.categoryPoints = [];\n                this.seriesPoints = [];\n                this.seriesOptions = [];\n                this._evalSeries = [];\n                this.render();\n            },\n            render: function () {\n                this.traverseDataPoints(this.addValue.bind(this));\n            },\n            pointOptions: function (series, seriesIx) {\n                var options = this.seriesOptions[seriesIx];\n                if (!options) {\n                    var defaults = this.pointType().prototype.defaults;\n                    this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, { vertical: !this.options.invertAxes }, series);\n                }\n                return options;\n            },\n            plotValue: function (point) {\n                if (!point) {\n                    return 0;\n                }\n                if (this.options.isStacked100 && isNumber(point.value)) {\n                    var categoryIx = point.categoryIx;\n                    var categoryPoints = this.categoryPoints[categoryIx];\n                    var otherValues = [];\n                    var categorySum = 0;\n                    for (var i = 0; i < categoryPoints.length; i++) {\n                        var other = categoryPoints[i];\n                        if (other) {\n                            var stack = point.series.stack;\n                            var otherStack = other.series.stack;\n                            if (stack && otherStack && stack.group !== otherStack.group) {\n                                continue;\n                            }\n                            if (isNumber(other.value)) {\n                                categorySum += Math.abs(other.value);\n                                otherValues.push(Math.abs(other.value));\n                            }\n                        }\n                    }\n                    if (categorySum > 0) {\n                        return point.value / categorySum;\n                    }\n                }\n                return point.value;\n            },\n            plotRange: function (point, startValue) {\n                var this$1 = this;\n                if (startValue === void 0) {\n                    startValue = 0;\n                }\n                var categoryPoints = this.categoryPoints[point.categoryIx];\n                if (this.options.isStacked) {\n                    var plotValue = this.plotValue(point);\n                    var positive = plotValue >= 0;\n                    var prevValue = startValue;\n                    var isStackedBar = false;\n                    for (var i = 0; i < categoryPoints.length; i++) {\n                        var other = categoryPoints[i];\n                        if (point === other) {\n                            break;\n                        }\n                        var stack = point.series.stack;\n                        var otherStack = other.series.stack;\n                        if (stack && otherStack) {\n                            if (typeof stack === datavizConstants.STRING && stack !== otherStack) {\n                                continue;\n                            }\n                            if (stack.group && stack.group !== otherStack.group) {\n                                continue;\n                            }\n                        }\n                        var otherValue = this$1.plotValue(other);\n                        if (otherValue >= 0 && positive || otherValue < 0 && !positive) {\n                            prevValue += otherValue;\n                            plotValue += otherValue;\n                            isStackedBar = true;\n                            if (this$1.options.isStacked100) {\n                                plotValue = Math.min(plotValue, 1);\n                            }\n                        }\n                    }\n                    if (isStackedBar) {\n                        prevValue -= startValue;\n                    }\n                    return [\n                        prevValue,\n                        plotValue\n                    ];\n                }\n                var series = point.series;\n                var valueAxis = this.seriesValueAxis(series);\n                var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n                return [\n                    axisCrossingValue,\n                    dataviz.convertableToNumber(point.value) ? point.value : axisCrossingValue\n                ];\n            },\n            stackLimits: function (axisName, stackName) {\n                var this$1 = this;\n                var min = MAX_VALUE;\n                var max = MIN_VALUE;\n                for (var i = 0; i < this.categoryPoints.length; i++) {\n                    var categoryPoints = this$1.categoryPoints[i];\n                    if (!categoryPoints) {\n                        continue;\n                    }\n                    for (var pIx = 0; pIx < categoryPoints.length; pIx++) {\n                        var point = categoryPoints[pIx];\n                        if (point) {\n                            if (point.series.stack === stackName || point.series.axis === axisName) {\n                                var to = this$1.plotRange(point, 0)[1];\n                                if (defined(to) && isFinite(to)) {\n                                    max = Math.max(max, to);\n                                    min = Math.min(min, to);\n                                }\n                            }\n                        }\n                    }\n                }\n                return {\n                    min: min,\n                    max: max\n                };\n            },\n            updateStackRange: function () {\n                var this$1 = this;\n                var ref = this.options;\n                var isStacked = ref.isStacked;\n                var chartSeries = ref.series;\n                var limitsCache = {};\n                if (isStacked) {\n                    for (var i = 0; i < chartSeries.length; i++) {\n                        var series = chartSeries[i];\n                        var axisName = series.axis;\n                        var key = axisName + series.stack;\n                        var limits = limitsCache[key];\n                        if (!limits) {\n                            limits = this$1.stackLimits(axisName, series.stack);\n                            var errorTotals = this$1.errorTotals;\n                            if (errorTotals) {\n                                if (errorTotals.negative.length) {\n                                    limits.min = Math.min(limits.min, dataviz.sparseArrayLimits(errorTotals.negative).min);\n                                }\n                                if (errorTotals.positive.length) {\n                                    limits.max = Math.max(limits.max, dataviz.sparseArrayLimits(errorTotals.positive).max);\n                                }\n                            }\n                            if (limits.min !== MAX_VALUE || limits.max !== MIN_VALUE) {\n                                limitsCache[key] = limits;\n                            } else {\n                                limits = null;\n                            }\n                        }\n                        if (limits) {\n                            this$1.valueAxisRanges[axisName] = limits;\n                        }\n                    }\n                }\n            },\n            addErrorBar: function (point, data, categoryIx) {\n                var value = point.value;\n                var series = point.series;\n                var seriesIx = point.seriesIx;\n                var errorBars = point.options.errorBars;\n                var lowValue = data.fields[ERROR_LOW_FIELD];\n                var highValue = data.fields[ERROR_HIGH_FIELD];\n                var errorRange;\n                if (isNumber(lowValue) && isNumber(highValue)) {\n                    errorRange = {\n                        low: lowValue,\n                        high: highValue\n                    };\n                } else if (errorBars && defined(errorBars.value)) {\n                    this.seriesErrorRanges = this.seriesErrorRanges || [];\n                    this.seriesErrorRanges[seriesIx] = this.seriesErrorRanges[seriesIx] || new ErrorRangeCalculator(errorBars.value, series, VALUE);\n                    errorRange = this.seriesErrorRanges[seriesIx].getErrorRange(value, errorBars.value);\n                }\n                if (errorRange) {\n                    point.low = errorRange.low;\n                    point.high = errorRange.high;\n                    this.addPointErrorBar(point, categoryIx);\n                }\n            },\n            addPointErrorBar: function (point, categoryIx) {\n                var isVertical = !this.options.invertAxes;\n                var options = point.options.errorBars;\n                var series = point.series;\n                var low = point.low;\n                var high = point.high;\n                if (this.options.isStacked) {\n                    var stackedErrorRange = this.stackedErrorRange(point, categoryIx);\n                    low = stackedErrorRange.low;\n                    high = stackedErrorRange.high;\n                } else {\n                    var fields = {\n                        categoryIx: categoryIx,\n                        series: series\n                    };\n                    this.updateRange({ value: low }, fields);\n                    this.updateRange({ value: high }, fields);\n                }\n                var errorBar = new CategoricalErrorBar(low, high, isVertical, this, series, options);\n                point.errorBars = [errorBar];\n                point.append(errorBar);\n            },\n            stackedErrorRange: function (point, categoryIx) {\n                var plotValue = this.plotRange(point, 0)[1] - point.value;\n                var low = point.low + plotValue;\n                var high = point.high + plotValue;\n                this.errorTotals = this.errorTotals || {\n                    positive: [],\n                    negative: []\n                };\n                if (low < 0) {\n                    this.errorTotals.negative[categoryIx] = Math.min(this.errorTotals.negative[categoryIx] || 0, low);\n                }\n                if (high > 0) {\n                    this.errorTotals.positive[categoryIx] = Math.max(this.errorTotals.positive[categoryIx] || 0, high);\n                }\n                return {\n                    low: low,\n                    high: high\n                };\n            },\n            addValue: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var categoryPoints = this.categoryPoints[categoryIx];\n                if (!categoryPoints) {\n                    this.categoryPoints[categoryIx] = categoryPoints = [];\n                }\n                var seriesPoints = this.seriesPoints[seriesIx];\n                if (!seriesPoints) {\n                    this.seriesPoints[seriesIx] = seriesPoints = [];\n                }\n                var point = this.createPoint(data, fields);\n                if (point) {\n                    $.extend(point, fields);\n                    point.owner = this;\n                    point.noteText = data.fields.noteText;\n                    if (!defined(point.dataItem)) {\n                        point.dataItem = series.data[categoryIx];\n                    }\n                    this.addErrorBar(point, data, categoryIx);\n                }\n                this.points.push(point);\n                seriesPoints.push(point);\n                categoryPoints.push(point);\n                this.updateRange(data.valueFields, fields);\n            },\n            evalPointOptions: function (options, value, category, categoryIx, series, seriesIx) {\n                var state = {\n                    defaults: series._defaults,\n                    excluded: [\n                        'data',\n                        'aggregate',\n                        '_events',\n                        'tooltip',\n                        'content',\n                        'template',\n                        'visual',\n                        'toggle',\n                        '_outOfRangeMinPoint',\n                        '_outOfRangeMaxPoint'\n                    ]\n                };\n                var doEval = this._evalSeries[seriesIx];\n                if (!defined(doEval)) {\n                    this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n                }\n                var pointOptions = options;\n                if (doEval) {\n                    pointOptions = deepExtend({}, pointOptions);\n                    evalOptions(pointOptions, {\n                        value: value,\n                        category: category,\n                        index: categoryIx,\n                        series: series,\n                        dataItem: series.data[categoryIx]\n                    }, state);\n                }\n                return pointOptions;\n            },\n            updateRange: function (data, fields) {\n                var axisName = fields.series.axis;\n                var value = data.value;\n                var axisRange = this.valueAxisRanges[axisName];\n                if (isFinite(value) && value !== null) {\n                    axisRange = this.valueAxisRanges[axisName] = axisRange || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    axisRange.min = Math.min(axisRange.min, value);\n                    axisRange.max = Math.max(axisRange.max, value);\n                }\n            },\n            seriesValueAxis: function (series) {\n                var plotArea = this.plotArea;\n                var axisName = series.axis;\n                var axis = axisName ? plotArea.namedValueAxes[axisName] : plotArea.valueAxis;\n                if (!axis) {\n                    throw new Error('Unable to locate value axis with name ' + axisName);\n                }\n                return axis;\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\n                var categorySlots = this.categorySlots = [];\n                var chartPoints = this.points;\n                var categoryAxis = this.categoryAxis;\n                var pointIx = 0;\n                this.traverseDataPoints(function (data, fields) {\n                    var categoryIx = fields.categoryIx;\n                    var currentSeries = fields.series;\n                    var valueAxis = this$1.seriesValueAxis(currentSeries);\n                    var point = chartPoints[pointIx++];\n                    var categorySlot = categorySlots[categoryIx];\n                    if (!categorySlot) {\n                        categorySlots[categoryIx] = categorySlot = this$1.categorySlot(categoryAxis, categoryIx, valueAxis);\n                    }\n                    if (point) {\n                        var plotRange = this$1.plotRange(point, valueAxis.startValue());\n                        var valueSlot = this$1.valueSlot(valueAxis, plotRange);\n                        if (valueSlot) {\n                            var pointSlot = this$1.pointSlot(categorySlot, valueSlot);\n                            point.aboveAxis = this$1.aboveAxis(point, valueAxis);\n                            point.stackValue = plotRange[1];\n                            if (this$1.options.isStacked100) {\n                                point.percentage = this$1.plotValue(point);\n                            }\n                            this$1.reflowPoint(point, pointSlot);\n                        } else {\n                            point.visible = false;\n                        }\n                    }\n                });\n                this.reflowCategories(categorySlots);\n                if (!this.options.clip && this.options.limitPoints && this.points.length) {\n                    this.limitPoints();\n                }\n                this.box = targetBox;\n            },\n            valueSlot: function (valueAxis, plotRange) {\n                return valueAxis.getSlot(plotRange[0], plotRange[1], !this.options.clip);\n            },\n            limitPoints: function () {\n                var this$1 = this;\n                var categoryPoints = this.categoryPoints;\n                var points = categoryPoints[0].concat(last(categoryPoints));\n                for (var idx = 0; idx < points.length; idx++) {\n                    if (points[idx]) {\n                        this$1.limitPoint(points[idx]);\n                    }\n                }\n            },\n            limitPoint: function (point) {\n                var limittedSlot = this.categoryAxis.limitSlot(point.box);\n                if (!limittedSlot.equals(point.box)) {\n                    point.reflow(limittedSlot);\n                }\n            },\n            aboveAxis: function (point, valueAxis) {\n                var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n                var value = point.value;\n                return valueAxis.options.reverse ? value < axisCrossingValue : value >= axisCrossingValue;\n            },\n            categoryAxisCrossingValue: function (valueAxis) {\n                var categoryAxis = this.categoryAxis;\n                var options = valueAxis.options;\n                var crossingValues = [].concat(options.axisCrossingValues || options.axisCrossingValue);\n                return crossingValues[categoryAxis.axisIndex || 0] || 0;\n            },\n            reflowPoint: function (point, pointSlot) {\n                point.reflow(pointSlot);\n            },\n            reflowCategories: function () {\n            },\n            pointSlot: function (categorySlot, valueSlot) {\n                var options = this.options;\n                var invertAxes = options.invertAxes;\n                var slotX = invertAxes ? valueSlot : categorySlot;\n                var slotY = invertAxes ? categorySlot : valueSlot;\n                return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n            },\n            categorySlot: function (categoryAxis, categoryIx) {\n                return categoryAxis.getSlot(categoryIx);\n            },\n            traverseDataPoints: function (callback) {\n                var this$1 = this;\n                var series = this.options.series;\n                var count = categoriesCount(series);\n                var seriesCount = series.length;\n                for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n                    this$1._outOfRangeCallback(series[seriesIx], '_outOfRangeMinPoint', seriesIx, callback);\n                }\n                for (var categoryIx = 0; categoryIx < count; categoryIx++) {\n                    for (var seriesIx$1 = 0; seriesIx$1 < seriesCount; seriesIx$1++) {\n                        var currentSeries = series[seriesIx$1];\n                        var currentCategory = this$1.categoryAxis.categoryAt(categoryIx);\n                        var pointData = this$1._bindPoint(currentSeries, seriesIx$1, categoryIx);\n                        callback(pointData, {\n                            category: currentCategory,\n                            categoryIx: categoryIx,\n                            series: currentSeries,\n                            seriesIx: seriesIx$1\n                        });\n                    }\n                }\n                for (var seriesIx$2 = 0; seriesIx$2 < seriesCount; seriesIx$2++) {\n                    this$1._outOfRangeCallback(series[seriesIx$2], '_outOfRangeMaxPoint', seriesIx$2, callback);\n                }\n            },\n            _outOfRangeCallback: function (series, field, seriesIx, callback) {\n                var outOfRangePoint = series[field];\n                if (outOfRangePoint) {\n                    var categoryIx = outOfRangePoint.categoryIx;\n                    var pointData = this._bindPoint(series, seriesIx, categoryIx, outOfRangePoint.item);\n                    callback(pointData, {\n                        category: outOfRangePoint.category,\n                        categoryIx: categoryIx,\n                        series: series,\n                        seriesIx: seriesIx,\n                        dataItem: outOfRangePoint.item\n                    });\n                }\n            },\n            _bindPoint: function (series, seriesIx, categoryIx, item) {\n                if (!this._bindCache) {\n                    this._bindCache = [];\n                }\n                var bindCache = this._bindCache[seriesIx];\n                if (!bindCache) {\n                    bindCache = this._bindCache[seriesIx] = [];\n                }\n                var data = bindCache[categoryIx];\n                if (!data) {\n                    data = bindCache[categoryIx] = SeriesBinder.current.bindPoint(series, categoryIx, item);\n                }\n                return data;\n            },\n            formatPointValue: function (point, format) {\n                if (point.value === null) {\n                    return '';\n                }\n                return this.chartService.format.auto(format, point.value);\n            },\n            pointValue: function (data) {\n                return data.valueFields.value;\n            }\n        });\n        setDefaultOptions(CategoricalChart, {\n            series: [],\n            invertAxes: false,\n            isStacked: false,\n            clip: true,\n            limitPoints: true\n        });\n        var PointEventsMixin = {\n            click: function (chart, e) {\n                return chart.trigger(SERIES_CLICK, this.eventArgs(e));\n            },\n            hover: function (chart, e) {\n                return chart.trigger(SERIES_HOVER, this.eventArgs(e));\n            },\n            over: function (chart, e) {\n                return chart.trigger(SERIES_OVER, this.eventArgs(e));\n            },\n            out: function (chart, e) {\n                return chart.trigger(SERIES_LEAVE, this.eventArgs(e));\n            },\n            eventArgs: function (e) {\n                return {\n                    value: this.value,\n                    percentage: this.percentage,\n                    stackValue: this.stackValue,\n                    category: this.category,\n                    series: this.series,\n                    dataItem: this.dataItem,\n                    runningTotal: this.runningTotal,\n                    total: this.total,\n                    element: eventElement(e),\n                    originalEvent: e,\n                    point: this\n                };\n            }\n        };\n        var NoteMixin = {\n            createNote: function () {\n                var options = this.options.notes;\n                var text = this.noteText || options.label.text;\n                if (options.visible !== false && defined(text) && text !== null) {\n                    this.note = new dataviz.Note({\n                        value: this.value,\n                        text: text,\n                        dataItem: this.dataItem,\n                        category: this.category,\n                        series: this.series\n                    }, this.options.notes, this.owner.chartService);\n                    this.append(this.note);\n                }\n            }\n        };\n        var LinePoint = ChartElement.extend({\n            init: function (value, options) {\n                ChartElement.fn.init.call(this);\n                this.value = value;\n                this.options = options;\n                this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n                this.tooltipTracking = true;\n            },\n            render: function () {\n                var ref = this.options;\n                var markers = ref.markers;\n                var labels = ref.labels;\n                if (this._rendered) {\n                    return;\n                }\n                this._rendered = true;\n                if (markers.visible && markers.size) {\n                    this.marker = this.createMarker();\n                    this.append(this.marker);\n                }\n                if (labels.visible) {\n                    var labelTemplate = getTemplate(labels);\n                    var pointData = this.pointData();\n                    var labelText = this.value;\n                    if (labelTemplate) {\n                        labelText = labelTemplate(pointData);\n                    } else if (labels.format) {\n                        labelText = this.formatValue(labels.format);\n                    }\n                    this.label = new TextBox(labelText, deepExtend({\n                        align: CENTER,\n                        vAlign: CENTER,\n                        margin: {\n                            left: 5,\n                            right: 5\n                        },\n                        zIndex: valueOrDefault(labels.zIndex, this.series.zIndex)\n                    }, labels), pointData);\n                    this.append(this.label);\n                }\n                this.createNote();\n                if (this.errorBar) {\n                    this.append(this.errorBar);\n                }\n            },\n            markerBorder: function () {\n                var options = this.options.markers;\n                var background = options.background;\n                var border = deepExtend({ color: this.color }, options.border);\n                if (!defined(border.color)) {\n                    border.color = new Color(background).brightness(BORDER_BRIGHTNESS).toHex();\n                }\n                return border;\n            },\n            createVisual: function () {\n            },\n            createMarker: function () {\n                var options = this.options.markers;\n                var marker = new ShapeElement({\n                    type: options.type,\n                    width: options.size,\n                    height: options.size,\n                    rotation: options.rotation,\n                    background: options.background,\n                    border: this.markerBorder(),\n                    opacity: options.opacity,\n                    zIndex: valueOrDefault(options.zIndex, this.series.zIndex),\n                    animation: options.animation,\n                    visual: options.visual\n                }, {\n                    dataItem: this.dataItem,\n                    value: this.value,\n                    series: this.series,\n                    category: this.category\n                });\n                return marker;\n            },\n            markerBox: function () {\n                if (!this.marker) {\n                    this.marker = this.createMarker();\n                    this.marker.reflow(this._childBox);\n                }\n                return this.marker.box;\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var aboveAxis = ref.aboveAxis;\n                var vertical = options.vertical;\n                this.render();\n                this.box = targetBox;\n                var childBox = targetBox.clone();\n                if (vertical) {\n                    if (aboveAxis) {\n                        childBox.y1 -= childBox.height();\n                    } else {\n                        childBox.y2 += childBox.height();\n                    }\n                } else {\n                    if (aboveAxis) {\n                        childBox.x1 += childBox.width();\n                    } else {\n                        childBox.x2 -= childBox.width();\n                    }\n                }\n                this._childBox = childBox;\n                if (this.marker) {\n                    this.marker.reflow(childBox);\n                }\n                this.reflowLabel(childBox);\n                if (this.errorBars) {\n                    for (var i = 0; i < this.errorBars.length; i++) {\n                        this$1.errorBars[i].reflow(childBox);\n                    }\n                }\n                if (this.note) {\n                    var noteTargetBox = this.markerBox();\n                    if (!(options.markers.visible && options.markers.size)) {\n                        var center = noteTargetBox.center();\n                        noteTargetBox = new Box(center.x, center.y, center.x, center.y);\n                    }\n                    this.note.reflow(noteTargetBox);\n                }\n            },\n            reflowLabel: function (box) {\n                var ref = this;\n                var options = ref.options;\n                var label = ref.label;\n                var anchor = options.labels.position;\n                if (label) {\n                    anchor = anchor === ABOVE ? TOP : anchor;\n                    anchor = anchor === BELOW ? BOTTOM : anchor;\n                    label.reflow(box);\n                    label.box.alignTo(this.markerBox(), anchor);\n                    label.reflow(label.box);\n                }\n            },\n            createHighlight: function () {\n                var markers = this.options.highlight.markers;\n                var defaultColor = this.markerBorder().color;\n                var options = this.options.markers;\n                var size = options.size + (options.border.width || 0) + (markers.border.width || 0);\n                var shadow = new ShapeElement({\n                    type: options.type,\n                    width: size,\n                    height: size,\n                    rotation: options.rotation,\n                    background: markers.color || defaultColor,\n                    border: {\n                        color: markers.border.color,\n                        width: markers.border.width,\n                        opacity: valueOrDefault(markers.border.opacity, 1)\n                    },\n                    opacity: valueOrDefault(markers.opacity, 1)\n                });\n                shadow.reflow(this._childBox);\n                return shadow.getElement();\n            },\n            highlightVisual: function () {\n                return (this.marker || {}).visual;\n            },\n            highlightVisualArgs: function () {\n                var marker = this.marker;\n                var visual, rect;\n                if (marker) {\n                    rect = marker.paddingBox.toRect();\n                    visual = marker.visual;\n                } else {\n                    var size = this.options.markers.size;\n                    var halfSize = size / 2;\n                    var center = this.box.center();\n                    rect = new geometry.Rect([\n                        center.x - halfSize,\n                        center.y - halfSize\n                    ], [\n                        size,\n                        size\n                    ]);\n                }\n                return {\n                    options: this.options,\n                    rect: rect,\n                    visual: visual\n                };\n            },\n            tooltipAnchor: function () {\n                var markerBox = this.markerBox();\n                var clipBox = this.owner.pane.clipBox();\n                var showTooltip = !clipBox || clipBox.overlaps(markerBox);\n                if (showTooltip) {\n                    var x = markerBox.x2 + TOOLTIP_OFFSET;\n                    var horizontalAlign = LEFT;\n                    var y, verticalAlign;\n                    if (this.aboveAxis) {\n                        y = markerBox.y1;\n                        verticalAlign = BOTTOM;\n                    } else {\n                        y = markerBox.y2;\n                        verticalAlign = TOP;\n                    }\n                    return {\n                        point: new Point(x, y),\n                        align: {\n                            horizontal: horizontalAlign,\n                            vertical: verticalAlign\n                        }\n                    };\n                }\n            },\n            formatValue: function (format) {\n                return this.owner.formatPointValue(this, format);\n            },\n            overlapsBox: function (box) {\n                var markerBox = this.markerBox();\n                return markerBox.overlaps(box);\n            },\n            unclipElements: function () {\n                if (this.label) {\n                    this.label.options.noclip = true;\n                }\n                if (this.note) {\n                    this.note.options.noclip = true;\n                }\n            },\n            pointData: function () {\n                return {\n                    dataItem: this.dataItem,\n                    category: this.category,\n                    value: this.value,\n                    percentage: this.percentage,\n                    stackValue: this.stackValue,\n                    series: this.series\n                };\n            }\n        });\n        LinePoint.prototype.defaults = {\n            vertical: true,\n            markers: {\n                visible: true,\n                background: WHITE,\n                size: LINE_MARKER_SIZE,\n                type: CIRCLE,\n                border: { width: 2 },\n                opacity: 1\n            },\n            labels: {\n                visible: false,\n                position: ABOVE,\n                margin: getSpacing(3),\n                padding: getSpacing(4),\n                animation: {\n                    type: FADEIN,\n                    delay: INITIAL_ANIMATION_DURATION\n                }\n            },\n            notes: { label: {} },\n            highlight: {\n                markers: {\n                    border: {\n                        color: '#fff',\n                        width: 2\n                    }\n                },\n                zIndex: datavizConstants.HIGHLIGHT_ZINDEX\n            },\n            errorBars: { line: { width: 1 } }\n        };\n        deepExtend(LinePoint.prototype, PointEventsMixin);\n        deepExtend(LinePoint.prototype, NoteMixin);\n        var LineSegment = ChartElement.extend({\n            init: function (linePoints, series, seriesIx) {\n                ChartElement.fn.init.call(this);\n                this.linePoints = linePoints;\n                this.series = series;\n                this.seriesIx = seriesIx;\n            },\n            points: function () {\n                return this.toGeometryPoints(this.linePoints);\n            },\n            toGeometryPoints: function (points) {\n                var result = [];\n                for (var i = 0, length = points.length; i < length; i++) {\n                    if (points[i] && points[i].visible !== false) {\n                        result.push(points[i]._childBox.toRect().center());\n                    }\n                }\n                return result;\n            },\n            createVisual: function () {\n                var this$1 = this;\n                var customVisual = this.series.visual;\n                if (customVisual) {\n                    this.visual = customVisual({\n                        points: this.toGeometryPoints(this.linePoints),\n                        series: this.series,\n                        sender: this.getSender(),\n                        createVisual: function () {\n                            this$1.segmentVisual();\n                            return this$1.visual;\n                        }\n                    });\n                    if (this.visual && !defined(this.visual.options.zIndex)) {\n                        this.visual.options.zIndex = this.series.zIndex;\n                    }\n                } else {\n                    this.segmentVisual();\n                }\n            },\n            segmentVisual: function () {\n                var ref = this;\n                var options = ref.options;\n                var series = ref.series;\n                var color = series.color;\n                var defaults = series._defaults;\n                if (isFunction(color) && defaults) {\n                    color = defaults.color;\n                }\n                var line = Path.fromPoints(this.points(), {\n                    stroke: {\n                        color: color,\n                        width: series.width,\n                        opacity: series.opacity,\n                        dashType: series.dashType\n                    },\n                    zIndex: series.zIndex\n                });\n                if (options.closed) {\n                    line.close();\n                }\n                this.visual = line;\n            },\n            aliasFor: function (e, coords) {\n                return this.parent.getNearestPoint(coords.x, coords.y, this.seriesIx);\n            }\n        });\n        setDefaultOptions(LineSegment, { closed: false });\n        var StepLineMixin = {\n            calculateStepPoints: function (points) {\n                var categoryAxis = this.parent.plotArea.seriesCategoryAxis(this.series);\n                var ref = categoryAxis.options;\n                var justified = ref.justified;\n                var vertical = ref.vertical;\n                var reverse = ref.reverse;\n                var stepAxis = vertical ? X : Y;\n                var axis = vertical ? Y : X;\n                var stepDir = reverse ? 2 : 1;\n                var dir = stepDir;\n                var previousPoint = toGeometryPoint(points[0], stepAxis, stepDir, axis, dir);\n                var result = [previousPoint];\n                for (var idx = 1; idx < points.length; idx++) {\n                    var point = toGeometryPoint(points[idx], stepAxis, stepDir, axis, dir);\n                    if (previousPoint[stepAxis] !== point[stepAxis]) {\n                        var stepPoint = new GeometryPoint();\n                        stepPoint[stepAxis] = previousPoint[stepAxis];\n                        stepPoint[axis] = point[axis];\n                        result.push(stepPoint, point);\n                    }\n                    previousPoint = point;\n                }\n                if (!justified) {\n                    result.push(toGeometryPoint(last(points), stepAxis, stepDir, axis, reverse ? 1 : 2));\n                } else if (previousPoint !== last(result)) {\n                    result.push(previousPoint);\n                }\n                return result;\n            }\n        };\n        function toGeometryPoint(lintPoint, stepAxis, stepDir, axis, dir) {\n            var box = lintPoint.box;\n            var result = new GeometryPoint();\n            result[stepAxis] = box[stepAxis + stepDir];\n            result[axis] = box[axis + dir];\n            return result;\n        }\n        var StepLineSegment = LineSegment.extend({\n            points: function () {\n                return this.calculateStepPoints(this.linePoints);\n            }\n        });\n        deepExtend(StepLineSegment.prototype, StepLineMixin);\n        var SplineSegment = LineSegment.extend({\n            segmentVisual: function () {\n                var series = this.series;\n                var defaults = series._defaults;\n                var color = series.color;\n                if (isFunction(color) && defaults) {\n                    color = defaults.color;\n                }\n                var curveProcessor = new CurveProcessor(this.options.closed);\n                var segments = curveProcessor.process(this.points());\n                var curve = new Path({\n                    stroke: {\n                        color: color,\n                        width: series.width,\n                        opacity: series.opacity,\n                        dashType: series.dashType\n                    },\n                    zIndex: series.zIndex\n                });\n                curve.segments.push.apply(curve.segments, segments);\n                this.visual = curve;\n            }\n        });\n        var LineChartMixin = {\n            renderSegments: function () {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var seriesPoints = ref.seriesPoints;\n                var series = options.series;\n                var seriesCount = seriesPoints.length;\n                var lastSegment;\n                this._segments = [];\n                for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var sortedPoints = this$1.sortPoints(seriesPoints[seriesIx]);\n                    var pointCount = sortedPoints.length;\n                    var linePoints = [];\n                    for (var pointIx = 0; pointIx < pointCount; pointIx++) {\n                        var point = sortedPoints[pointIx];\n                        if (point) {\n                            linePoints.push(point);\n                        } else if (this$1.seriesMissingValues(currentSeries) !== INTERPOLATE) {\n                            if (linePoints.length > 1) {\n                                lastSegment = this$1.createSegment(linePoints, currentSeries, seriesIx, lastSegment);\n                                this$1._addSegment(lastSegment);\n                            }\n                            linePoints = [];\n                        }\n                    }\n                    if (linePoints.length > 1) {\n                        lastSegment = this$1.createSegment(linePoints, currentSeries, seriesIx, lastSegment);\n                        this$1._addSegment(lastSegment);\n                    }\n                }\n                this.children.unshift.apply(this.children, this._segments);\n            },\n            _addSegment: function (segment) {\n                this._segments.push(segment);\n                segment.parent = this;\n            },\n            sortPoints: function (points) {\n                return points;\n            },\n            seriesMissingValues: function (series) {\n                var missingValues = series.missingValues;\n                var assumeZero = !missingValues && this.options.isStacked;\n                return assumeZero ? ZERO : missingValues || INTERPOLATE;\n            },\n            getNearestPoint: function (x, y, seriesIx) {\n                var target = new Point(x, y);\n                var allPoints = this.seriesPoints[seriesIx];\n                var nearestPointDistance = MAX_VALUE;\n                var nearestPoint;\n                for (var i = 0; i < allPoints.length; i++) {\n                    var point = allPoints[i];\n                    if (point && defined(point.value) && point.value !== null && point.visible !== false) {\n                        var pointBox = point.box;\n                        var pointDistance = pointBox.center().distanceTo(target);\n                        if (pointDistance < nearestPointDistance) {\n                            nearestPoint = point;\n                            nearestPointDistance = pointDistance;\n                        }\n                    }\n                }\n                return nearestPoint;\n            }\n        };\n        var ClipAnimation = Animation.extend({\n            setup: function () {\n                this._setEnd(this.options.box.x1);\n            },\n            step: function (pos) {\n                var box = this.options.box;\n                this._setEnd(dataviz.interpolateValue(box.x1, box.x2, pos));\n            },\n            _setEnd: function (x) {\n                var element = this.element;\n                var segments = element.segments;\n                var topRight = segments[1].anchor();\n                var bottomRight = segments[2].anchor();\n                element.suspend();\n                topRight.setX(x);\n                element.resume();\n                bottomRight.setX(x);\n            }\n        });\n        setDefaultOptions(ClipAnimation, { duration: INITIAL_ANIMATION_DURATION });\n        AnimationFactory.current.register('clip', ClipAnimation);\n        function anyHasZIndex(elements) {\n            for (var idx = 0; idx < elements.length; idx++) {\n                if (defined(elements[idx].zIndex)) {\n                    return true;\n                }\n            }\n        }\n        var ClipAnimationMixin = {\n            createAnimation: function () {\n                var root = this.getRoot();\n                if (root && (root.options || {}).transitions !== false) {\n                    var box = root.size();\n                    var clipPath = Path.fromRect(box.toRect());\n                    this.visual.clip(clipPath);\n                    this.animation = new ClipAnimation(clipPath, { box: box });\n                    if (anyHasZIndex(this.options.series)) {\n                        this._setChildrenAnimation(clipPath);\n                    }\n                }\n            },\n            _setChildrenAnimation: function (clipPath) {\n                var points = this.animationPoints();\n                for (var idx = 0; idx < points.length; idx++) {\n                    var point = points[idx];\n                    if (point && point.visual && defined(point.visual.options.zIndex)) {\n                        point.visual.clip(clipPath);\n                    }\n                }\n            }\n        };\n        var LineChart = CategoricalChart.extend({\n            render: function () {\n                CategoricalChart.fn.render.call(this);\n                this.updateStackRange();\n                this.renderSegments();\n            },\n            pointType: function () {\n                return LinePoint;\n            },\n            createPoint: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var missingValues = this.seriesMissingValues(series);\n                var value = data.valueFields.value;\n                if (!defined(value) || value === null) {\n                    if (missingValues === ZERO) {\n                        value = 0;\n                    } else {\n                        return null;\n                    }\n                }\n                var pointOptions = this.pointOptions(series, seriesIx);\n                pointOptions = this.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n                var color = data.fields.color || series.color;\n                if (isFunction(series.color)) {\n                    color = pointOptions.color;\n                }\n                var point = new LinePoint(value, pointOptions);\n                point.color = color;\n                this.append(point);\n                return point;\n            },\n            plotRange: function (point) {\n                var this$1 = this;\n                var plotValue = this.plotValue(point);\n                if (this.options.isStacked) {\n                    var categoryIx = point.categoryIx;\n                    var categoryPoints = this.categoryPoints[categoryIx];\n                    for (var i = 0; i < categoryPoints.length; i++) {\n                        var other = categoryPoints[i];\n                        if (point === other) {\n                            break;\n                        }\n                        plotValue += this$1.plotValue(other);\n                        if (this$1.options.isStacked100) {\n                            plotValue = Math.min(plotValue, 1);\n                        }\n                    }\n                }\n                return [\n                    plotValue,\n                    plotValue\n                ];\n            },\n            createSegment: function (linePoints, currentSeries, seriesIx) {\n                var style = currentSeries.style;\n                var pointType;\n                if (style === STEP) {\n                    pointType = StepLineSegment;\n                } else if (style === SMOOTH) {\n                    pointType = SplineSegment;\n                } else {\n                    pointType = LineSegment;\n                }\n                return new pointType(linePoints, currentSeries, seriesIx);\n            },\n            animationPoints: function () {\n                var points = this.points;\n                var result = [];\n                for (var idx = 0; idx < points.length; idx++) {\n                    result.push((points[idx] || {}).marker);\n                }\n                return result.concat(this._segments);\n            }\n        });\n        deepExtend(LineChart.prototype, LineChartMixin, ClipAnimationMixin);\n        var AreaSegment = LineSegment.extend({\n            init: function (linePoints, currentSeries, seriesIx, prevSegment, stackPoints) {\n                LineSegment.fn.init.call(this, linePoints, currentSeries, seriesIx);\n                this.prevSegment = prevSegment;\n                this.stackPoints = stackPoints;\n            },\n            createVisual: function () {\n                var series = this.series;\n                var defaults = series._defaults;\n                var lineOptions = series.line || {};\n                var color = series.color;\n                if (isFunction(color) && defaults) {\n                    color = defaults.color;\n                }\n                this.visual = new Group({ zIndex: series.zIndex });\n                this.createFill({\n                    fill: {\n                        color: color,\n                        opacity: series.opacity\n                    },\n                    stroke: null\n                });\n                if (lineOptions.width > 0 && lineOptions.visible !== false) {\n                    this.createStroke({\n                        stroke: deepExtend({\n                            color: color,\n                            opacity: series.opacity,\n                            lineCap: 'butt'\n                        }, lineOptions)\n                    });\n                }\n            },\n            strokeSegments: function () {\n                var segments = this._strokeSegments;\n                if (!segments) {\n                    segments = this._strokeSegments = this.createStrokeSegments();\n                }\n                return segments;\n            },\n            createStrokeSegments: function () {\n                return this.segmentsFromPoints(this.points());\n            },\n            stackSegments: function () {\n                if (this.prevSegment) {\n                    return this.prevSegment.createStackSegments(this.stackPoints);\n                }\n                return this.createStackSegments(this.stackPoints);\n            },\n            createStackSegments: function (stackPoints) {\n                return this.segmentsFromPoints(this.toGeometryPoints(stackPoints)).reverse();\n            },\n            segmentsFromPoints: function (points) {\n                return points.map(function (point) {\n                    return new geometry.Segment(point);\n                });\n            },\n            createStroke: function (style) {\n                var stroke = new Path(style);\n                stroke.segments.push.apply(stroke.segments, this.strokeSegments());\n                this.visual.append(stroke);\n            },\n            hasStackSegment: function () {\n                return this.prevSegment || this.stackPoints && this.stackPoints.length;\n            },\n            createFill: function (style) {\n                var strokeSegments = this.strokeSegments();\n                var fillSegments = strokeSegments.slice(0);\n                var hasStackSegments = this.hasStackSegment();\n                if (hasStackSegments) {\n                    var stackSegments = this.stackSegments();\n                    append(fillSegments, stackSegments);\n                }\n                var fill = new Path(style);\n                fill.segments.push.apply(fill.segments, fillSegments);\n                if (!hasStackSegments && strokeSegments.length > 1) {\n                    this.fillToAxes(fill);\n                }\n                this.visual.append(fill);\n            },\n            fillToAxes: function (fillPath) {\n                var chart = this.parent;\n                var invertAxes = chart.options.invertAxes;\n                var valueAxis = chart.seriesValueAxis(this.series);\n                var crossingValue = chart.categoryAxisCrossingValue(valueAxis);\n                var endSlot = valueAxis.getSlot(crossingValue, crossingValue, true);\n                var segments = this.strokeSegments();\n                var firstPoint = segments[0].anchor();\n                var lastPoint = last(segments).anchor();\n                var end = invertAxes ? endSlot.x1 : endSlot.y1;\n                if (invertAxes) {\n                    fillPath.lineTo(end, lastPoint.y).lineTo(end, firstPoint.y);\n                } else {\n                    fillPath.lineTo(lastPoint.x, end).lineTo(firstPoint.x, end);\n                }\n            }\n        });\n        var StepAreaSegment = AreaSegment.extend({\n            createStrokeSegments: function () {\n                return this.segmentsFromPoints(this.calculateStepPoints(this.linePoints));\n            },\n            createStackSegments: function (stackPoints) {\n                return this.segmentsFromPoints(this.calculateStepPoints(stackPoints)).reverse();\n            }\n        });\n        deepExtend(StepAreaSegment.prototype, StepLineMixin);\n        var SplineAreaSegment = AreaSegment.extend({\n            createStrokeSegments: function () {\n                var curveProcessor = new CurveProcessor(this.options.closed);\n                var linePoints = this.points();\n                return curveProcessor.process(linePoints);\n            },\n            createStackSegments: function () {\n                var strokeSegments = this.strokeSegments();\n                var stackSegments = [];\n                for (var idx = strokeSegments.length - 1; idx >= 0; idx--) {\n                    var segment = strokeSegments[idx];\n                    stackSegments.push(new geometry.Segment(segment.anchor(), segment.controlOut(), segment.controlIn()));\n                }\n                return stackSegments;\n            }\n        });\n        var AreaChart = LineChart.extend({\n            createSegment: function (linePoints, currentSeries, seriesIx, prevSegment) {\n                var isStacked = this.options.isStacked;\n                var style = (currentSeries.line || {}).style;\n                var previousSegment;\n                var stackPoints;\n                if (isStacked && seriesIx > 0 && prevSegment) {\n                    var missingValues = this.seriesMissingValues(currentSeries);\n                    if (missingValues !== 'gap') {\n                        stackPoints = prevSegment.linePoints;\n                        previousSegment = prevSegment;\n                    } else {\n                        stackPoints = this._gapStackPoints(linePoints, seriesIx, style);\n                    }\n                }\n                var pointType;\n                if (style === STEP) {\n                    pointType = StepAreaSegment;\n                } else if (style === SMOOTH) {\n                    pointType = SplineAreaSegment;\n                } else {\n                    pointType = AreaSegment;\n                }\n                return new pointType(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\n                LineChart.fn.reflow.call(this, targetBox);\n                var stackPoints = this._stackPoints;\n                if (stackPoints) {\n                    for (var idx = 0; idx < stackPoints.length; idx++) {\n                        var stackPoint = stackPoints[idx];\n                        var pointSlot = this$1.categoryAxis.getSlot(stackPoint.categoryIx);\n                        stackPoint.reflow(pointSlot);\n                    }\n                }\n            },\n            _gapStackPoints: function (linePoints, seriesIx, style) {\n                var this$1 = this;\n                var seriesPoints = this.seriesPoints;\n                var startIdx = linePoints[0].categoryIx;\n                var length = linePoints.length;\n                if (startIdx < 0) {\n                    startIdx = 0;\n                    length--;\n                }\n                var endIdx = startIdx + length;\n                var pointOffset = this.seriesOptions[0]._outOfRangeMinPoint ? 1 : 0;\n                var stackPoints = [];\n                this._stackPoints = this._stackPoints || [];\n                for (var categoryIx = startIdx; categoryIx < endIdx; categoryIx++) {\n                    var pointIx = categoryIx + pointOffset;\n                    var currentSeriesIx = seriesIx;\n                    var point = void 0;\n                    do {\n                        currentSeriesIx--;\n                        point = seriesPoints[currentSeriesIx][pointIx];\n                    } while (currentSeriesIx > 0 && !point);\n                    if (point) {\n                        if (style !== STEP && categoryIx > startIdx && !seriesPoints[currentSeriesIx][pointIx - 1]) {\n                            stackPoints.push(this$1._previousSegmentPoint(categoryIx, pointIx, pointIx - 1, currentSeriesIx));\n                        }\n                        stackPoints.push(point);\n                        if (style !== STEP && categoryIx + 1 < endIdx && !seriesPoints[currentSeriesIx][pointIx + 1]) {\n                            stackPoints.push(this$1._previousSegmentPoint(categoryIx, pointIx, pointIx + 1, currentSeriesIx));\n                        }\n                    } else {\n                        var gapStackPoint = this$1._createGapStackPoint(categoryIx);\n                        this$1._stackPoints.push(gapStackPoint);\n                        stackPoints.push(gapStackPoint);\n                    }\n                }\n                return stackPoints;\n            },\n            _previousSegmentPoint: function (categoryIx, pointIx, segmentIx, seriesIdx) {\n                var seriesPoints = this.seriesPoints;\n                var index = seriesIdx;\n                var point;\n                while (index > 0 && !point) {\n                    index--;\n                    point = seriesPoints[index][segmentIx];\n                }\n                if (!point) {\n                    point = this._createGapStackPoint(categoryIx);\n                    this._stackPoints.push(point);\n                } else {\n                    point = seriesPoints[index][pointIx];\n                }\n                return point;\n            },\n            _createGapStackPoint: function (categoryIx) {\n                var options = this.pointOptions({}, 0);\n                var point = new LinePoint(0, options);\n                point.categoryIx = categoryIx;\n                point.series = {};\n                return point;\n            },\n            seriesMissingValues: function (series) {\n                return series.missingValues || ZERO;\n            }\n        });\n        var AxisGroupRangeTracker = Class.extend({\n            init: function () {\n                this.axisRanges = {};\n            },\n            update: function (chartAxisRanges) {\n                var axisRanges = this.axisRanges;\n                for (var axisName in chartAxisRanges) {\n                    var chartRange = chartAxisRanges[axisName];\n                    var range = axisRanges[axisName];\n                    axisRanges[axisName] = range = range || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    range.min = Math.min(range.min, chartRange.min);\n                    range.max = Math.max(range.max, chartRange.max);\n                }\n            },\n            reset: function (axisName) {\n                this.axisRanges[axisName] = undefined;\n            },\n            query: function (axisName) {\n                return this.axisRanges[axisName];\n            }\n        });\n        var BarLabel = ChartElement.extend({\n            init: function (content, options, pointData) {\n                ChartElement.fn.init.call(this, options);\n                this.textBox = new TextBox(content, this.options, pointData);\n                this.append(this.textBox);\n            },\n            createVisual: function () {\n                this.textBox.options.noclip = this.options.noclip;\n            },\n            reflow: function (targetBox) {\n                var options = this.options;\n                var vertical = options.vertical;\n                var aboveAxis = options.aboveAxis;\n                var text = this.children[0];\n                var textOptions = text.options;\n                var box = text.box;\n                var padding = text.options.padding;\n                var labelBox = targetBox;\n                textOptions.align = vertical ? CENTER : LEFT;\n                textOptions.vAlign = vertical ? TOP : CENTER;\n                if (options.position === INSIDE_END) {\n                    if (vertical) {\n                        textOptions.vAlign = TOP;\n                        if (!aboveAxis && box.height() < targetBox.height()) {\n                            textOptions.vAlign = BOTTOM;\n                        }\n                    } else {\n                        textOptions.align = aboveAxis ? RIGHT : LEFT;\n                    }\n                } else if (options.position === CENTER) {\n                    textOptions.vAlign = CENTER;\n                    textOptions.align = CENTER;\n                } else if (options.position === INSIDE_BASE) {\n                    if (vertical) {\n                        textOptions.vAlign = aboveAxis ? BOTTOM : TOP;\n                    } else {\n                        textOptions.align = aboveAxis ? LEFT : RIGHT;\n                    }\n                } else if (options.position === OUTSIDE_END) {\n                    if (vertical) {\n                        if (aboveAxis) {\n                            labelBox = new Box(targetBox.x1, targetBox.y1 - box.height(), targetBox.x2, targetBox.y1);\n                        } else {\n                            labelBox = new Box(targetBox.x1, targetBox.y2, targetBox.x2, targetBox.y2 + box.height());\n                        }\n                    } else {\n                        textOptions.align = CENTER;\n                        if (aboveAxis) {\n                            labelBox = new Box(targetBox.x2, targetBox.y1, targetBox.x2 + box.width(), targetBox.y2);\n                        } else {\n                            labelBox = new Box(targetBox.x1 - box.width(), targetBox.y1, targetBox.x1, targetBox.y2);\n                        }\n                    }\n                }\n                if (!options.rotation) {\n                    if (vertical) {\n                        padding.left = padding.right = (labelBox.width() - text.contentBox.width()) / 2;\n                    } else {\n                        padding.top = padding.bottom = (labelBox.height() - text.contentBox.height()) / 2;\n                    }\n                }\n                text.reflow(labelBox);\n            },\n            alignToClipBox: function (clipBox) {\n                var vertical = this.options.vertical;\n                var field = vertical ? Y : X;\n                var start = field + '1';\n                var end = field + '2';\n                var text = this.children[0];\n                var parentBox = this.parent.box;\n                if (parentBox[start] < clipBox[start] || clipBox[end] < parentBox[end]) {\n                    var targetBox = text.paddingBox.clone();\n                    targetBox[start] = Math.max(parentBox[start], clipBox[start]);\n                    targetBox[end] = Math.min(parentBox[end], clipBox[end]);\n                    this.reflow(targetBox);\n                }\n            }\n        });\n        setDefaultOptions(BarLabel, {\n            position: OUTSIDE_END,\n            margin: getSpacing(3),\n            padding: getSpacing(4),\n            color: BLACK,\n            background: '',\n            border: {\n                width: 1,\n                color: ''\n            },\n            aboveAxis: true,\n            vertical: false,\n            animation: {\n                type: FADEIN,\n                delay: INITIAL_ANIMATION_DURATION\n            },\n            zIndex: 2\n        });\n        function hasGradientOverlay(options) {\n            var overlay = options.overlay;\n            return overlay && overlay.gradient && overlay.gradient !== 'none';\n        }\n        var BAR_ALIGN_MIN_WIDTH = 6;\n        var Bar = ChartElement.extend({\n            init: function (value, options) {\n                ChartElement.fn.init.call(this);\n                this.options = options;\n                this.color = options.color || WHITE;\n                this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n                this.value = value;\n            },\n            render: function () {\n                if (this._rendered) {\n                    return;\n                }\n                this._rendered = true;\n                this.createLabel();\n                this.createNote();\n                if (this.errorBar) {\n                    this.append(this.errorBar);\n                }\n            },\n            createLabel: function () {\n                var options = this.options;\n                var labels = options.labels;\n                if (labels.visible) {\n                    var pointData = this.pointData();\n                    var labelTemplate = getTemplate(labels);\n                    var labelText;\n                    if (labelTemplate) {\n                        labelText = labelTemplate(pointData);\n                    } else {\n                        labelText = this.formatValue(labels.format);\n                    }\n                    this.label = new BarLabel(labelText, deepExtend({ vertical: options.vertical }, labels), pointData);\n                    this.append(this.label);\n                }\n            },\n            formatValue: function (format) {\n                return this.owner.formatPointValue(this, format);\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\n                this.render();\n                var label = this.label;\n                this.box = targetBox;\n                if (label) {\n                    label.options.aboveAxis = this.aboveAxis;\n                    label.reflow(targetBox);\n                }\n                if (this.note) {\n                    this.note.reflow(targetBox);\n                }\n                if (this.errorBars) {\n                    for (var i = 0; i < this.errorBars.length; i++) {\n                        this$1.errorBars[i].reflow(targetBox);\n                    }\n                }\n            },\n            createVisual: function () {\n                var this$1 = this;\n                var ref = this;\n                var box = ref.box;\n                var options = ref.options;\n                var customVisual = options.visual;\n                if (this.visible !== false) {\n                    ChartElement.fn.createVisual.call(this);\n                    if (customVisual) {\n                        var visual = this.rectVisual = customVisual({\n                            category: this.category,\n                            dataItem: this.dataItem,\n                            value: this.value,\n                            sender: this.getSender(),\n                            series: this.series,\n                            percentage: this.percentage,\n                            stackValue: this.stackValue,\n                            runningTotal: this.runningTotal,\n                            total: this.total,\n                            rect: box.toRect(),\n                            createVisual: function () {\n                                var group = new Group();\n                                this$1.createRect(group);\n                                return group;\n                            },\n                            options: options\n                        });\n                        if (visual) {\n                            this.visual.append(visual);\n                        }\n                    } else if (box.width() > 0 && box.height() > 0) {\n                        this.createRect(this.visual);\n                    }\n                }\n            },\n            createRect: function (visual) {\n                var options = this.options;\n                var border = options.border;\n                var strokeOpacity = defined(border.opacity) ? border.opacity : options.opacity;\n                var rect = this.box.toRect();\n                rect.size.width = Math.round(rect.size.width);\n                var path = this.rectVisual = Path.fromRect(rect, {\n                    fill: {\n                        color: this.color,\n                        opacity: options.opacity\n                    },\n                    stroke: {\n                        color: this.getBorderColor(),\n                        width: border.width,\n                        opacity: strokeOpacity,\n                        dashType: border.dashType\n                    }\n                });\n                var width = this.box.width();\n                var height = this.box.height();\n                var size = options.vertical ? width : height;\n                if (size > BAR_ALIGN_MIN_WIDTH) {\n                    alignPathToPixel(path);\n                    if (width < 1 || height < 1) {\n                        path.options.stroke.lineJoin = 'round';\n                    }\n                }\n                visual.append(path);\n                if (hasGradientOverlay(options)) {\n                    var overlay = this.createGradientOverlay(path, { baseColor: this.color }, deepExtend({\n                        end: !options.vertical ? [\n                            0,\n                            1\n                        ] : undefined\n                    }, options.overlay));\n                    visual.append(overlay);\n                }\n            },\n            createHighlight: function (style) {\n                var highlight = Path.fromRect(this.box.toRect(), style);\n                return alignPathToPixel(highlight);\n            },\n            highlightVisual: function () {\n                return this.rectVisual;\n            },\n            highlightVisualArgs: function () {\n                return {\n                    options: this.options,\n                    rect: this.box.toRect(),\n                    visual: this.rectVisual\n                };\n            },\n            getBorderColor: function () {\n                var color = this.color;\n                var border = this.options.border;\n                var brightness = border._brightness || BORDER_BRIGHTNESS;\n                var borderColor = border.color;\n                if (!defined(borderColor)) {\n                    borderColor = new Color(color).brightness(brightness).toHex();\n                }\n                return borderColor;\n            },\n            tooltipAnchor: function () {\n                var ref = this;\n                var options = ref.options;\n                var box = ref.box;\n                var aboveAxis = ref.aboveAxis;\n                var clipBox = this.owner.pane.clipBox() || box;\n                var horizontalAlign = LEFT;\n                var verticalAlign = TOP;\n                var x, y;\n                if (options.vertical) {\n                    x = Math.min(box.x2, clipBox.x2) + TOOLTIP_OFFSET;\n                    if (aboveAxis) {\n                        y = Math.max(box.y1, clipBox.y1);\n                    } else {\n                        y = Math.min(box.y2, clipBox.y2);\n                        verticalAlign = BOTTOM;\n                    }\n                } else {\n                    var x1 = Math.max(box.x1, clipBox.x1);\n                    var x2 = Math.min(box.x2, clipBox.x2);\n                    if (options.isStacked) {\n                        verticalAlign = BOTTOM;\n                        if (aboveAxis) {\n                            horizontalAlign = RIGHT;\n                            x = x2;\n                        } else {\n                            x = x1;\n                        }\n                        y = Math.max(box.y1, clipBox.y1) - TOOLTIP_OFFSET;\n                    } else {\n                        if (aboveAxis) {\n                            x = x2 + TOOLTIP_OFFSET;\n                        } else {\n                            x = x1 - TOOLTIP_OFFSET;\n                            horizontalAlign = RIGHT;\n                        }\n                        y = Math.max(box.y1, clipBox.y1);\n                    }\n                }\n                return {\n                    point: new Point(x, y),\n                    align: {\n                        horizontal: horizontalAlign,\n                        vertical: verticalAlign\n                    }\n                };\n            },\n            overlapsBox: function (box) {\n                return this.box.overlaps(box);\n            },\n            pointData: function () {\n                return {\n                    dataItem: this.dataItem,\n                    category: this.category,\n                    value: this.value,\n                    percentage: this.percentage,\n                    stackValue: this.stackValue,\n                    runningTotal: this.runningTotal,\n                    total: this.total,\n                    series: this.series\n                };\n            }\n        });\n        deepExtend(Bar.prototype, PointEventsMixin);\n        deepExtend(Bar.prototype, NoteMixin);\n        Bar.prototype.defaults = {\n            border: { width: 1 },\n            vertical: true,\n            overlay: { gradient: 'glass' },\n            labels: {\n                visible: false,\n                format: '{0}'\n            },\n            opacity: 1,\n            notes: { label: {} }\n        };\n        function forEach(elements, callback) {\n            elements.forEach(callback);\n        }\n        function forEachReverse(elements, callback) {\n            var length = elements.length;\n            for (var idx = length - 1; idx >= 0; idx--) {\n                callback(elements[idx], idx - length - 1);\n            }\n        }\n        var ClusterLayout = ChartElement.extend({\n            init: function (options) {\n                ChartElement.fn.init.call(this, options);\n                this.forEach = options.rtl ? forEachReverse : forEach;\n            },\n            reflow: function (box) {\n                var ref = this.options;\n                var vertical = ref.vertical;\n                var gap = ref.gap;\n                var spacing = ref.spacing;\n                var children = this.children;\n                var count = children.length;\n                var axis = vertical ? Y : X;\n                var slots = count + gap + spacing * (count - 1);\n                var slotSize = (vertical ? box.height() : box.width()) / slots;\n                var position = box[axis + 1] + slotSize * (gap / 2);\n                this.forEach(children, function (child, idx) {\n                    var childBox = (child.box || box).clone();\n                    childBox[axis + 1] = position;\n                    childBox[axis + 2] = position + slotSize;\n                    child.reflow(childBox);\n                    if (idx < count - 1) {\n                        position += slotSize * spacing;\n                    }\n                    position += slotSize;\n                });\n            }\n        });\n        setDefaultOptions(ClusterLayout, {\n            vertical: false,\n            gap: 0,\n            spacing: 0\n        });\n        var StackWrap = ChartElement.extend({\n            reflow: function (targetBox) {\n                var this$1 = this;\n                var positionAxis = this.options.vertical ? X : Y;\n                var children = this.children;\n                var childrenCount = children.length;\n                var box = this.box = new Box();\n                for (var i = 0; i < childrenCount; i++) {\n                    var currentChild = children[i];\n                    if (currentChild.visible !== false) {\n                        var childBox = currentChild.box.clone();\n                        childBox.snapTo(targetBox, positionAxis);\n                        if (i === 0) {\n                            box = this$1.box = childBox.clone();\n                        }\n                        currentChild.reflow(childBox);\n                        box.wrap(childBox);\n                    }\n                }\n            }\n        });\n        setDefaultOptions(StackWrap, { vertical: true });\n        var BarChart = CategoricalChart.extend({\n            render: function () {\n                CategoricalChart.fn.render.call(this);\n                this.updateStackRange();\n            },\n            pointType: function () {\n                return Bar;\n            },\n            clusterType: function () {\n                return ClusterLayout;\n            },\n            stackType: function () {\n                return StackWrap;\n            },\n            stackLimits: function (axisName, stackName) {\n                var limits = CategoricalChart.fn.stackLimits.call(this, axisName, stackName);\n                return limits;\n            },\n            createPoint: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var ref = this;\n                var options = ref.options;\n                var children = ref.children;\n                var isStacked = options.isStacked;\n                var value = this.pointValue(data);\n                var pointOptions = this.pointOptions(series, seriesIx);\n                var labelOptions = pointOptions.labels;\n                if (isStacked) {\n                    if (labelOptions.position === OUTSIDE_END) {\n                        labelOptions.position = INSIDE_END;\n                    }\n                }\n                pointOptions.isStacked = isStacked;\n                var color = data.fields.color || series.color;\n                if (value < 0 && pointOptions.negativeColor) {\n                    color = pointOptions.negativeColor;\n                }\n                pointOptions = this.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n                if (isFunction(series.color)) {\n                    color = pointOptions.color;\n                }\n                var pointType = this.pointType();\n                var point = new pointType(value, pointOptions);\n                point.color = color;\n                var cluster = children[categoryIx];\n                if (!cluster) {\n                    var clusterType = this.clusterType();\n                    cluster = new clusterType({\n                        vertical: options.invertAxes,\n                        gap: options.gap,\n                        spacing: options.spacing,\n                        rtl: !options.invertAxes && (this.chartService || {}).rtl\n                    });\n                    this.append(cluster);\n                }\n                if (isStacked) {\n                    var stackWrap = this.getStackWrap(series, cluster);\n                    stackWrap.append(point);\n                } else {\n                    cluster.append(point);\n                }\n                return point;\n            },\n            getStackWrap: function (series, cluster) {\n                var stack = series.stack;\n                var stackGroup = stack ? stack.group || stack : stack;\n                var wraps = cluster.children;\n                var stackWrap;\n                if (typeof stackGroup === datavizConstants.STRING) {\n                    for (var i = 0; i < wraps.length; i++) {\n                        if (wraps[i]._stackGroup === stackGroup) {\n                            stackWrap = wraps[i];\n                            break;\n                        }\n                    }\n                } else {\n                    stackWrap = wraps[0];\n                }\n                if (!stackWrap) {\n                    var stackType = this.stackType();\n                    stackWrap = new stackType({ vertical: !this.options.invertAxes });\n                    stackWrap._stackGroup = stackGroup;\n                    cluster.append(stackWrap);\n                }\n                return stackWrap;\n            },\n            categorySlot: function (categoryAxis, categoryIx, valueAxis) {\n                var options = this.options;\n                var categorySlot = categoryAxis.getSlot(categoryIx);\n                var startValue = valueAxis.startValue();\n                if (options.isStacked) {\n                    var zeroSlot = valueAxis.getSlot(startValue, startValue, true);\n                    var stackAxis = options.invertAxes ? X : Y;\n                    categorySlot[stackAxis + 1] = categorySlot[stackAxis + 2] = zeroSlot[stackAxis + 1];\n                }\n                return categorySlot;\n            },\n            reflowCategories: function (categorySlots) {\n                var children = this.children;\n                var childrenLength = children.length;\n                for (var i = 0; i < childrenLength; i++) {\n                    children[i].reflow(categorySlots[i]);\n                }\n            },\n            createAnimation: function () {\n                this._setAnimationOptions();\n                CategoricalChart.fn.createAnimation.call(this);\n                if (anyHasZIndex(this.options.series)) {\n                    this._setChildrenAnimation();\n                }\n            },\n            _setChildrenAnimation: function () {\n                var this$1 = this;\n                var points = this.points;\n                for (var idx = 0; idx < points.length; idx++) {\n                    var point = points[idx];\n                    var pointVisual = point.visual;\n                    if (pointVisual && defined(pointVisual.options.zIndex)) {\n                        point.options.animation = this$1.options.animation;\n                        point.createAnimation();\n                    }\n                }\n            },\n            _setAnimationOptions: function () {\n                var options = this.options;\n                var animation = options.animation || {};\n                var origin;\n                if (options.isStacked) {\n                    var valueAxis = this.seriesValueAxis(options.series[0]);\n                    origin = valueAxis.getSlot(valueAxis.startValue());\n                } else {\n                    origin = this.categoryAxis.getSlot(0);\n                }\n                animation.origin = new GeometryPoint(origin.x1, origin.y1);\n                animation.vertical = !options.invertAxes;\n            }\n        });\n        setDefaultOptions(BarChart, { animation: { type: BAR } });\n        var Candlestick = ChartElement.extend({\n            init: function (value, options) {\n                ChartElement.fn.init.call(this, options);\n                this.value = value;\n            },\n            reflow: function (box) {\n                var ref = this;\n                var options = ref.options;\n                var value = ref.value;\n                var chart = ref.owner;\n                var valueAxis = chart.seriesValueAxis(options);\n                var ocSlot = valueAxis.getSlot(value.open, value.close);\n                var lhSlot = valueAxis.getSlot(value.low, value.high);\n                ocSlot.x1 = lhSlot.x1 = box.x1;\n                ocSlot.x2 = lhSlot.x2 = box.x2;\n                this.realBody = ocSlot;\n                var mid = lhSlot.center().x;\n                var points = [];\n                points.push([\n                    [\n                        mid,\n                        lhSlot.y1\n                    ],\n                    [\n                        mid,\n                        ocSlot.y1\n                    ]\n                ]);\n                points.push([\n                    [\n                        mid,\n                        ocSlot.y2\n                    ],\n                    [\n                        mid,\n                        lhSlot.y2\n                    ]\n                ]);\n                this.lines = points;\n                this.box = lhSlot.clone().wrap(ocSlot);\n                if (!this._rendered) {\n                    this._rendered = true;\n                    this.createNote();\n                }\n                this.reflowNote();\n            },\n            reflowNote: function () {\n                if (this.note) {\n                    this.note.reflow(this.box);\n                }\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                this._mainVisual = this.mainVisual(this.options);\n                this.visual.append(this._mainVisual);\n                this.createOverlay();\n            },\n            mainVisual: function (options) {\n                var group = new Group();\n                this.createBody(group, options);\n                this.createLines(group, options);\n                return group;\n            },\n            createBody: function (container, options) {\n                var body = Path.fromRect(this.realBody.toRect(), {\n                    fill: {\n                        color: this.color,\n                        opacity: options.opacity\n                    },\n                    stroke: null\n                });\n                if (options.border.width > 0) {\n                    body.options.set('stroke', {\n                        color: this.getBorderColor(),\n                        width: options.border.width,\n                        dashType: options.border.dashType,\n                        opacity: valueOrDefault(options.border.opacity, options.opacity)\n                    });\n                }\n                alignPathToPixel(body);\n                container.append(body);\n                if (hasGradientOverlay(options)) {\n                    container.append(this.createGradientOverlay(body, { baseColor: this.color }, deepExtend({\n                        end: !options.vertical ? [\n                            0,\n                            1\n                        ] : undefined\n                    }, options.overlay)));\n                }\n            },\n            createLines: function (container, options) {\n                this.drawLines(container, options, this.lines, options.line);\n            },\n            drawLines: function (container, options, lines, lineOptions) {\n                if (!lines) {\n                    return;\n                }\n                var lineStyle = {\n                    stroke: {\n                        color: lineOptions.color || this.color,\n                        opacity: valueOrDefault(lineOptions.opacity, options.opacity),\n                        width: lineOptions.width,\n                        dashType: lineOptions.dashType,\n                        lineCap: 'butt'\n                    }\n                };\n                for (var i = 0; i < lines.length; i++) {\n                    var line = Path.fromPoints(lines[i], lineStyle);\n                    alignPathToPixel(line);\n                    container.append(line);\n                }\n            },\n            getBorderColor: function () {\n                var border = this.options.border;\n                var borderColor = border.color;\n                if (!defined(borderColor)) {\n                    borderColor = new Color(this.color).brightness(border._brightness).toHex();\n                }\n                return borderColor;\n            },\n            createOverlay: function () {\n                var overlay = Path.fromRect(this.box.toRect(), {\n                    fill: {\n                        color: WHITE,\n                        opacity: 0\n                    },\n                    stroke: null\n                });\n                this.visual.append(overlay);\n            },\n            createHighlight: function () {\n                var highlight = this.options.highlight;\n                var normalColor = this.color;\n                this.color = highlight.color || this.color;\n                var overlay = this.mainVisual(deepExtend({}, this.options, { line: { color: this.getBorderColor() } }, highlight));\n                this.color = normalColor;\n                return overlay;\n            },\n            highlightVisual: function () {\n                return this._mainVisual;\n            },\n            highlightVisualArgs: function () {\n                return {\n                    options: this.options,\n                    rect: this.box.toRect(),\n                    visual: this._mainVisual\n                };\n            },\n            tooltipAnchor: function () {\n                var box = this.box;\n                var clipBox = this.owner.pane.clipBox() || box;\n                return {\n                    point: new Point(box.x2 + TOOLTIP_OFFSET, Math.max(box.y1, clipBox.y1) + TOOLTIP_OFFSET),\n                    align: {\n                        horizontal: LEFT,\n                        vertical: TOP\n                    }\n                };\n            },\n            formatValue: function (format) {\n                return this.owner.formatPointValue(this, format);\n            },\n            overlapsBox: function (box) {\n                return this.box.overlaps(box);\n            }\n        });\n        setDefaultOptions(Candlestick, {\n            vertical: true,\n            border: { _brightness: 0.8 },\n            line: { width: 2 },\n            overlay: { gradient: 'glass' },\n            tooltip: { format: '<table>' + '<tr><th colspan=\\'2\\'>{4:d}</th></tr>' + '<tr><td>Open:</td><td>{0:C}</td></tr>' + '<tr><td>High:</td><td>{1:C}</td></tr>' + '<tr><td>Low:</td><td>{2:C}</td></tr>' + '<tr><td>Close:</td><td>{3:C}</td></tr>' + '</table>' },\n            highlight: {\n                opacity: 1,\n                border: {\n                    width: 1,\n                    opacity: 1\n                },\n                line: {\n                    width: 1,\n                    opacity: 1\n                }\n            },\n            notes: {\n                visible: true,\n                label: {}\n            }\n        });\n        deepExtend(Candlestick.prototype, PointEventsMixin);\n        deepExtend(Candlestick.prototype, NoteMixin);\n        function areNumbers(values) {\n            return countNumbers(values) === values.length;\n        }\n        var CandlestickChart = CategoricalChart.extend({\n            reflowCategories: function (categorySlots) {\n                var children = this.children;\n                var childrenLength = children.length;\n                for (var i = 0; i < childrenLength; i++) {\n                    children[i].reflow(categorySlots[i]);\n                }\n            },\n            addValue: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var ref = this;\n                var children = ref.children;\n                var options = ref.options;\n                var value = data.valueFields;\n                var valueParts = this.splitValue(value);\n                var hasValue = areNumbers(valueParts);\n                var dataItem = series.data[categoryIx];\n                var categoryPoints = this.categoryPoints[categoryIx];\n                var point;\n                if (!categoryPoints) {\n                    this.categoryPoints[categoryIx] = categoryPoints = [];\n                }\n                if (hasValue) {\n                    point = this.createPoint(data, fields);\n                }\n                var cluster = children[categoryIx];\n                if (!cluster) {\n                    cluster = new ClusterLayout({\n                        vertical: options.invertAxes,\n                        gap: options.gap,\n                        spacing: options.spacing,\n                        rtl: !options.invertAxes && (this.chartService || {}).rtl\n                    });\n                    this.append(cluster);\n                }\n                if (point) {\n                    this.updateRange(value, fields);\n                    cluster.append(point);\n                    point.categoryIx = categoryIx;\n                    point.category = category;\n                    point.series = series;\n                    point.seriesIx = seriesIx;\n                    point.owner = this;\n                    point.dataItem = dataItem;\n                    point.noteText = data.fields.noteText;\n                }\n                this.points.push(point);\n                categoryPoints.push(point);\n            },\n            pointType: function () {\n                return Candlestick;\n            },\n            createPoint: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var pointType = this.pointType();\n                var value = data.valueFields;\n                var pointOptions = deepExtend({}, series);\n                var color = data.fields.color || series.color;\n                pointOptions = this.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n                if (series.type === CANDLESTICK) {\n                    if (value.open > value.close) {\n                        color = data.fields.downColor || series.downColor || series.color;\n                    }\n                }\n                if (isFunction(series.color)) {\n                    color = pointOptions.color;\n                }\n                pointOptions.vertical = !this.options.invertAxes;\n                var point = new pointType(value, pointOptions);\n                point.color = color;\n                return point;\n            },\n            splitValue: function (value) {\n                return [\n                    value.low,\n                    value.open,\n                    value.close,\n                    value.high\n                ];\n            },\n            updateRange: function (value, fields) {\n                var axisName = fields.series.axis;\n                var parts = this.splitValue(value);\n                var axisRange = this.valueAxisRanges[axisName];\n                axisRange = this.valueAxisRanges[axisName] = axisRange || {\n                    min: MAX_VALUE,\n                    max: MIN_VALUE\n                };\n                axisRange = this.valueAxisRanges[axisName] = {\n                    min: Math.min.apply(Math, parts.concat([axisRange.min])),\n                    max: Math.max.apply(Math, parts.concat([axisRange.max]))\n                };\n            },\n            formatPointValue: function (point, format) {\n                var value = point.value;\n                return this.chartService.format.auto(format, value.open, value.high, value.low, value.close, point.category);\n            },\n            animationPoints: function () {\n                return this.points;\n            }\n        });\n        deepExtend(CandlestickChart.prototype, ClipAnimationMixin);\n        var BoxPlot = Candlestick.extend({\n            init: function (value, options) {\n                Candlestick.fn.init.call(this, value, options);\n                this.createNote();\n            },\n            reflow: function (box) {\n                var ref = this;\n                var options = ref.options;\n                var value = ref.value;\n                var chart = ref.owner;\n                var valueAxis = chart.seriesValueAxis(options);\n                var whiskerSlot, boxSlot;\n                this.boxSlot = boxSlot = valueAxis.getSlot(value.q1, value.q3);\n                this.realBody = boxSlot;\n                this.reflowBoxSlot(box);\n                this.whiskerSlot = whiskerSlot = valueAxis.getSlot(value.lower, value.upper);\n                this.reflowWhiskerSlot(box);\n                var medianSlot = valueAxis.getSlot(value.median);\n                if (value.mean) {\n                    var meanSlot = valueAxis.getSlot(value.mean);\n                    this.meanPoints = this.calcMeanPoints(box, meanSlot);\n                }\n                this.whiskerPoints = this.calcWhiskerPoints(boxSlot, whiskerSlot);\n                this.medianPoints = this.calcMedianPoints(box, medianSlot);\n                this.box = whiskerSlot.clone().wrap(boxSlot);\n                this.reflowNote();\n            },\n            reflowBoxSlot: function (box) {\n                this.boxSlot.x1 = box.x1;\n                this.boxSlot.x2 = box.x2;\n            },\n            reflowWhiskerSlot: function (box) {\n                this.whiskerSlot.x1 = box.x1;\n                this.whiskerSlot.x2 = box.x2;\n            },\n            calcMeanPoints: function (box, meanSlot) {\n                return [[\n                        [\n                            box.x1,\n                            meanSlot.y1\n                        ],\n                        [\n                            box.x2,\n                            meanSlot.y1\n                        ]\n                    ]];\n            },\n            calcWhiskerPoints: function (boxSlot, whiskerSlot) {\n                var mid = whiskerSlot.center().x;\n                return [\n                    [\n                        [\n                            mid - 5,\n                            whiskerSlot.y1\n                        ],\n                        [\n                            mid + 5,\n                            whiskerSlot.y1\n                        ],\n                        [\n                            mid,\n                            whiskerSlot.y1\n                        ],\n                        [\n                            mid,\n                            boxSlot.y1\n                        ]\n                    ],\n                    [\n                        [\n                            mid - 5,\n                            whiskerSlot.y2\n                        ],\n                        [\n                            mid + 5,\n                            whiskerSlot.y2\n                        ],\n                        [\n                            mid,\n                            whiskerSlot.y2\n                        ],\n                        [\n                            mid,\n                            boxSlot.y2\n                        ]\n                    ]\n                ];\n            },\n            calcMedianPoints: function (box, medianSlot) {\n                return [[\n                        [\n                            box.x1,\n                            medianSlot.y1\n                        ],\n                        [\n                            box.x2,\n                            medianSlot.y1\n                        ]\n                    ]];\n            },\n            renderOutliers: function (options) {\n                var this$1 = this;\n                var value = this.value;\n                var outliers = value.outliers || [];\n                var outerFence = Math.abs(value.q3 - value.q1) * 3;\n                var elements = [];\n                var markers = options.markers || {};\n                for (var i = 0; i < outliers.length; i++) {\n                    var outlierValue = outliers[i];\n                    if (outlierValue < value.q3 + outerFence && outlierValue > value.q1 - outerFence) {\n                        markers = options.outliers;\n                    } else {\n                        markers = options.extremes;\n                    }\n                    var markersBorder = deepExtend({}, markers.border);\n                    if (!defined(markersBorder.color)) {\n                        if (defined(this$1.color)) {\n                            markersBorder.color = this$1.color;\n                        } else {\n                            markersBorder.color = new Color(markers.background).brightness(BORDER_BRIGHTNESS).toHex();\n                        }\n                    }\n                    var shape = new ShapeElement({\n                        type: markers.type,\n                        width: markers.size,\n                        height: markers.size,\n                        rotation: markers.rotation,\n                        background: markers.background,\n                        border: markersBorder,\n                        opacity: markers.opacity\n                    });\n                    shape.value = outlierValue;\n                    elements.push(shape);\n                }\n                this.reflowOutliers(elements);\n                return elements;\n            },\n            reflowOutliers: function (outliers) {\n                var this$1 = this;\n                var valueAxis = this.owner.seriesValueAxis(this.options);\n                var center = this.box.center();\n                for (var i = 0; i < outliers.length; i++) {\n                    var outlierValue = outliers[i].value;\n                    var markerBox = valueAxis.getSlot(outlierValue);\n                    if (this$1.options.vertical) {\n                        markerBox.move(center.x);\n                    } else {\n                        markerBox.move(undefined, center.y);\n                    }\n                    this$1.box = this$1.box.wrap(markerBox);\n                    outliers[i].reflow(markerBox);\n                }\n            },\n            mainVisual: function (options) {\n                var group = Candlestick.fn.mainVisual.call(this, options);\n                var outliers = this.renderOutliers(options);\n                for (var i = 0; i < outliers.length; i++) {\n                    var element = outliers[i].getElement();\n                    if (element) {\n                        group.append(element);\n                    }\n                }\n                return group;\n            },\n            createLines: function (container, options) {\n                this.drawLines(container, options, this.whiskerPoints, options.whiskers);\n                this.drawLines(container, options, this.medianPoints, options.median);\n                this.drawLines(container, options, this.meanPoints, options.mean);\n            },\n            getBorderColor: function () {\n                if ((this.options.border || {}).color) {\n                    return this.options.border.color;\n                }\n                if (this.color) {\n                    return this.color;\n                }\n                return Candlestick.fn.getBorderColor.call(this);\n            }\n        });\n        setDefaultOptions(BoxPlot, {\n            border: { _brightness: 0.8 },\n            line: { width: 2 },\n            median: { color: '#f6f6f6' },\n            mean: {\n                width: 2,\n                dashType: 'dash',\n                color: '#f6f6f6'\n            },\n            overlay: { gradient: 'glass' },\n            tooltip: { format: '<table>' + '<tr><th colspan=\\'2\\'>{6:d}</th></tr>' + '<tr><td>Lower:</td><td>{0:C}</td></tr>' + '<tr><td>Q1:</td><td>{1:C}</td></tr>' + '<tr><td>Median:</td><td>{2:C}</td></tr>' + '<tr><td>Mean:</td><td>{5:C}</td></tr>' + '<tr><td>Q3:</td><td>{3:C}</td></tr>' + '<tr><td>Upper:</td><td>{4:C}</td></tr>' + '</table>' },\n            highlight: {\n                opacity: 1,\n                border: {\n                    width: 1,\n                    opacity: 1\n                },\n                line: {\n                    width: 1,\n                    opacity: 1\n                }\n            },\n            notes: {\n                visible: true,\n                label: {}\n            },\n            outliers: {\n                visible: true,\n                size: LINE_MARKER_SIZE,\n                type: datavizConstants.CROSS,\n                background: WHITE,\n                border: {\n                    width: 2,\n                    opacity: 1\n                },\n                opacity: 0\n            },\n            extremes: {\n                visible: true,\n                size: LINE_MARKER_SIZE,\n                type: CIRCLE,\n                background: WHITE,\n                border: {\n                    width: 2,\n                    opacity: 1\n                },\n                opacity: 0\n            }\n        });\n        deepExtend(BoxPlot.prototype, PointEventsMixin);\n        var VerticalBoxPlot = BoxPlot.extend({\n            reflowBoxSlot: function (box) {\n                this.boxSlot.y1 = box.y1;\n                this.boxSlot.y2 = box.y2;\n            },\n            reflowWhiskerSlot: function (box) {\n                this.whiskerSlot.y1 = box.y1;\n                this.whiskerSlot.y2 = box.y2;\n            },\n            calcMeanPoints: function (box, meanSlot) {\n                return [[\n                        [\n                            meanSlot.x1,\n                            box.y1\n                        ],\n                        [\n                            meanSlot.x1,\n                            box.y2\n                        ]\n                    ]];\n            },\n            calcWhiskerPoints: function (boxSlot, whiskerSlot) {\n                var mid = whiskerSlot.center().y;\n                return [\n                    [\n                        [\n                            whiskerSlot.x1,\n                            mid - 5\n                        ],\n                        [\n                            whiskerSlot.x1,\n                            mid + 5\n                        ],\n                        [\n                            whiskerSlot.x1,\n                            mid\n                        ],\n                        [\n                            boxSlot.x1,\n                            mid\n                        ]\n                    ],\n                    [\n                        [\n                            whiskerSlot.x2,\n                            mid - 5\n                        ],\n                        [\n                            whiskerSlot.x2,\n                            mid + 5\n                        ],\n                        [\n                            whiskerSlot.x2,\n                            mid\n                        ],\n                        [\n                            boxSlot.x2,\n                            mid\n                        ]\n                    ]\n                ];\n            },\n            calcMedianPoints: function (box, medianSlot) {\n                return [[\n                        [\n                            medianSlot.x1,\n                            box.y1\n                        ],\n                        [\n                            medianSlot.x1,\n                            box.y2\n                        ]\n                    ]];\n            }\n        });\n        var BoxPlotChart = CandlestickChart.extend({\n            addValue: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var ref = this;\n                var children = ref.children;\n                var options = ref.options;\n                var value = data.valueFields;\n                var valueParts = this.splitValue(value);\n                var hasValue = areNumbers(valueParts);\n                var dataItem = series.data[categoryIx];\n                var categoryPoints = this.categoryPoints[categoryIx];\n                var point;\n                if (!categoryPoints) {\n                    this.categoryPoints[categoryIx] = categoryPoints = [];\n                }\n                if (hasValue) {\n                    point = this.createPoint(data, fields);\n                }\n                var cluster = children[categoryIx];\n                if (!cluster) {\n                    cluster = new ClusterLayout({\n                        vertical: options.invertAxes,\n                        gap: options.gap,\n                        spacing: options.spacing,\n                        rtl: !options.invertAxes && (this.chartService || {}).rtl\n                    });\n                    this.append(cluster);\n                }\n                if (point) {\n                    this.updateRange(value, fields);\n                    cluster.append(point);\n                    point.categoryIx = categoryIx;\n                    point.category = category;\n                    point.series = series;\n                    point.seriesIx = seriesIx;\n                    point.owner = this;\n                    point.dataItem = dataItem;\n                }\n                this.points.push(point);\n                categoryPoints.push(point);\n            },\n            pointType: function () {\n                if (this.options.invertAxes) {\n                    return VerticalBoxPlot;\n                }\n                return BoxPlot;\n            },\n            splitValue: function (value) {\n                return [\n                    value.lower,\n                    value.q1,\n                    value.median,\n                    value.q3,\n                    value.upper\n                ];\n            },\n            updateRange: function (value, fields) {\n                var axisName = fields.series.axis;\n                var axisRange = this.valueAxisRanges[axisName];\n                var parts = this.splitValue(value).concat(this.filterOutliers(value.outliers));\n                if (defined(value.mean)) {\n                    parts = parts.concat(value.mean);\n                }\n                axisRange = this.valueAxisRanges[axisName] = axisRange || {\n                    min: MAX_VALUE,\n                    max: MIN_VALUE\n                };\n                axisRange = this.valueAxisRanges[axisName] = {\n                    min: Math.min.apply(Math, parts.concat([axisRange.min])),\n                    max: Math.max.apply(Math, parts.concat([axisRange.max]))\n                };\n            },\n            formatPointValue: function (point, format) {\n                var value = point.value;\n                return this.chartService.format.auto(format, value.lower, value.q1, value.median, value.q3, value.upper, value.mean, point.category);\n            },\n            filterOutliers: function (items) {\n                var length = (items || []).length;\n                var result = [];\n                for (var i = 0; i < length; i++) {\n                    var item = items[i];\n                    if (defined(item) && item !== null) {\n                        result.push(item);\n                    }\n                }\n                return result;\n            }\n        });\n        var ScatterErrorBar = ErrorBarBase.extend({\n            getAxis: function () {\n                var axes = this.chart.seriesAxes(this.series);\n                var axis = this.isVertical ? axes.y : axes.x;\n                return axis;\n            }\n        });\n        function hasValue(value) {\n            return defined(value) && value !== null;\n        }\n        var ScatterChart = ChartElement.extend({\n            init: function (plotArea, options) {\n                ChartElement.fn.init.call(this, options);\n                this.plotArea = plotArea;\n                this.chartService = plotArea.chartService;\n                this._initFields();\n                this.render();\n            },\n            _initFields: function () {\n                this.xAxisRanges = {};\n                this.yAxisRanges = {};\n                this.points = [];\n                this.seriesPoints = [];\n                this.seriesOptions = [];\n                this._evalSeries = [];\n            },\n            render: function () {\n                this.traverseDataPoints(this.addValue.bind(this));\n            },\n            addErrorBar: function (point, field, fields) {\n                var value = point.value[field];\n                var valueErrorField = field + 'Value';\n                var lowField = field + 'ErrorLow';\n                var highField = field + 'ErrorHigh';\n                var seriesIx = fields.seriesIx;\n                var series = fields.series;\n                var errorBars = point.options.errorBars;\n                var lowValue = fields[lowField];\n                var highValue = fields[highField];\n                if (isNumber(value)) {\n                    var errorRange;\n                    if (isNumber(lowValue) && isNumber(highValue)) {\n                        errorRange = {\n                            low: lowValue,\n                            high: highValue\n                        };\n                    }\n                    if (errorBars && defined(errorBars[valueErrorField])) {\n                        this.seriesErrorRanges = this.seriesErrorRanges || {\n                            x: [],\n                            y: []\n                        };\n                        this.seriesErrorRanges[field][seriesIx] = this.seriesErrorRanges[field][seriesIx] || new ErrorRangeCalculator(errorBars[valueErrorField], series, field);\n                        errorRange = this.seriesErrorRanges[field][seriesIx].getErrorRange(value, errorBars[valueErrorField]);\n                    }\n                    if (errorRange) {\n                        this.addPointErrorBar(errorRange, point, field);\n                    }\n                }\n            },\n            addPointErrorBar: function (errorRange, point, field) {\n                var low = errorRange.low;\n                var high = errorRange.high;\n                var series = point.series;\n                var options = point.options.errorBars;\n                var isVertical = field === Y;\n                var item = {};\n                point[field + 'Low'] = low;\n                point[field + 'High'] = high;\n                point.errorBars = point.errorBars || [];\n                var errorBar = new ScatterErrorBar(low, high, isVertical, this, series, options);\n                point.errorBars.push(errorBar);\n                point.append(errorBar);\n                item[field] = low;\n                this.updateRange(item, series);\n                item[field] = high;\n                this.updateRange(item, series);\n            },\n            addValue: function (value, fields) {\n                var x = value.x;\n                var y = value.y;\n                var seriesIx = fields.seriesIx;\n                var series = this.options.series[seriesIx];\n                var missingValues = this.seriesMissingValues(series);\n                var seriesPoints = this.seriesPoints[seriesIx];\n                var pointValue = value;\n                if (!(hasValue(x) && hasValue(y))) {\n                    pointValue = this.createMissingValue(pointValue, missingValues);\n                }\n                var point;\n                if (pointValue) {\n                    point = this.createPoint(pointValue, fields);\n                    if (point) {\n                        $.extend(point, fields);\n                        this.addErrorBar(point, X, fields);\n                        this.addErrorBar(point, Y, fields);\n                    }\n                    this.updateRange(pointValue, fields.series);\n                }\n                this.points.push(point);\n                seriesPoints.push(point);\n            },\n            seriesMissingValues: function (series) {\n                return series.missingValues;\n            },\n            createMissingValue: function () {\n            },\n            updateRange: function (value, series) {\n                var intlService = this.chartService.intl;\n                var xAxisName = series.xAxis;\n                var yAxisName = series.yAxis;\n                var x = value.x;\n                var y = value.y;\n                var xAxisRange = this.xAxisRanges[xAxisName];\n                var yAxisRange = this.yAxisRanges[yAxisName];\n                if (hasValue(x)) {\n                    xAxisRange = this.xAxisRanges[xAxisName] = xAxisRange || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    if (isString(x)) {\n                        x = parseDate(intlService, x);\n                    }\n                    xAxisRange.min = Math.min(xAxisRange.min, x);\n                    xAxisRange.max = Math.max(xAxisRange.max, x);\n                }\n                if (hasValue(y)) {\n                    yAxisRange = this.yAxisRanges[yAxisName] = yAxisRange || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    if (isString(y)) {\n                        y = parseDate(intlService, y);\n                    }\n                    yAxisRange.min = Math.min(yAxisRange.min, y);\n                    yAxisRange.max = Math.max(yAxisRange.max, y);\n                }\n            },\n            evalPointOptions: function (options, value, fields) {\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var state = {\n                    defaults: series._defaults,\n                    excluded: [\n                        'data',\n                        'tooltip',\n                        'content',\n                        'template',\n                        'visual',\n                        'toggle',\n                        '_outOfRangeMinPoint',\n                        '_outOfRangeMaxPoint'\n                    ]\n                };\n                var doEval = this._evalSeries[seriesIx];\n                if (!defined(doEval)) {\n                    this._evalSeries[seriesIx] = doEval = evalOptions(options, {}, state, true);\n                }\n                var pointOptions = options;\n                if (doEval) {\n                    pointOptions = deepExtend({}, options);\n                    evalOptions(pointOptions, {\n                        value: value,\n                        series: series,\n                        dataItem: fields.dataItem\n                    }, state);\n                }\n                return pointOptions;\n            },\n            pointType: function () {\n                return LinePoint;\n            },\n            pointOptions: function (series, seriesIx) {\n                var options = this.seriesOptions[seriesIx];\n                if (!options) {\n                    var defaults = this.pointType().prototype.defaults;\n                    this.seriesOptions[seriesIx] = options = deepExtend({}, defaults, {\n                        markers: { opacity: series.opacity },\n                        tooltip: { format: this.options.tooltip.format },\n                        labels: { format: this.options.labels.format }\n                    }, series);\n                }\n                return options;\n            },\n            createPoint: function (value, fields) {\n                var series = fields.series;\n                var pointOptions = this.pointOptions(series, fields.seriesIx);\n                var color = fields.color || series.color;\n                pointOptions = this.evalPointOptions(pointOptions, value, fields);\n                if (isFunction(series.color)) {\n                    color = pointOptions.color;\n                }\n                var point = new LinePoint(value, pointOptions);\n                point.color = color;\n                this.append(point);\n                return point;\n            },\n            seriesAxes: function (series) {\n                var xAxisName = series.xAxis;\n                var yAxisName = series.yAxis;\n                var plotArea = this.plotArea;\n                var xAxis = xAxisName ? plotArea.namedXAxes[xAxisName] : plotArea.axisX;\n                var yAxis = yAxisName ? plotArea.namedYAxes[yAxisName] : plotArea.axisY;\n                if (!xAxis) {\n                    throw new Error('Unable to locate X axis with name ' + xAxisName);\n                }\n                if (!yAxis) {\n                    throw new Error('Unable to locate Y axis with name ' + yAxisName);\n                }\n                return {\n                    x: xAxis,\n                    y: yAxis\n                };\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\n                var chartPoints = this.points;\n                var limit = !this.options.clip;\n                var pointIx = 0;\n                this.traverseDataPoints(function (value, fields) {\n                    var point = chartPoints[pointIx++];\n                    var seriesAxes = this$1.seriesAxes(fields.series);\n                    var slotX = seriesAxes.x.getSlot(value.x, value.x, limit);\n                    var slotY = seriesAxes.y.getSlot(value.y, value.y, limit);\n                    if (point) {\n                        if (slotX && slotY) {\n                            var pointSlot = this$1.pointSlot(slotX, slotY);\n                            point.reflow(pointSlot);\n                        } else {\n                            point.visible = false;\n                        }\n                    }\n                });\n                this.box = targetBox;\n            },\n            pointSlot: function (slotX, slotY) {\n                return new Box(slotX.x1, slotY.y1, slotX.x2, slotY.y2);\n            },\n            traverseDataPoints: function (callback) {\n                var this$1 = this;\n                var ref = this;\n                var series = ref.options.series;\n                var seriesPoints = ref.seriesPoints;\n                for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var currentSeriesPoints = seriesPoints[seriesIx];\n                    if (!currentSeriesPoints) {\n                        seriesPoints[seriesIx] = [];\n                    }\n                    for (var pointIx = 0; pointIx < currentSeries.data.length; pointIx++) {\n                        var ref$1 = this$1._bindPoint(currentSeries, seriesIx, pointIx);\n                        var value = ref$1.valueFields;\n                        var fields = ref$1.fields;\n                        callback(value, deepExtend({\n                            pointIx: pointIx,\n                            series: currentSeries,\n                            seriesIx: seriesIx,\n                            dataItem: currentSeries.data[pointIx],\n                            owner: this$1\n                        }, fields));\n                    }\n                }\n            },\n            formatPointValue: function (point, format) {\n                var value = point.value;\n                return this.chartService.format.auto(format, value.x, value.y);\n            },\n            animationPoints: function () {\n                var points = this.points;\n                var result = [];\n                for (var idx = 0; idx < points.length; idx++) {\n                    result.push((points[idx] || {}).marker);\n                }\n                return result;\n            }\n        });\n        setDefaultOptions(ScatterChart, {\n            series: [],\n            tooltip: { format: '{0}, {1}' },\n            labels: { format: '{0}, {1}' },\n            clip: true\n        });\n        deepExtend(ScatterChart.prototype, ClipAnimationMixin, { _bindPoint: CategoricalChart.prototype._bindPoint });\n        var Bubble = LinePoint.extend({\n            init: function (value, options) {\n                LinePoint.fn.init.call(this, value, options);\n                this.category = value.category;\n            },\n            createHighlight: function () {\n                var highlight = this.options.highlight;\n                var border = highlight.border;\n                var markers = this.options.markers;\n                var center = this.box.center();\n                var radius = (markers.size + markers.border.width + border.width) / 2;\n                var highlightGroup = new Group();\n                var shadow = new drawing.Circle(new geometry.Circle([\n                    center.x,\n                    center.y + radius / 5 + border.width / 2\n                ], radius + border.width / 2), {\n                    stroke: { color: 'none' },\n                    fill: this.createGradient({\n                        gradient: 'bubbleShadow',\n                        color: markers.background,\n                        stops: [\n                            {\n                                offset: 0,\n                                color: markers.background,\n                                opacity: 0.3\n                            },\n                            {\n                                offset: 1,\n                                color: markers.background,\n                                opacity: 0\n                            }\n                        ]\n                    })\n                });\n                var overlay = new drawing.Circle(new geometry.Circle([\n                    center.x,\n                    center.y\n                ], radius), {\n                    stroke: {\n                        color: border.color || new Color(markers.background).brightness(BORDER_BRIGHTNESS).toHex(),\n                        width: border.width,\n                        opacity: border.opacity\n                    },\n                    fill: {\n                        color: markers.background,\n                        opacity: highlight.opacity\n                    }\n                });\n                highlightGroup.append(shadow, overlay);\n                return highlightGroup;\n            }\n        });\n        Bubble.prototype.defaults = deepExtend({}, Bubble.prototype.defaults, {\n            labels: { position: CENTER },\n            highlight: {\n                opacity: 1,\n                border: {\n                    color: '#fff',\n                    width: 2,\n                    opacity: 1\n                }\n            }\n        });\n        Bubble.prototype.defaults.highlight.zIndex = undefined;\n        var BubbleChart = ScatterChart.extend({\n            _initFields: function () {\n                this._maxSize = MIN_VALUE;\n                ScatterChart.fn._initFields.call(this);\n            },\n            addValue: function (value, fields) {\n                if (value.size !== null && (value.size > 0 || value.size < 0 && fields.series.negativeValues.visible)) {\n                    this._maxSize = Math.max(this._maxSize, Math.abs(value.size));\n                    ScatterChart.fn.addValue.call(this, value, fields);\n                } else {\n                    this.points.push(null);\n                    this.seriesPoints[fields.seriesIx].push(null);\n                }\n            },\n            reflow: function (box) {\n                this.updateBubblesSize(box);\n                ScatterChart.fn.reflow.call(this, box);\n            },\n            pointType: function () {\n                return Bubble;\n            },\n            createPoint: function (value, fields) {\n                var series = fields.series;\n                var pointsCount = series.data.length;\n                var delay = fields.pointIx * (INITIAL_ANIMATION_DURATION / pointsCount);\n                var animationOptions = {\n                    delay: delay,\n                    duration: INITIAL_ANIMATION_DURATION - delay,\n                    type: BUBBLE\n                };\n                var color = fields.color || series.color;\n                if (value.size < 0 && series.negativeValues.visible) {\n                    color = valueOrDefault(series.negativeValues.color, color);\n                }\n                var pointOptions = deepExtend({\n                    labels: {\n                        animation: {\n                            delay: delay,\n                            duration: INITIAL_ANIMATION_DURATION - delay\n                        }\n                    }\n                }, this.pointOptions(series, fields.seriesIx), {\n                    markers: {\n                        type: CIRCLE,\n                        border: series.border,\n                        opacity: series.opacity,\n                        animation: animationOptions\n                    }\n                });\n                pointOptions = this.evalPointOptions(pointOptions, value, fields);\n                if (isFunction(series.color)) {\n                    color = pointOptions.color;\n                }\n                pointOptions.markers.background = color;\n                var point = new Bubble(value, pointOptions);\n                point.color = color;\n                this.append(point);\n                return point;\n            },\n            updateBubblesSize: function (box) {\n                var this$1 = this;\n                var ref = this;\n                var series = ref.options.series;\n                var boxSize = Math.min(box.width(), box.height());\n                for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var seriesPoints = this$1.seriesPoints[seriesIx];\n                    var minSize = currentSeries.minSize || Math.max(boxSize * 0.02, 10);\n                    var maxSize = currentSeries.maxSize || boxSize * 0.2;\n                    var minR = minSize / 2;\n                    var maxR = maxSize / 2;\n                    var minArea = Math.PI * minR * minR;\n                    var maxArea = Math.PI * maxR * maxR;\n                    var areaRange = maxArea - minArea;\n                    var areaRatio = areaRange / this$1._maxSize;\n                    for (var pointIx = 0; pointIx < seriesPoints.length; pointIx++) {\n                        var point = seriesPoints[pointIx];\n                        if (point) {\n                            var area = Math.abs(point.value.size) * areaRatio;\n                            var radius = Math.sqrt((minArea + area) / Math.PI);\n                            var baseZIndex = valueOrDefault(point.options.zIndex, 0);\n                            var zIndex = baseZIndex + (1 - radius / maxR);\n                            deepExtend(point.options, {\n                                zIndex: zIndex,\n                                markers: {\n                                    size: radius * 2,\n                                    zIndex: zIndex\n                                },\n                                labels: { zIndex: zIndex + 1 }\n                            });\n                        }\n                    }\n                }\n            },\n            formatPointValue: function (point, format) {\n                var value = point.value;\n                return this.chartService.format.auto(format, value.x, value.y, value.size, point.category);\n            },\n            createAnimation: function () {\n            },\n            createVisual: function () {\n            }\n        });\n        setDefaultOptions(BubbleChart, {\n            tooltip: { format: '{3}' },\n            labels: { format: '{3}' }\n        });\n        var Target = ShapeElement.extend({});\n        deepExtend(Target.prototype, PointEventsMixin);\n        var Bullet = ChartElement.extend({\n            init: function (value, options) {\n                ChartElement.fn.init.call(this, options);\n                this.aboveAxis = this.options.aboveAxis;\n                this.color = options.color || WHITE;\n                this.value = value;\n            },\n            render: function () {\n                var options = this.options;\n                if (!this._rendered) {\n                    this._rendered = true;\n                    if (defined(this.value.target)) {\n                        this.target = new Target({\n                            type: options.target.shape,\n                            background: options.target.color || this.color,\n                            opacity: options.opacity,\n                            zIndex: options.zIndex,\n                            border: options.target.border,\n                            vAlign: TOP,\n                            align: RIGHT\n                        });\n                        this.target.value = this.value;\n                        this.target.dataItem = this.dataItem;\n                        this.target.series = this.series;\n                        this.append(this.target);\n                    }\n                    this.createNote();\n                }\n            },\n            reflow: function (box) {\n                this.render();\n                var ref = this;\n                var options = ref.options;\n                var target = ref.target;\n                var chart = ref.owner;\n                var invertAxes = options.invertAxes;\n                var valueAxis = chart.seriesValueAxis(this.options);\n                var categorySlot = chart.categorySlot(chart.categoryAxis, options.categoryIx, valueAxis);\n                var targetValueSlot = valueAxis.getSlot(this.value.target);\n                var targetSlotX = invertAxes ? targetValueSlot : categorySlot;\n                var targetSlotY = invertAxes ? categorySlot : targetValueSlot;\n                if (target) {\n                    var targetSlot = new Box(targetSlotX.x1, targetSlotY.y1, targetSlotX.x2, targetSlotY.y2);\n                    target.options.height = invertAxes ? targetSlot.height() : options.target.line.width;\n                    target.options.width = invertAxes ? options.target.line.width : targetSlot.width();\n                    target.reflow(targetSlot);\n                }\n                if (this.note) {\n                    this.note.reflow(box);\n                }\n                this.box = box;\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                var options = this.options;\n                var body = Path.fromRect(this.box.toRect(), {\n                    fill: {\n                        color: this.color,\n                        opacity: options.opacity\n                    },\n                    stroke: null\n                });\n                if (options.border.width > 0) {\n                    body.options.set('stroke', {\n                        color: options.border.color || this.color,\n                        width: options.border.width,\n                        dashType: options.border.dashType,\n                        opacity: valueOrDefault(options.border.opacity, options.opacity)\n                    });\n                }\n                this.bodyVisual = body;\n                alignPathToPixel(body);\n                this.visual.append(body);\n            },\n            createAnimation: function () {\n                if (this.bodyVisual) {\n                    this.animation = Animation.create(this.bodyVisual, this.options.animation);\n                }\n            },\n            createHighlight: function (style) {\n                return Path.fromRect(this.box.toRect(), style);\n            },\n            highlightVisual: function () {\n                return this.bodyVisual;\n            },\n            highlightVisualArgs: function () {\n                return {\n                    rect: this.box.toRect(),\n                    visual: this.bodyVisual,\n                    options: this.options\n                };\n            },\n            formatValue: function (format) {\n                return this.owner.formatPointValue(this, format);\n            }\n        });\n        Bullet.prototype.tooltipAnchor = Bar.prototype.tooltipAnchor;\n        setDefaultOptions(Bullet, {\n            border: { width: 1 },\n            vertical: false,\n            opacity: 1,\n            target: {\n                shape: '',\n                border: {\n                    width: 0,\n                    color: 'green'\n                },\n                line: { width: 2 }\n            },\n            tooltip: { format: 'Current: {0}<br />Target: {1}' }\n        });\n        deepExtend(Bullet.prototype, PointEventsMixin);\n        deepExtend(Bullet.prototype, NoteMixin);\n        var BulletChart = CategoricalChart.extend({\n            init: function (plotArea, options) {\n                wrapData(options);\n                CategoricalChart.fn.init.call(this, plotArea, options);\n            },\n            reflowCategories: function (categorySlots) {\n                var children = this.children;\n                var childrenLength = children.length;\n                for (var i = 0; i < childrenLength; i++) {\n                    children[i].reflow(categorySlots[i]);\n                }\n            },\n            plotRange: function (point) {\n                var series = point.series;\n                var valueAxis = this.seriesValueAxis(series);\n                var axisCrossingValue = this.categoryAxisCrossingValue(valueAxis);\n                return [\n                    axisCrossingValue,\n                    point.value.current || axisCrossingValue\n                ];\n            },\n            createPoint: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var ref = this;\n                var options = ref.options;\n                var children = ref.children;\n                var value = data.valueFields;\n                var bulletOptions = deepExtend({\n                    vertical: !options.invertAxes,\n                    overlay: series.overlay,\n                    categoryIx: categoryIx,\n                    invertAxes: options.invertAxes\n                }, series);\n                var color = data.fields.color || series.color;\n                bulletOptions = this.evalPointOptions(bulletOptions, value, category, categoryIx, series, seriesIx);\n                if (isFunction(series.color)) {\n                    color = bulletOptions.color;\n                }\n                var bullet = new Bullet(value, bulletOptions);\n                bullet.color = color;\n                var cluster = children[categoryIx];\n                if (!cluster) {\n                    cluster = new ClusterLayout({\n                        vertical: options.invertAxes,\n                        gap: options.gap,\n                        spacing: options.spacing,\n                        rtl: !options.invertAxes && (this.chartService || {}).rtl\n                    });\n                    this.append(cluster);\n                }\n                cluster.append(bullet);\n                return bullet;\n            },\n            updateRange: function (value, fields) {\n                var current = value.current;\n                var target = value.target;\n                var axisName = fields.series.axis;\n                var axisRange = this.valueAxisRanges[axisName];\n                if (defined(current) && !isNaN(current) && defined(target && !isNaN(target))) {\n                    axisRange = this.valueAxisRanges[axisName] = axisRange || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    axisRange.min = Math.min(axisRange.min, current, target);\n                    axisRange.max = Math.max(axisRange.max, current, target);\n                }\n            },\n            formatPointValue: function (point, format) {\n                return this.chartService.format.auto(format, point.value.current, point.value.target);\n            },\n            pointValue: function (data) {\n                return data.valueFields.current;\n            },\n            aboveAxis: function (point) {\n                var value = point.value.current;\n                return value > 0;\n            },\n            createAnimation: function () {\n                var this$1 = this;\n                var points = this.points;\n                this._setAnimationOptions();\n                for (var idx = 0; idx < points.length; idx++) {\n                    var point = points[idx];\n                    point.options.animation = this$1.options.animation;\n                    point.createAnimation();\n                }\n            }\n        });\n        BulletChart.prototype._setAnimationOptions = BarChart.prototype._setAnimationOptions;\n        setDefaultOptions(BulletChart, { animation: { type: BAR } });\n        function wrapData(options) {\n            var series = options.series;\n            for (var i = 0; i < series.length; i++) {\n                var seriesItem = series[i];\n                var data = seriesItem.data;\n                if (data && !isArray(data[0]) && !isObject(data[0])) {\n                    seriesItem.data = [data];\n                }\n            }\n        }\n        var BaseTooltip = Class.extend({\n            init: function (chartService, options) {\n                this.chartService = chartService;\n                this.options = deepExtend({}, this.options, options);\n            },\n            getStyle: function (options, point) {\n                var background = options.background;\n                var border = options.border.color;\n                if (point) {\n                    var pointColor = point.color || point.options.color;\n                    background = valueOrDefault(background, pointColor);\n                    border = valueOrDefault(border, pointColor);\n                }\n                var padding = getSpacing(options.padding || {}, 'auto');\n                return {\n                    backgroundColor: background,\n                    borderColor: border,\n                    font: options.font,\n                    color: options.color,\n                    opacity: options.opacity,\n                    borderWidth: styleValue(options.border.width),\n                    paddingTop: styleValue(padding.top),\n                    paddingBottom: styleValue(padding.bottom),\n                    paddingLeft: styleValue(padding.left),\n                    paddingRight: styleValue(padding.right)\n                };\n            },\n            show: function (options, tooltipOptions, point) {\n                options.format = tooltipOptions.format;\n                var style = this.getStyle(tooltipOptions, point);\n                options.style = style;\n                if (!defined(tooltipOptions.color) && new Color(style.backgroundColor).percBrightness() > 180) {\n                    options.className = 'k-chart-tooltip-inverse';\n                }\n                this.chartService.notify(SHOW_TOOLTIP, options);\n                this.visible = true;\n            },\n            hide: function () {\n                if (this.chartService) {\n                    this.chartService.notify(HIDE_TOOLTIP);\n                }\n                this.visible = false;\n            },\n            destroy: function () {\n                delete this.chartService;\n            }\n        });\n        setDefaultOptions(BaseTooltip, {\n            border: { width: 1 },\n            opacity: 1\n        });\n        var CrosshairTooltip = BaseTooltip.extend({\n            init: function (chartService, crosshair, options) {\n                BaseTooltip.fn.init.call(this, chartService, options);\n                this.crosshair = crosshair;\n                this.formatService = chartService.format;\n                this.initAxisName();\n            },\n            initAxisName: function () {\n                var axis = this.crosshair.axis;\n                var plotArea = axis.plotArea;\n                var name;\n                if (plotArea.categoryAxis) {\n                    name = axis.getCategory ? 'categoryAxis' : 'valueAxis';\n                } else {\n                    name = axis.options.vertical ? 'yAxis' : 'xAxis';\n                }\n                this.axisName = name;\n            },\n            showAt: function (point) {\n                var ref = this;\n                var axis = ref.crosshair.axis;\n                var options = ref.options;\n                var value = axis[options.stickyMode ? 'getCategory' : 'getValue'](point);\n                var formattedValue = value;\n                if (options.format) {\n                    formattedValue = this.formatService.auto(options.format, value);\n                } else if (axis.options.type === DATE) {\n                    formattedValue = this.formatService.auto(axis.options.labels.dateFormats[axis.options.baseUnit], value);\n                }\n                this.show({\n                    point: point,\n                    anchor: this.getAnchor(),\n                    crosshair: this.crosshair,\n                    value: formattedValue,\n                    axisName: this.axisName,\n                    axisIndex: this.crosshair.axis.axisIndex\n                }, this.options);\n            },\n            hide: function () {\n                this.chartService.notify(HIDE_TOOLTIP, {\n                    crosshair: this.crosshair,\n                    axisName: this.axisName,\n                    axisIndex: this.crosshair.axis.axisIndex\n                });\n            },\n            getAnchor: function () {\n                var ref = this;\n                var crosshair = ref.crosshair;\n                var ref_options = ref.options;\n                var position = ref_options.position;\n                var padding = ref_options.padding;\n                var vertical = !crosshair.axis.options.vertical;\n                var lineBox = crosshair.line.bbox();\n                var horizontalAlign, verticalAlign, point;\n                if (vertical) {\n                    horizontalAlign = CENTER;\n                    if (position === BOTTOM) {\n                        verticalAlign = TOP;\n                        point = lineBox.bottomLeft().translate(0, padding);\n                    } else {\n                        verticalAlign = BOTTOM;\n                        point = lineBox.topLeft().translate(0, -padding);\n                    }\n                } else {\n                    verticalAlign = CENTER;\n                    if (position === LEFT) {\n                        horizontalAlign = RIGHT;\n                        point = lineBox.topLeft().translate(-padding, 0);\n                    } else {\n                        horizontalAlign = LEFT;\n                        point = lineBox.topRight().translate(padding, 0);\n                    }\n                }\n                return {\n                    point: point,\n                    align: {\n                        horizontal: horizontalAlign,\n                        vertical: verticalAlign\n                    }\n                };\n            }\n        });\n        setDefaultOptions(CrosshairTooltip, { padding: 10 });\n        var Crosshair = ChartElement.extend({\n            init: function (chartService, axis, options) {\n                ChartElement.fn.init.call(this, options);\n                this.axis = axis;\n                this.stickyMode = axis instanceof CategoryAxis;\n                var tooltipOptions = this.options.tooltip;\n                if (tooltipOptions.visible) {\n                    this.tooltip = new CrosshairTooltip(chartService, this, deepExtend({}, tooltipOptions, { stickyMode: this.stickyMode }));\n                }\n            },\n            showAt: function (point) {\n                this.point = point;\n                this.moveLine();\n                this.line.visible(true);\n                if (this.tooltip) {\n                    this.tooltip.showAt(point);\n                }\n            },\n            hide: function () {\n                this.line.visible(false);\n                if (this.tooltip) {\n                    this.tooltip.hide();\n                }\n            },\n            moveLine: function () {\n                var ref = this;\n                var axis = ref.axis;\n                var point = ref.point;\n                var vertical = axis.options.vertical;\n                var box = this.getBox();\n                var dim = vertical ? Y : X;\n                var lineStart = new GeometryPoint(box.x1, box.y1);\n                var lineEnd;\n                if (vertical) {\n                    lineEnd = new GeometryPoint(box.x2, box.y1);\n                } else {\n                    lineEnd = new GeometryPoint(box.x1, box.y2);\n                }\n                if (point) {\n                    if (this.stickyMode) {\n                        var slot = axis.getSlot(axis.pointCategoryIndex(point));\n                        lineStart[dim] = lineEnd[dim] = slot.center()[dim];\n                    } else {\n                        lineStart[dim] = lineEnd[dim] = point[dim];\n                    }\n                }\n                this.box = box;\n                this.line.moveTo(lineStart).lineTo(lineEnd);\n            },\n            getBox: function () {\n                var axis = this.axis;\n                var axes = axis.pane.axes;\n                var length = axes.length;\n                var vertical = axis.options.vertical;\n                var box = axis.lineBox().clone();\n                var dim = vertical ? X : Y;\n                var axisLineBox;\n                for (var i = 0; i < length; i++) {\n                    var currentAxis = axes[i];\n                    if (currentAxis.options.vertical !== vertical) {\n                        if (!axisLineBox) {\n                            axisLineBox = currentAxis.lineBox().clone();\n                        } else {\n                            axisLineBox.wrap(currentAxis.lineBox());\n                        }\n                    }\n                }\n                box[dim + 1] = axisLineBox[dim + 1];\n                box[dim + 2] = axisLineBox[dim + 2];\n                return box;\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                var options = this.options;\n                this.line = new Path({\n                    stroke: {\n                        color: options.color,\n                        width: options.width,\n                        opacity: options.opacity,\n                        dashType: options.dashType\n                    },\n                    visible: false\n                });\n                this.moveLine();\n                this.visual.append(this.line);\n            },\n            destroy: function () {\n                if (this.tooltip) {\n                    this.tooltip.destroy();\n                }\n                ChartElement.fn.destroy.call(this);\n            }\n        });\n        setDefaultOptions(Crosshair, {\n            color: BLACK,\n            width: 2,\n            zIndex: -1,\n            tooltip: { visible: false }\n        });\n        var ChartContainer = ChartElement.extend({\n            init: function (options, pane) {\n                ChartElement.fn.init.call(this, options);\n                this.pane = pane;\n            },\n            shouldClip: function () {\n                var children = this.children;\n                var length = children.length;\n                for (var i = 0; i < length; i++) {\n                    if (children[i].options.clip === true) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _clipBox: function () {\n                return this.pane.chartsBox();\n            },\n            createVisual: function () {\n                this.visual = new Group({ zIndex: 0 });\n                if (this.shouldClip()) {\n                    var clipBox = this.clipBox = this._clipBox();\n                    var clipRect = clipBox.toRect();\n                    var clipPath = Path.fromRect(clipRect);\n                    alignPathToPixel(clipPath);\n                    this.visual.clip(clipPath);\n                    this.unclipLabels();\n                }\n            },\n            stackRoot: function () {\n                return this;\n            },\n            unclipLabels: function () {\n                var ref = this;\n                var charts = ref.children;\n                var clipBox = ref.clipBox;\n                for (var i = 0; i < charts.length; i++) {\n                    var points = charts[i].points || {};\n                    var length = points.length;\n                    for (var j = 0; j < length; j++) {\n                        var point = points[j];\n                        if (point && point.visible !== false && point.overlapsBox && point.overlapsBox(clipBox)) {\n                            if (point.unclipElements) {\n                                point.unclipElements();\n                            } else {\n                                var label = point.label;\n                                var note = point.note;\n                                if (label && label.options.visible) {\n                                    if (label.alignToClipBox) {\n                                        label.alignToClipBox(clipBox);\n                                    }\n                                    label.options.noclip = true;\n                                }\n                                if (note && note.options.visible) {\n                                    note.options.noclip = true;\n                                }\n                            }\n                        }\n                    }\n                }\n            },\n            destroy: function () {\n                ChartElement.fn.destroy.call(this);\n                delete this.parent;\n            }\n        });\n        ChartContainer.prototype.isStackRoot = true;\n        var Pane = BoxElement.extend({\n            init: function (options) {\n                BoxElement.fn.init.call(this, options);\n                this.id = paneID();\n                this.createTitle();\n                this.content = new ChartElement();\n                this.chartContainer = new ChartContainer({}, this);\n                this.append(this.content);\n                this.axes = [];\n                this.charts = [];\n            },\n            createTitle: function () {\n                var titleOptions = this.options.title;\n                if (isObject(titleOptions)) {\n                    titleOptions = deepExtend({}, titleOptions, {\n                        align: titleOptions.position,\n                        position: TOP\n                    });\n                }\n                this.title = dataviz.Title.buildTitle(titleOptions, this, Pane.prototype.options.title);\n            },\n            appendAxis: function (axis) {\n                this.content.append(axis);\n                this.axes.push(axis);\n                axis.pane = this;\n            },\n            appendAxisAt: function (axis, pos) {\n                this.content.append(axis);\n                this.axes.splice(pos, 0, axis);\n                axis.pane = this;\n            },\n            appendChart: function (chart) {\n                if (this.chartContainer.parent !== this.content) {\n                    this.content.append(this.chartContainer);\n                }\n                this.charts.push(chart);\n                this.chartContainer.append(chart);\n                chart.pane = this;\n            },\n            empty: function () {\n                var this$1 = this;\n                var plotArea = this.parent;\n                if (plotArea) {\n                    for (var i = 0; i < this.axes.length; i++) {\n                        plotArea.removeAxis(this$1.axes[i]);\n                    }\n                    for (var i$1 = 0; i$1 < this.charts.length; i$1++) {\n                        plotArea.removeChart(this$1.charts[i$1]);\n                    }\n                }\n                this.axes = [];\n                this.charts = [];\n                this.content.destroy();\n                this.content.children = [];\n                this.chartContainer.children = [];\n            },\n            reflow: function (targetBox) {\n                var content;\n                if (last(this.children) === this.content) {\n                    content = this.children.pop();\n                }\n                BoxElement.fn.reflow.call(this, targetBox);\n                if (content) {\n                    this.children.push(content);\n                }\n                if (this.title) {\n                    this.contentBox.y1 += this.title.box.height();\n                }\n            },\n            visualStyle: function () {\n                var style = BoxElement.fn.visualStyle.call(this);\n                style.zIndex = -10;\n                return style;\n            },\n            renderComplete: function () {\n                if (this.options.visible) {\n                    this.createGridLines();\n                }\n            },\n            stackRoot: function () {\n                return this;\n            },\n            clipRoot: function () {\n                return this;\n            },\n            createGridLines: function () {\n                var axes = this.axes;\n                var allAxes = axes.concat(this.parent.axes);\n                var vGridLines = [];\n                var hGridLines = [];\n                for (var i = 0; i < axes.length; i++) {\n                    var axis = axes[i];\n                    var vertical = axis.options.vertical;\n                    var gridLines = vertical ? vGridLines : hGridLines;\n                    for (var j = 0; j < allAxes.length; j++) {\n                        if (gridLines.length === 0) {\n                            var altAxis = allAxes[j];\n                            if (vertical !== altAxis.options.vertical) {\n                                append(gridLines, axis.createGridLines(altAxis));\n                            }\n                        }\n                    }\n                }\n            },\n            refresh: function () {\n                this.visual.clear();\n                this.content.parent = null;\n                this.content.createGradient = this.createGradient.bind(this);\n                this.content.renderVisual();\n                this.content.parent = this;\n                if (this.title) {\n                    this.visual.append(this.title.visual);\n                }\n                this.visual.append(this.content.visual);\n                this.renderComplete();\n                this.notifyRender();\n            },\n            chartsBox: function () {\n                var axes = this.axes;\n                var length = axes.length;\n                var chartsBox = new Box();\n                for (var idx = 0; idx < length; idx++) {\n                    var axis = axes[idx];\n                    var axisValueField = axis.options.vertical ? Y : X;\n                    var lineBox = axis.lineBox();\n                    chartsBox[axisValueField + 1] = lineBox[axisValueField + 1];\n                    chartsBox[axisValueField + 2] = lineBox[axisValueField + 2];\n                }\n                if (chartsBox.x2 === 0) {\n                    var allAxes = this.parent.axes;\n                    var length$1 = allAxes.length;\n                    for (var idx$1 = 0; idx$1 < length$1; idx$1++) {\n                        var axis$1 = allAxes[idx$1];\n                        if (!axis$1.options.vertical) {\n                            var lineBox$1 = axis$1.lineBox();\n                            chartsBox.x1 = lineBox$1.x1;\n                            chartsBox.x2 = lineBox$1.x2;\n                        }\n                    }\n                }\n                return chartsBox;\n            },\n            clipBox: function () {\n                return this.chartContainer.clipBox;\n            },\n            notifyRender: function () {\n                var service = this.getService();\n                if (service) {\n                    service.notify(PANE_RENDER, {\n                        pane: new ChartPane(this),\n                        index: this.paneIndex,\n                        name: this.options.name\n                    });\n                }\n            }\n        });\n        var ID = 1;\n        function paneID() {\n            return 'pane' + ID++;\n        }\n        Pane.prototype.isStackRoot = true;\n        setDefaultOptions(Pane, {\n            zIndex: -1,\n            shrinkToFit: true,\n            title: { align: LEFT },\n            visible: true\n        });\n        function appendIfNotNull(array, element) {\n            if (element !== null) {\n                array.push(element);\n            }\n        }\n        function segmentVisible(series, fields, index) {\n            var visible = fields.visible;\n            if (defined(visible)) {\n                return visible;\n            }\n            var pointVisibility = series.pointVisibility;\n            if (pointVisibility) {\n                return pointVisibility[index];\n            }\n        }\n        function bindSegments(series) {\n            var data = series.data;\n            var points = [];\n            var sum = 0;\n            var count = 0;\n            for (var idx = 0; idx < data.length; idx++) {\n                var pointData = SeriesBinder.current.bindPoint(series, idx);\n                var value = pointData.valueFields.value;\n                if (isString(value)) {\n                    value = parseFloat(value);\n                }\n                if (isNumber(value)) {\n                    pointData.visible = segmentVisible(series, pointData.fields, idx) !== false;\n                    pointData.value = Math.abs(value);\n                    points.push(pointData);\n                    if (pointData.visible) {\n                        sum += pointData.value;\n                    }\n                    if (value !== 0) {\n                        count++;\n                    }\n                } else {\n                    points.push(null);\n                }\n            }\n            return {\n                total: sum,\n                points: points,\n                count: count\n            };\n        }\n        function equalsIgnoreCase(a, b) {\n            if (a && b) {\n                return a.toLowerCase() === b.toLowerCase();\n            }\n            return a === b;\n        }\n        function filterSeriesByType(series, types) {\n            var result = [];\n            var seriesTypes = [].concat(types);\n            for (var idx = 0; idx < series.length; idx++) {\n                var currentSeries = series[idx];\n                if (inArray(currentSeries.type, seriesTypes)) {\n                    result.push(currentSeries);\n                }\n            }\n            return result;\n        }\n        function getDateField(field, row, intlService) {\n            if (row === null) {\n                return row;\n            }\n            var key = '_date_' + field;\n            var value = row[key];\n            if (!value) {\n                value = parseDate(intlService, getter(field, true)(row));\n                row[key] = value;\n            }\n            return value;\n        }\n        function isDateAxis(axisOptions, sampleCategory) {\n            var type = axisOptions.type;\n            var dateCategory = sampleCategory instanceof Date;\n            return !type && dateCategory || equalsIgnoreCase(type, DATE);\n        }\n        function singleItemOrArray(array) {\n            return array.length === 1 ? array[0] : array;\n        }\n        var AREA_REGEX = /area/i;\n        function seriesMissingValues(series) {\n            if (series.missingValues) {\n                return series.missingValues;\n            }\n            return AREA_REGEX.test(series.type) || series.stack ? ZERO : INTERPOLATE;\n        }\n        function hasValue$1(series, item) {\n            var fields = SeriesBinder.current.bindPoint(series, null, item);\n            var valueFields = fields.valueFields;\n            for (var field in valueFields) {\n                if (dataviz.convertableToNumber(valueFields[field])) {\n                    return true;\n                }\n            }\n        }\n        function findNext(ref) {\n            var start = ref.start;\n            var dir = ref.dir;\n            var min = ref.min;\n            var max = ref.max;\n            var getter$$1 = ref.getter;\n            var hasItem = ref.hasItem;\n            var series = ref.series;\n            var pointHasValue, outPoint;\n            var idx = start;\n            do {\n                idx += dir;\n                if (hasItem(idx)) {\n                    outPoint = getter$$1(idx);\n                    pointHasValue = hasValue$1(series, outPoint.item);\n                }\n            } while (min <= idx && idx <= max && !pointHasValue);\n            if (pointHasValue) {\n                return outPoint;\n            }\n        }\n        function createOutOfRangePoints(series, range, count, getter$$1, hasItem) {\n            var min = range.min;\n            var max = range.max;\n            var hasMinPoint = min > 0 && min < count;\n            var hasMaxPoint = max + 1 < count;\n            if (hasMinPoint || hasMaxPoint) {\n                var missingValues = seriesMissingValues(series);\n                var minPoint, maxPoint;\n                if (missingValues !== INTERPOLATE) {\n                    if (hasMinPoint) {\n                        minPoint = getter$$1(min - 1);\n                    }\n                    if (hasMaxPoint) {\n                        maxPoint = getter$$1(max + 1);\n                    }\n                } else {\n                    var outPoint, pointHasValue;\n                    if (hasMinPoint) {\n                        outPoint = getter$$1(min - 1);\n                        pointHasValue = hasValue$1(series, outPoint.item);\n                        if (!pointHasValue) {\n                            minPoint = findNext({\n                                start: min,\n                                dir: -1,\n                                min: 0,\n                                max: count - 1,\n                                getter: getter$$1,\n                                hasItem: hasItem,\n                                series: series\n                            });\n                        } else {\n                            minPoint = outPoint;\n                        }\n                    }\n                    if (hasMaxPoint) {\n                        outPoint = getter$$1(max + 1);\n                        pointHasValue = hasValue$1(series, outPoint.item);\n                        if (!pointHasValue) {\n                            maxPoint = findNext({\n                                start: max,\n                                dir: 1,\n                                min: 0,\n                                max: count - 1,\n                                getter: getter$$1,\n                                hasItem: hasItem,\n                                series: series\n                            });\n                        } else {\n                            maxPoint = outPoint;\n                        }\n                    }\n                }\n                if (minPoint) {\n                    series._outOfRangeMinPoint = minPoint;\n                }\n                if (maxPoint) {\n                    series._outOfRangeMaxPoint = maxPoint;\n                }\n            }\n        }\n        var PlotAreaBase = ChartElement.extend({\n            init: function (series, options, chartService) {\n                ChartElement.fn.init.call(this, options);\n                this.initFields(series, options);\n                this.series = series;\n                this.initSeries();\n                this.charts = [];\n                this.options.legend.items = [];\n                this.axes = [];\n                this.crosshairs = [];\n                this.chartService = chartService;\n                this.originalOptions = options;\n                this.createPanes();\n                this.render();\n                this.createCrosshairs();\n            },\n            initFields: function () {\n            },\n            initSeries: function () {\n                var series = this.series;\n                for (var i = 0; i < series.length; i++) {\n                    series[i].index = i;\n                }\n            },\n            createPanes: function () {\n                var this$1 = this;\n                var defaults = { title: { color: (this.options.title || {}).color } };\n                var panes = [];\n                var paneOptions = this.options.panes || [];\n                var panesLength = Math.max(paneOptions.length, 1);\n                function setTitle(options, defaults) {\n                    if (isString(options.title)) {\n                        options.title = { text: options.title };\n                    }\n                    options.title = deepExtend({}, defaults.title, options.title);\n                }\n                for (var i = 0; i < panesLength; i++) {\n                    var options = paneOptions[i] || {};\n                    setTitle(options, defaults);\n                    var currentPane = new Pane(options);\n                    currentPane.paneIndex = i;\n                    panes.push(currentPane);\n                    this$1.append(currentPane);\n                }\n                this.panes = panes;\n            },\n            createCrosshairs: function (panes) {\n                var this$1 = this;\n                if (panes === void 0) {\n                    panes = this.panes;\n                }\n                for (var i = 0; i < panes.length; i++) {\n                    var pane = panes[i];\n                    for (var j = 0; j < pane.axes.length; j++) {\n                        var axis = pane.axes[j];\n                        if (axis.options.crosshair && axis.options.crosshair.visible) {\n                            var currentCrosshair = new Crosshair(this$1.chartService, axis, axis.options.crosshair);\n                            this$1.crosshairs.push(currentCrosshair);\n                            pane.content.append(currentCrosshair);\n                        }\n                    }\n                }\n            },\n            removeCrosshairs: function (pane) {\n                var crosshairs = this.crosshairs;\n                var axes = pane.axes;\n                for (var i = crosshairs.length - 1; i >= 0; i--) {\n                    for (var j = 0; j < axes.length; j++) {\n                        if (crosshairs[i].axis === axes[j]) {\n                            crosshairs.splice(i, 1);\n                            break;\n                        }\n                    }\n                }\n            },\n            hideCrosshairs: function () {\n                var crosshairs = this.crosshairs;\n                for (var idx = 0; idx < crosshairs.length; idx++) {\n                    crosshairs[idx].hide();\n                }\n            },\n            findPane: function (name) {\n                var panes = this.panes;\n                var matchingPane;\n                for (var i = 0; i < panes.length; i++) {\n                    if (panes[i].options.name === name) {\n                        matchingPane = panes[i];\n                        break;\n                    }\n                }\n                return matchingPane || panes[0];\n            },\n            findPointPane: function (point) {\n                var panes = this.panes;\n                var matchingPane;\n                for (var i = 0; i < panes.length; i++) {\n                    if (panes[i].box.containsPoint(point)) {\n                        matchingPane = panes[i];\n                        break;\n                    }\n                }\n                return matchingPane;\n            },\n            appendAxis: function (axis) {\n                var pane = this.findPane(axis.options.pane);\n                pane.appendAxis(axis);\n                this.axes.push(axis);\n                axis.plotArea = this;\n            },\n            removeAxis: function (axisToRemove) {\n                var this$1 = this;\n                var filteredAxes = [];\n                for (var i = 0; i < this.axes.length; i++) {\n                    var axis = this$1.axes[i];\n                    if (axisToRemove !== axis) {\n                        filteredAxes.push(axis);\n                    } else {\n                        axis.destroy();\n                    }\n                }\n                this.axes = filteredAxes;\n            },\n            appendChart: function (chart, pane) {\n                this.charts.push(chart);\n                if (pane) {\n                    pane.appendChart(chart);\n                } else {\n                    this.append(chart);\n                }\n            },\n            removeChart: function (chartToRemove) {\n                var this$1 = this;\n                var filteredCharts = [];\n                for (var i = 0; i < this.charts.length; i++) {\n                    var chart = this$1.charts[i];\n                    if (chart !== chartToRemove) {\n                        filteredCharts.push(chart);\n                    } else {\n                        chart.destroy();\n                    }\n                }\n                this.charts = filteredCharts;\n            },\n            addToLegend: function (series) {\n                var count = series.length;\n                var legend = this.options.legend;\n                var labels = legend.labels || {};\n                var inactiveItems = legend.inactiveItems || {};\n                var inactiveItemsLabels = inactiveItems.labels || {};\n                var data = [];\n                for (var i = 0; i < count; i++) {\n                    var currentSeries = series[i];\n                    var seriesVisible = currentSeries.visible !== false;\n                    if (currentSeries.visibleInLegend === false) {\n                        continue;\n                    }\n                    var text = currentSeries.name;\n                    var labelTemplate = seriesVisible ? getTemplate(labels) : getTemplate(inactiveItemsLabels) || getTemplate(labels);\n                    if (labelTemplate) {\n                        text = labelTemplate({\n                            text: hasValue(text) ? text : '',\n                            series: currentSeries\n                        });\n                    }\n                    var defaults = currentSeries._defaults;\n                    var color = currentSeries.color;\n                    if (isFunction(color) && defaults) {\n                        color = defaults.color;\n                    }\n                    var itemLabelOptions = void 0, markerColor = void 0;\n                    if (seriesVisible) {\n                        itemLabelOptions = {};\n                        markerColor = color;\n                    } else {\n                        itemLabelOptions = {\n                            color: inactiveItemsLabels.color,\n                            font: inactiveItemsLabels.font\n                        };\n                        markerColor = inactiveItems.markers.color;\n                    }\n                    if (hasValue(text) && text !== '') {\n                        data.push({\n                            text: text,\n                            labels: itemLabelOptions,\n                            markerColor: markerColor,\n                            series: currentSeries,\n                            active: seriesVisible\n                        });\n                    }\n                }\n                append(legend.items, data);\n            },\n            groupAxes: function (panes) {\n                var xAxes = [];\n                var yAxes = [];\n                for (var paneIx = 0; paneIx < panes.length; paneIx++) {\n                    var paneAxes = panes[paneIx].axes;\n                    for (var axisIx = 0; axisIx < paneAxes.length; axisIx++) {\n                        var axis = paneAxes[axisIx];\n                        if (axis.options.vertical) {\n                            yAxes.push(axis);\n                        } else {\n                            xAxes.push(axis);\n                        }\n                    }\n                }\n                return {\n                    x: xAxes,\n                    y: yAxes,\n                    any: xAxes.concat(yAxes)\n                };\n            },\n            groupSeriesByPane: function () {\n                var this$1 = this;\n                var series = this.series;\n                var seriesByPane = {};\n                for (var i = 0; i < series.length; i++) {\n                    var currentSeries = series[i];\n                    var pane = this$1.seriesPaneName(currentSeries);\n                    if (seriesByPane[pane]) {\n                        seriesByPane[pane].push(currentSeries);\n                    } else {\n                        seriesByPane[pane] = [currentSeries];\n                    }\n                }\n                return seriesByPane;\n            },\n            filterVisibleSeries: function (series) {\n                var result = [];\n                for (var i = 0; i < series.length; i++) {\n                    var currentSeries = series[i];\n                    if (currentSeries.visible !== false) {\n                        result.push(currentSeries);\n                    }\n                }\n                return result;\n            },\n            reflow: function (targetBox) {\n                var options = this.options.plotArea;\n                var panes = this.panes;\n                var margin = getSpacing(options.margin);\n                this.box = targetBox.clone().unpad(margin);\n                this.reflowPanes();\n                this.detachLabels();\n                this.reflowAxes(panes);\n                this.reflowCharts(panes);\n            },\n            redraw: function (panes) {\n                var this$1 = this;\n                var panesArray = [].concat(panes);\n                this.initSeries();\n                var root = this.getRoot();\n                if (root) {\n                    root.cleanGradients();\n                }\n                for (var i = 0; i < panesArray.length; i++) {\n                    this$1.removeCrosshairs(panesArray[i]);\n                    panesArray[i].empty();\n                }\n                this.render(panesArray);\n                this.detachLabels();\n                this.reflowAxes(this.panes);\n                this.reflowCharts(panesArray);\n                this.createCrosshairs(panesArray);\n                for (var i$1 = 0; i$1 < panesArray.length; i$1++) {\n                    panesArray[i$1].refresh();\n                }\n            },\n            axisCrossingValues: function (axis, crossingAxes) {\n                var options = axis.options;\n                var crossingValues = [].concat(options.axisCrossingValues || options.axisCrossingValue);\n                var valuesToAdd = crossingAxes.length - crossingValues.length;\n                var defaultValue = crossingValues[0] || 0;\n                for (var i = 0; i < valuesToAdd; i++) {\n                    crossingValues.push(defaultValue);\n                }\n                return crossingValues;\n            },\n            alignAxisTo: function (axis, targetAxis, crossingValue, targetCrossingValue) {\n                var slot = axis.getSlot(crossingValue, crossingValue, true);\n                var slotEdge = axis.options.reverse ? 2 : 1;\n                var targetSlot = targetAxis.getSlot(targetCrossingValue, targetCrossingValue, true);\n                var targetEdge = targetAxis.options.reverse ? 2 : 1;\n                var axisBox = axis.box.translate(targetSlot[X + targetEdge] - slot[X + slotEdge], targetSlot[Y + targetEdge] - slot[Y + slotEdge]);\n                if (axis.pane !== targetAxis.pane) {\n                    axisBox.translate(0, axis.pane.box.y1 - targetAxis.pane.box.y1);\n                }\n                axis.reflow(axisBox);\n            },\n            alignAxes: function (xAxes, yAxes) {\n                var this$1 = this;\n                var xAnchor = xAxes[0];\n                var yAnchor = yAxes[0];\n                var xAnchorCrossings = this.axisCrossingValues(xAnchor, yAxes);\n                var yAnchorCrossings = this.axisCrossingValues(yAnchor, xAxes);\n                var leftAnchors = {};\n                var rightAnchors = {};\n                var topAnchors = {};\n                var bottomAnchors = {};\n                for (var i = 0; i < yAxes.length; i++) {\n                    var axis = yAxes[i];\n                    var pane = axis.pane;\n                    var paneId = pane.id;\n                    var visible = axis.options.visible !== false;\n                    var anchor = paneAnchor(xAxes, pane) || xAnchor;\n                    var anchorCrossings = xAnchorCrossings;\n                    if (anchor !== xAnchor) {\n                        anchorCrossings = this$1.axisCrossingValues(anchor, yAxes);\n                    }\n                    this$1.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n                    if (axis.options._overlap) {\n                        continue;\n                    }\n                    if (round(axis.lineBox().x1) === round(anchor.lineBox().x1)) {\n                        if (leftAnchors[paneId]) {\n                            axis.reflow(axis.box.alignTo(leftAnchors[paneId].box, LEFT).translate(-axis.options.margin, 0));\n                        }\n                        if (visible) {\n                            leftAnchors[paneId] = axis;\n                        }\n                    }\n                    if (round(axis.lineBox().x2) === round(anchor.lineBox().x2)) {\n                        if (!axis._mirrored) {\n                            axis.options.labels.mirror = !axis.options.labels.mirror;\n                            axis._mirrored = true;\n                        }\n                        this$1.alignAxisTo(axis, anchor, yAnchorCrossings[i], anchorCrossings[i]);\n                        if (rightAnchors[paneId]) {\n                            axis.reflow(axis.box.alignTo(rightAnchors[paneId].box, RIGHT).translate(axis.options.margin, 0));\n                        }\n                        if (visible) {\n                            rightAnchors[paneId] = axis;\n                        }\n                    }\n                    if (i !== 0 && yAnchor.pane === axis.pane) {\n                        axis.alignTo(yAnchor);\n                        axis.reflow(axis.box);\n                    }\n                }\n                for (var i$1 = 0; i$1 < xAxes.length; i$1++) {\n                    var axis$1 = xAxes[i$1];\n                    var pane$1 = axis$1.pane;\n                    var paneId$1 = pane$1.id;\n                    var visible$1 = axis$1.options.visible !== false;\n                    var anchor$1 = paneAnchor(yAxes, pane$1) || yAnchor;\n                    var anchorCrossings$1 = yAnchorCrossings;\n                    if (anchor$1 !== yAnchor) {\n                        anchorCrossings$1 = this$1.axisCrossingValues(anchor$1, xAxes);\n                    }\n                    this$1.alignAxisTo(axis$1, anchor$1, xAnchorCrossings[i$1], anchorCrossings$1[i$1]);\n                    if (axis$1.options._overlap) {\n                        continue;\n                    }\n                    if (round(axis$1.lineBox().y1) === round(anchor$1.lineBox().y1)) {\n                        if (!axis$1._mirrored) {\n                            axis$1.options.labels.mirror = !axis$1.options.labels.mirror;\n                            axis$1._mirrored = true;\n                        }\n                        this$1.alignAxisTo(axis$1, anchor$1, xAnchorCrossings[i$1], anchorCrossings$1[i$1]);\n                        if (topAnchors[paneId$1]) {\n                            axis$1.reflow(axis$1.box.alignTo(topAnchors[paneId$1].box, TOP).translate(0, -axis$1.options.margin));\n                        }\n                        if (visible$1) {\n                            topAnchors[paneId$1] = axis$1;\n                        }\n                    }\n                    if (round(axis$1.lineBox().y2, datavizConstants.COORD_PRECISION) === round(anchor$1.lineBox().y2, datavizConstants.COORD_PRECISION)) {\n                        if (bottomAnchors[paneId$1]) {\n                            axis$1.reflow(axis$1.box.alignTo(bottomAnchors[paneId$1].box, BOTTOM).translate(0, axis$1.options.margin));\n                        }\n                        if (visible$1) {\n                            bottomAnchors[paneId$1] = axis$1;\n                        }\n                    }\n                    if (i$1 !== 0) {\n                        axis$1.alignTo(xAnchor);\n                        axis$1.reflow(axis$1.box);\n                    }\n                }\n            },\n            shrinkAxisWidth: function (panes) {\n                var axes = this.groupAxes(panes).any;\n                var axisBox = axisGroupBox(axes);\n                var overflowX = 0;\n                for (var i = 0; i < panes.length; i++) {\n                    var currentPane = panes[i];\n                    if (currentPane.axes.length > 0) {\n                        overflowX = Math.max(overflowX, axisBox.width() - currentPane.contentBox.width());\n                    }\n                }\n                if (overflowX !== 0) {\n                    for (var i$1 = 0; i$1 < axes.length; i$1++) {\n                        var currentAxis = axes[i$1];\n                        if (!currentAxis.options.vertical) {\n                            currentAxis.reflow(currentAxis.box.shrink(overflowX, 0));\n                        }\n                    }\n                }\n            },\n            shrinkAxisHeight: function (panes) {\n                var shrinked;\n                for (var i = 0; i < panes.length; i++) {\n                    var currentPane = panes[i];\n                    var axes = currentPane.axes;\n                    var overflowY = Math.max(0, axisGroupBox(axes).height() - currentPane.contentBox.height());\n                    if (overflowY !== 0) {\n                        for (var j = 0; j < axes.length; j++) {\n                            var currentAxis = axes[j];\n                            if (currentAxis.options.vertical) {\n                                currentAxis.reflow(currentAxis.box.shrink(0, overflowY));\n                            }\n                        }\n                        shrinked = true;\n                    }\n                }\n                return shrinked;\n            },\n            fitAxes: function (panes) {\n                var axes = this.groupAxes(panes).any;\n                var offsetX = 0;\n                for (var i = 0; i < panes.length; i++) {\n                    var currentPane = panes[i];\n                    var paneAxes = currentPane.axes;\n                    var paneBox = currentPane.contentBox;\n                    if (paneAxes.length > 0) {\n                        var axisBox = axisGroupBox(paneAxes);\n                        var offsetY = Math.max(paneBox.y1 - axisBox.y1, paneBox.y2 - axisBox.y2);\n                        offsetX = Math.max(offsetX, paneBox.x1 - axisBox.x1);\n                        for (var j = 0; j < paneAxes.length; j++) {\n                            var currentAxis = paneAxes[j];\n                            currentAxis.reflow(currentAxis.box.translate(0, offsetY));\n                        }\n                    }\n                }\n                for (var i$1 = 0; i$1 < axes.length; i$1++) {\n                    var currentAxis$1 = axes[i$1];\n                    currentAxis$1.reflow(currentAxis$1.box.translate(offsetX, 0));\n                }\n            },\n            reflowAxes: function (panes) {\n                var this$1 = this;\n                var axes = this.groupAxes(panes);\n                for (var i = 0; i < panes.length; i++) {\n                    this$1.reflowPaneAxes(panes[i]);\n                }\n                if (axes.x.length > 0 && axes.y.length > 0) {\n                    this.alignAxes(axes.x, axes.y);\n                    this.shrinkAxisWidth(panes);\n                    this.autoRotateAxisLabels(axes);\n                    this.alignAxes(axes.x, axes.y);\n                    if (this.shrinkAxisWidth(panes)) {\n                        this.alignAxes(axes.x, axes.y);\n                    }\n                    this.shrinkAxisHeight(panes);\n                    this.alignAxes(axes.x, axes.y);\n                    if (this.shrinkAxisHeight(panes)) {\n                        this.alignAxes(axes.x, axes.y);\n                    }\n                    this.fitAxes(panes);\n                }\n            },\n            autoRotateAxisLabels: function (groupedAxes) {\n                var this$1 = this;\n                var ref = this;\n                var panes = ref.panes;\n                var axes = allPaneAxes(panes);\n                var rotated;\n                for (var idx = 0; idx < axes.length; idx++) {\n                    var axis = axes[idx];\n                    if (axis.autoRotateLabels()) {\n                        rotated = true;\n                    }\n                }\n                if (rotated) {\n                    for (var idx$1 = 0; idx$1 < panes.length; idx$1++) {\n                        this$1.reflowPaneAxes(panes[idx$1]);\n                    }\n                    if (groupedAxes.x.length > 0 && groupedAxes.y.length > 0) {\n                        this.alignAxes(groupedAxes.x, groupedAxes.y);\n                        this.shrinkAxisWidth(panes);\n                    }\n                }\n            },\n            reflowPaneAxes: function (pane) {\n                var axes = pane.axes;\n                var length = axes.length;\n                if (length > 0) {\n                    for (var i = 0; i < length; i++) {\n                        axes[i].reflow(pane.contentBox);\n                    }\n                }\n            },\n            reflowCharts: function (panes) {\n                var charts = this.charts;\n                var count = charts.length;\n                var box = this.box;\n                for (var i = 0; i < count; i++) {\n                    var chartPane = charts[i].pane;\n                    if (!chartPane || inArray(chartPane, panes)) {\n                        charts[i].reflow(box);\n                    }\n                }\n            },\n            reflowPanes: function () {\n                var ref = this;\n                var box = ref.box;\n                var panes = ref.panes;\n                var panesLength = panes.length;\n                var remainingHeight = box.height();\n                var remainingPanes = panesLength;\n                var autoHeightPanes = 0;\n                var top = box.y1;\n                for (var i = 0; i < panesLength; i++) {\n                    var currentPane = panes[i];\n                    var height = currentPane.options.height;\n                    currentPane.options.width = box.width();\n                    if (!currentPane.options.height) {\n                        autoHeightPanes++;\n                    } else {\n                        if (height.indexOf && height.indexOf('%')) {\n                            var percents = parseInt(height, 10) / 100;\n                            currentPane.options.height = percents * box.height();\n                        }\n                        currentPane.reflow(box.clone());\n                        remainingHeight -= currentPane.options.height;\n                    }\n                }\n                for (var i$1 = 0; i$1 < panesLength; i$1++) {\n                    var currentPane$1 = panes[i$1];\n                    if (!currentPane$1.options.height) {\n                        currentPane$1.options.height = remainingHeight / autoHeightPanes;\n                    }\n                }\n                for (var i$2 = 0; i$2 < panesLength; i$2++) {\n                    var currentPane$2 = panes[i$2];\n                    var paneBox = box.clone().move(box.x1, top);\n                    currentPane$2.reflow(paneBox);\n                    remainingPanes--;\n                    top += currentPane$2.options.height;\n                }\n            },\n            backgroundBox: function () {\n                var axes = this.axes;\n                var axesCount = axes.length;\n                var box;\n                for (var i = 0; i < axesCount; i++) {\n                    var axisA = axes[i];\n                    for (var j = 0; j < axesCount; j++) {\n                        var axisB = axes[j];\n                        if (axisA.options.vertical !== axisB.options.vertical) {\n                            var lineBox = axisA.lineBox().clone().wrap(axisB.lineBox());\n                            if (!box) {\n                                box = lineBox;\n                            } else {\n                                box = box.wrap(lineBox);\n                            }\n                        }\n                    }\n                }\n                return box || this.box;\n            },\n            chartsBoxes: function () {\n                var panes = this.panes;\n                var boxes = [];\n                for (var idx = 0; idx < panes.length; idx++) {\n                    boxes.push(panes[idx].chartsBox());\n                }\n                return boxes;\n            },\n            addBackgroundPaths: function (multipath) {\n                var boxes = this.chartsBoxes();\n                for (var idx = 0; idx < boxes.length; idx++) {\n                    multipath.paths.push(Path.fromRect(boxes[idx].toRect()));\n                }\n            },\n            backgroundContainsPoint: function (point) {\n                var boxes = this.chartsBoxes();\n                for (var idx = 0; idx < boxes.length; idx++) {\n                    if (boxes[idx].containsPoint(point)) {\n                        return true;\n                    }\n                }\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                var options = this.options.plotArea;\n                var opacity = options.opacity;\n                var background = options.background;\n                var border = options.border;\n                if (border === void 0) {\n                    border = {};\n                }\n                if (isTransparent(background)) {\n                    background = WHITE;\n                    opacity = 0;\n                }\n                var bg = this._bgVisual = new drawing.MultiPath({\n                    fill: {\n                        color: background,\n                        opacity: opacity\n                    },\n                    stroke: {\n                        color: border.width ? border.color : '',\n                        width: border.width,\n                        dashType: border.dashType\n                    },\n                    zIndex: -1\n                });\n                this.addBackgroundPaths(bg);\n                this.appendVisual(bg);\n            },\n            pointsByCategoryIndex: function (categoryIndex) {\n                var charts = this.charts;\n                var result = [];\n                if (categoryIndex !== null) {\n                    for (var i = 0; i < charts.length; i++) {\n                        var chart = charts[i];\n                        if (chart.pane.options.name === '_navigator') {\n                            continue;\n                        }\n                        var points = charts[i].categoryPoints[categoryIndex];\n                        if (points && points.length) {\n                            for (var j = 0; j < points.length; j++) {\n                                var point = points[j];\n                                if (point && defined(point.value) && point.value !== null) {\n                                    result.push(point);\n                                }\n                            }\n                        }\n                    }\n                }\n                return result;\n            },\n            pointsBySeriesIndex: function (seriesIndex) {\n                return this.filterPoints(function (point) {\n                    return point.series.index === seriesIndex;\n                });\n            },\n            pointsBySeriesName: function (name) {\n                return this.filterPoints(function (point) {\n                    return point.series.name === name;\n                });\n            },\n            filterPoints: function (callback) {\n                var charts = this.charts;\n                var result = [];\n                for (var i = 0; i < charts.length; i++) {\n                    var chart = charts[i];\n                    var points = chart.points;\n                    for (var j = 0; j < points.length; j++) {\n                        var point = points[j];\n                        if (point && point.visible !== false && callback(point)) {\n                            result.push(point);\n                        }\n                    }\n                }\n                return result;\n            },\n            findPoint: function (callback) {\n                var charts = this.charts;\n                for (var i = 0; i < charts.length; i++) {\n                    var chart = charts[i];\n                    var points = chart.points;\n                    for (var j = 0; j < points.length; j++) {\n                        var point = points[j];\n                        if (point && point.visible !== false && callback(point)) {\n                            return point;\n                        }\n                    }\n                }\n            },\n            paneByPoint: function (point) {\n                var panes = this.panes;\n                for (var i = 0; i < panes.length; i++) {\n                    var pane = panes[i];\n                    if (pane.box.containsPoint(point)) {\n                        return pane;\n                    }\n                }\n            },\n            detachLabels: function () {\n                var axes = this.groupAxes(this.panes);\n                var xAxes = axes.x;\n                var yAxes = axes.y;\n                this.detachAxisGroupLabels(yAxes, xAxes);\n                this.detachAxisGroupLabels(xAxes, yAxes);\n            },\n            detachAxisGroupLabels: function (axes, crossingAxes) {\n                var this$1 = this;\n                var labelAxisCount = 0;\n                for (var i = 0; i < axes.length; i++) {\n                    var axis = axes[i];\n                    var pane = axis.pane;\n                    var anchor = paneAnchor(crossingAxes, pane) || crossingAxes[0];\n                    var axisIndex = i + labelAxisCount;\n                    var labelAxis = this$1.createLabelAxis(axis, axisIndex, anchor);\n                    if (labelAxis) {\n                        labelAxisCount++;\n                        var pos = pane.axes.indexOf(axis) + labelAxisCount;\n                        pane.appendAxisAt(labelAxis, pos);\n                    }\n                }\n            },\n            createLabelAxis: function (axis, axisIndex, anchor) {\n                var labelOptions = axis.options.labels;\n                var position = labelOptions.position;\n                var onAxis = position !== datavizConstants.END && position !== datavizConstants.START;\n                var visible = labelOptions.visible;\n                if (onAxis || visible === false) {\n                    return null;\n                }\n                var allAxes = this.groupAxes(this.panes);\n                var crossingAxes = anchor.options.vertical ? allAxes.x : allAxes.y;\n                var anchorCrossings = this.axisCrossingValues(anchor, crossingAxes);\n                var end = position === datavizConstants.END;\n                var range = anchor.range();\n                var edge = end ? range.max : range.min;\n                var crossingValue = limitValue(anchorCrossings[axisIndex], range.min, range.max);\n                if (crossingValue - edge === 0) {\n                    return null;\n                }\n                anchorCrossings.splice(axisIndex + 1, 0, edge);\n                anchor.options.axisCrossingValues = anchorCrossings;\n                var labelAxis = axis.clone();\n                axis.clear();\n                labelAxis.options.name = undefined;\n                labelAxis.options.line.visible = false;\n                labelAxis.options.crosshair = undefined;\n                labelAxis.options.notes = undefined;\n                labelAxis.options.plotBands = undefined;\n                return labelAxis;\n            }\n        });\n        function axisGroupBox(axes) {\n            var length = axes.length;\n            var box;\n            if (length > 0) {\n                for (var i = 0; i < length; i++) {\n                    var axisBox = axes[i].contentBox();\n                    if (!box) {\n                        box = axisBox.clone();\n                    } else {\n                        box.wrap(axisBox);\n                    }\n                }\n            }\n            return box || new Box();\n        }\n        function paneAnchor(axes, pane) {\n            for (var i = 0; i < axes.length; i++) {\n                var anchor = axes[i];\n                if (anchor && anchor.pane === pane) {\n                    return anchor;\n                }\n            }\n        }\n        function isTransparent(color) {\n            return color === '' || color === null || color === 'none' || color === 'transparent' || !defined(color);\n        }\n        var allPaneAxes = function (panes) {\n            return panes.reduce(function (acc, pane) {\n                return acc.concat(pane.axes);\n            }, []);\n        };\n        setDefaultOptions(PlotAreaBase, {\n            series: [],\n            plotArea: { margin: {} },\n            background: '',\n            border: {\n                color: BLACK,\n                width: 0\n            },\n            legend: {\n                inactiveItems: {\n                    labels: { color: '#919191' },\n                    markers: { color: '#919191' }\n                }\n            }\n        });\n        var PlotAreaEventsMixin = {\n            hover: function (chart, e) {\n                this._dispatchEvent(chart, e, PLOT_AREA_HOVER);\n            },\n            click: function (chart, e) {\n                this._dispatchEvent(chart, e, PLOT_AREA_CLICK);\n            }\n        };\n        var SeriesAggregator = Class.extend({\n            init: function (series, binder, defaultAggregates) {\n                var canonicalFields = binder.canonicalFields(series);\n                var valueFields = binder.valueFields(series);\n                var sourceFields = binder.sourceFields(series, canonicalFields);\n                var seriesFields = this._seriesFields = [];\n                var defaults = defaultAggregates.query(series.type);\n                var rootAggregate = series.aggregate || defaults;\n                this._series = series;\n                this._binder = binder;\n                for (var i = 0; i < canonicalFields.length; i++) {\n                    var field = canonicalFields[i];\n                    var fieldAggregate = void 0;\n                    if (isObject(rootAggregate)) {\n                        fieldAggregate = rootAggregate[field];\n                    } else if (i === 0 || inArray(field, valueFields)) {\n                        fieldAggregate = rootAggregate;\n                    } else {\n                        break;\n                    }\n                    if (fieldAggregate) {\n                        seriesFields.push({\n                            canonicalName: field,\n                            name: sourceFields[i],\n                            transform: isFunction(fieldAggregate) ? fieldAggregate : Aggregates[fieldAggregate]\n                        });\n                    }\n                }\n            },\n            aggregatePoints: function (srcPoints, group) {\n                var this$1 = this;\n                var ref = this;\n                var series = ref._series;\n                var seriesFields = ref._seriesFields;\n                var data = this._bindPoints(srcPoints || []);\n                var firstDataItem = data.dataItems[0];\n                var result = {};\n                if (firstDataItem && !isNumber(firstDataItem) && !isArray(firstDataItem)) {\n                    var fn = function () {\n                    };\n                    fn.prototype = firstDataItem;\n                    result = new fn();\n                }\n                for (var i = 0; i < seriesFields.length; i++) {\n                    var field = seriesFields[i];\n                    var srcValues = this$1._bindField(data.values, field.canonicalName);\n                    var value = field.transform(srcValues, series, data.dataItems, group);\n                    if (value !== null && isObject(value) && !defined(value.length) && !(value instanceof Date)) {\n                        result = value;\n                        break;\n                    } else {\n                        if (defined(value)) {\n                            setValue(field.name, result, value);\n                        }\n                    }\n                }\n                return result;\n            },\n            _bindPoints: function (points) {\n                var ref = this;\n                var binder = ref._binder;\n                var series = ref._series;\n                var values = [];\n                var dataItems = [];\n                for (var i = 0; i < points.length; i++) {\n                    var pointIx = points[i];\n                    values.push(binder.bindPoint(series, pointIx));\n                    dataItems.push(series.data[pointIx]);\n                }\n                return {\n                    values: values,\n                    dataItems: dataItems\n                };\n            },\n            _bindField: function (data, field) {\n                var values = [];\n                var count = data.length;\n                for (var i = 0; i < count; i++) {\n                    var item = data[i];\n                    var valueFields = item.valueFields;\n                    var value = void 0;\n                    if (defined(valueFields[field])) {\n                        value = valueFields[field];\n                    } else {\n                        value = item.fields[field];\n                    }\n                    values.push(value);\n                }\n                return values;\n            }\n        });\n        function setValue(fieldName, target, value) {\n            var parentObj = target;\n            var field = fieldName;\n            if (fieldName.indexOf('.') > -1) {\n                var parts = fieldName.split('.');\n                while (parts.length > 1) {\n                    field = parts.shift();\n                    if (!defined(parentObj[field])) {\n                        parentObj[field] = {};\n                    }\n                    parentObj = parentObj[field];\n                }\n                field = parts.shift();\n            }\n            parentObj[field] = value;\n        }\n        var DefaultAggregates = Class.extend({\n            init: function () {\n                this._defaults = {};\n            },\n            register: function (seriesTypes, aggregates) {\n                var this$1 = this;\n                for (var i = 0; i < seriesTypes.length; i++) {\n                    this$1._defaults[seriesTypes[i]] = aggregates;\n                }\n            },\n            query: function (seriesType) {\n                return this._defaults[seriesType];\n            }\n        });\n        DefaultAggregates.current = new DefaultAggregates();\n        var RangeBar = Bar.extend({\n            createLabel: function () {\n                var labels = this.options.labels;\n                var fromOptions = deepExtend({}, labels, labels.from);\n                var toOptions = deepExtend({}, labels, labels.to);\n                if (fromOptions.visible) {\n                    this.labelFrom = this._createLabel(fromOptions);\n                    this.append(this.labelFrom);\n                }\n                if (toOptions.visible) {\n                    this.labelTo = this._createLabel(toOptions);\n                    this.append(this.labelTo);\n                }\n            },\n            _createLabel: function (options) {\n                var labelTemplate = getTemplate(options);\n                var pointData = this.pointData();\n                var labelText;\n                if (labelTemplate) {\n                    labelText = labelTemplate(pointData);\n                } else {\n                    labelText = this.formatValue(options.format);\n                }\n                return new BarLabel(labelText, deepExtend({ vertical: this.options.vertical }, options), pointData);\n            },\n            reflow: function (targetBox) {\n                this.render();\n                var ref = this;\n                var labelFrom = ref.labelFrom;\n                var labelTo = ref.labelTo;\n                var value = ref.value;\n                this.box = targetBox;\n                if (labelFrom) {\n                    labelFrom.options.aboveAxis = value.from > value.to;\n                    labelFrom.reflow(targetBox);\n                }\n                if (labelTo) {\n                    labelTo.options.aboveAxis = value.to > value.from;\n                    labelTo.reflow(targetBox);\n                }\n                if (this.note) {\n                    this.note.reflow(targetBox);\n                }\n            }\n        });\n        RangeBar.prototype.defaults = deepExtend({}, RangeBar.prototype.defaults, {\n            labels: { format: '{0} - {1}' },\n            tooltip: { format: '{1}' }\n        });\n        var RangeBarChart = BarChart.extend({\n            pointType: function () {\n                return RangeBar;\n            },\n            pointValue: function (data) {\n                return data.valueFields;\n            },\n            formatPointValue: function (point, format) {\n                if (point.value.from === null && point.value.to === null) {\n                    return '';\n                }\n                return this.chartService.format.auto(format, point.value.from, point.value.to);\n            },\n            plotRange: function (point) {\n                if (!point) {\n                    return 0;\n                }\n                return [\n                    point.value.from,\n                    point.value.to\n                ];\n            },\n            updateRange: function (value, fields) {\n                var axisName = fields.series.axis;\n                var from = value.from;\n                var to = value.to;\n                var axisRange = this.valueAxisRanges[axisName];\n                if (value !== null && isNumber(from) && isNumber(to)) {\n                    axisRange = this.valueAxisRanges[axisName] = axisRange || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    axisRange.min = Math.min(axisRange.min, from);\n                    axisRange.max = Math.max(axisRange.max, from);\n                    axisRange.min = Math.min(axisRange.min, to);\n                    axisRange.max = Math.max(axisRange.max, to);\n                }\n            },\n            aboveAxis: function (point) {\n                var value = point.value;\n                return value.from < value.to;\n            }\n        });\n        RangeBarChart.prototype.plotLimits = CategoricalChart.prototype.plotLimits;\n        var RangeLinePoint = LinePoint.extend({\n            aliasFor: function () {\n                return this.parent;\n            }\n        });\n        var AUTO = 'auto';\n        var DEFAULT_FROM_FORMAT = '{0}';\n        var DEFAULT_TO_FORMAT = '{1}';\n        var RangeAreaPoint = ChartElement.extend({\n            init: function (value, options) {\n                ChartElement.fn.init.call(this);\n                this.value = value;\n                this.options = options;\n                this.aboveAxis = valueOrDefault(this.options.aboveAxis, true);\n                this.tooltipTracking = true;\n                this.initLabelsFormat();\n            },\n            render: function () {\n                if (this._rendered) {\n                    return;\n                }\n                this._rendered = true;\n                var ref = this.options;\n                var markers = ref.markers;\n                var labels = ref.labels;\n                var value = this.value;\n                var fromPoint = this.fromPoint = new RangeLinePoint(value, deepExtend({}, this.options, {\n                    labels: labels.from,\n                    markers: markers.from\n                }));\n                var toPoint = this.toPoint = new RangeLinePoint(value, deepExtend({}, this.options, {\n                    labels: labels.to,\n                    markers: markers.to\n                }));\n                this.copyFields(fromPoint);\n                this.copyFields(toPoint);\n                this.append(fromPoint);\n                this.append(toPoint);\n            },\n            reflow: function (targetBox) {\n                this.render();\n                var fromBox = targetBox.from;\n                var toBox = targetBox.to;\n                this.positionLabels(fromBox, toBox);\n                this.fromPoint.reflow(fromBox);\n                this.toPoint.reflow(toBox);\n                this.box = this.fromPoint.markerBox().clone().wrap(this.toPoint.markerBox());\n            },\n            createHighlight: function () {\n                var group = new Group();\n                group.append(this.fromPoint.createHighlight());\n                group.append(this.toPoint.createHighlight());\n                return group;\n            },\n            highlightVisual: function () {\n                return this.visual;\n            },\n            highlightVisualArgs: function () {\n                return {\n                    options: this.options,\n                    from: this.fromPoint.highlightVisualArgs(),\n                    to: this.toPoint.highlightVisualArgs()\n                };\n            },\n            tooltipAnchor: function () {\n                var clipBox = this.owner.pane.clipBox();\n                var showTooltip = !clipBox || clipBox.overlaps(this.box);\n                if (showTooltip) {\n                    var box = this.box;\n                    var center = box.center();\n                    var horizontalAlign = LEFT;\n                    var x, y, verticalAlign;\n                    if (this.options.vertical) {\n                        x = center.x;\n                        y = box.y1 - TOOLTIP_OFFSET;\n                        verticalAlign = BOTTOM;\n                    } else {\n                        x = box.x2 + TOOLTIP_OFFSET;\n                        y = center.y;\n                        verticalAlign = CENTER;\n                    }\n                    return {\n                        point: new Point(x, y),\n                        align: {\n                            horizontal: horizontalAlign,\n                            vertical: verticalAlign\n                        }\n                    };\n                }\n            },\n            formatValue: function (format) {\n                return this.owner.formatPointValue(this, format);\n            },\n            overlapsBox: function (box) {\n                return this.box.overlaps(box);\n            },\n            unclipElements: function () {\n                this.fromPoint.unclipElements();\n                this.toPoint.unclipElements();\n            },\n            initLabelsFormat: function () {\n                var labels = this.options.labels;\n                if (!labels.format) {\n                    if (!labels.from || !labels.from.format) {\n                        labels.from = $.extend({}, labels.from, { format: DEFAULT_FROM_FORMAT });\n                    }\n                    if (!labels.to || !labels.to.format) {\n                        labels.to = $.extend({}, labels.to, { format: DEFAULT_TO_FORMAT });\n                    }\n                }\n            },\n            positionLabels: function (fromBox, toBox) {\n                var ref = this.options;\n                var labels = ref.labels;\n                var vertical = ref.vertical;\n                if (labels.position === AUTO) {\n                    var fromLabelPosition, toLabelPosition;\n                    if (vertical) {\n                        if (toBox.y1 <= fromBox.y1) {\n                            toLabelPosition = ABOVE;\n                            fromLabelPosition = BELOW;\n                        } else {\n                            toLabelPosition = BELOW;\n                            fromLabelPosition = ABOVE;\n                        }\n                    } else {\n                        if (toBox.x1 <= fromBox.x1) {\n                            toLabelPosition = LEFT;\n                            fromLabelPosition = RIGHT;\n                        } else {\n                            toLabelPosition = RIGHT;\n                            fromLabelPosition = LEFT;\n                        }\n                    }\n                    if (!labels.from || !labels.from.position) {\n                        this.fromPoint.options.labels.position = fromLabelPosition;\n                    }\n                    if (!labels.to || !labels.to.position) {\n                        this.toPoint.options.labels.position = toLabelPosition;\n                    }\n                }\n            },\n            copyFields: function (point) {\n                point.dataItem = this.dataItem;\n                point.category = this.category;\n                point.series = this.series;\n                point.color = this.color;\n                point.owner = this.owner;\n            }\n        });\n        deepExtend(RangeAreaPoint.prototype, PointEventsMixin);\n        deepExtend(RangeAreaPoint.prototype, NoteMixin);\n        RangeAreaPoint.prototype.defaults = {\n            markers: {\n                visible: false,\n                background: WHITE,\n                size: LINE_MARKER_SIZE,\n                type: CIRCLE,\n                border: { width: 2 },\n                opacity: 1\n            },\n            labels: {\n                visible: false,\n                margin: getSpacing(3),\n                padding: getSpacing(4),\n                animation: {\n                    type: FADEIN,\n                    delay: INITIAL_ANIMATION_DURATION\n                },\n                position: AUTO\n            },\n            notes: { label: {} },\n            highlight: {\n                markers: {\n                    border: {\n                        color: WHITE,\n                        width: 2\n                    }\n                },\n                zIndex: datavizConstants.HIGHLIGHT_ZINDEX\n            },\n            tooltip: { format: '{0} - {1}' }\n        };\n        var RangeAreaSegment = AreaSegment.extend({\n            createStrokeSegments: function () {\n                return this.segmentsFromPoints(this.toGeometryPoints(this.toPoints()));\n            },\n            stackSegments: function () {\n                var fromSegments = this.fromSegments;\n                if (!this.fromSegments) {\n                    fromSegments = this.fromSegments = this.segmentsFromPoints(this.toGeometryPoints(this.fromPoints().reverse()));\n                }\n                return fromSegments;\n            },\n            createStroke: function (style) {\n                var toPath = new Path(style);\n                var fromPath = new Path(style);\n                toPath.segments.push.apply(toPath.segments, this.strokeSegments());\n                fromPath.segments.push.apply(fromPath.segments, this.stackSegments());\n                this.visual.append(toPath);\n                this.visual.append(fromPath);\n            },\n            hasStackSegment: function () {\n                return true;\n            },\n            fromPoints: function () {\n                return this.linePoints.map(function (point) {\n                    return point.fromPoint;\n                });\n            },\n            toPoints: function () {\n                return this.linePoints.map(function (point) {\n                    return point.toPoint;\n                });\n            }\n        });\n        var SplineRangeAreaSegment = RangeAreaSegment.extend({\n            createStrokeSegments: function () {\n                return this.createCurveSegments(this.toPoints());\n            },\n            stackSegments: function () {\n                var fromSegments = this.fromSegments;\n                if (!this.fromSegments) {\n                    fromSegments = this.fromSegments = this.createCurveSegments(this.fromPoints().reverse());\n                }\n                return fromSegments;\n            },\n            createCurveSegments: function (points) {\n                var curveProcessor = new CurveProcessor();\n                return curveProcessor.process(this.toGeometryPoints(points));\n            }\n        });\n        var StepRangeAreaSegment = RangeAreaSegment.extend({\n            createStrokeSegments: function () {\n                return this.segmentsFromPoints(this.calculateStepPoints(this.toPoints()));\n            },\n            stackSegments: function () {\n                var fromSegments = this.fromSegments;\n                if (!this.fromSegments) {\n                    fromSegments = this.fromSegments = this.segmentsFromPoints(this.calculateStepPoints(this.fromPoints()));\n                    fromSegments.reverse();\n                }\n                return fromSegments;\n            }\n        });\n        deepExtend(StepRangeAreaSegment.prototype, StepLineMixin);\n        var RangeAreaChart = CategoricalChart.extend({\n            render: function () {\n                CategoricalChart.fn.render.call(this);\n                this.renderSegments();\n            },\n            pointType: function () {\n                return RangeAreaPoint;\n            },\n            createPoint: function (data, fields) {\n                var categoryIx = fields.categoryIx;\n                var category = fields.category;\n                var series = fields.series;\n                var seriesIx = fields.seriesIx;\n                var value = data.valueFields;\n                if (!hasValue(value.from) && !hasValue(value.to)) {\n                    if (this.seriesMissingValues(series) === ZERO) {\n                        value = {\n                            from: 0,\n                            to: 0\n                        };\n                    } else {\n                        return null;\n                    }\n                }\n                var pointOptions = this.pointOptions(series, seriesIx);\n                pointOptions = this.evalPointOptions(pointOptions, value, category, categoryIx, series, seriesIx);\n                var color = data.fields.color || series.color;\n                if (isFunction(series.color)) {\n                    color = pointOptions.color;\n                }\n                var point = new RangeAreaPoint(value, pointOptions);\n                point.color = color;\n                this.append(point);\n                return point;\n            },\n            createSegment: function (linePoints, currentSeries, seriesIx) {\n                var style = (currentSeries.line || {}).style;\n                var segmentType;\n                if (style === 'smooth') {\n                    segmentType = SplineRangeAreaSegment;\n                } else if (style === 'step') {\n                    segmentType = StepRangeAreaSegment;\n                } else {\n                    segmentType = RangeAreaSegment;\n                }\n                return new segmentType(linePoints, currentSeries, seriesIx);\n            },\n            plotRange: function (point, startValue) {\n                if (!point) {\n                    return [\n                        startValue,\n                        startValue\n                    ];\n                }\n                return [\n                    point.value.from,\n                    point.value.to\n                ];\n            },\n            valueSlot: function (valueAxis, plotRange) {\n                var fromSlot = valueAxis.getSlot(plotRange[0], plotRange[0], !this.options.clip);\n                var toSlot = valueAxis.getSlot(plotRange[1], plotRange[1], !this.options.clip);\n                if (fromSlot && toSlot) {\n                    return {\n                        from: fromSlot,\n                        to: toSlot\n                    };\n                }\n            },\n            pointSlot: function (categorySlot, valueSlot) {\n                var from = valueSlot.from;\n                var to = valueSlot.to;\n                var fromSlot, toSlot;\n                if (this.options.invertAxes) {\n                    fromSlot = new Box(from.x1, categorySlot.y1, from.x2, categorySlot.y2);\n                    toSlot = new Box(to.x1, categorySlot.y1, to.x2, categorySlot.y2);\n                } else {\n                    fromSlot = new Box(categorySlot.x1, from.y1, categorySlot.x2, from.y2);\n                    toSlot = new Box(categorySlot.x1, to.y1, categorySlot.x2, to.y2);\n                }\n                return {\n                    from: fromSlot,\n                    to: toSlot\n                };\n            },\n            addValue: function (data, fields) {\n                var valueFields = data.valueFields;\n                if (!isNumber(valueFields.from)) {\n                    valueFields.from = valueFields.to;\n                }\n                if (!isNumber(valueFields.to)) {\n                    valueFields.to = valueFields.from;\n                }\n                CategoricalChart.fn.addValue.call(this, data, fields);\n            },\n            updateRange: function (value, fields) {\n                if (value !== null && isNumber(value.from) && isNumber(value.to)) {\n                    var axisName = fields.series.axis;\n                    var axisRange = this.valueAxisRanges[axisName] = this.valueAxisRanges[axisName] || {\n                        min: MAX_VALUE,\n                        max: MIN_VALUE\n                    };\n                    var from = value.from;\n                    var to = value.to;\n                    axisRange.min = Math.min(axisRange.min, from, to);\n                    axisRange.max = Math.max(axisRange.max, from, to);\n                }\n            },\n            formatPointValue: function (point, format) {\n                var value = point.value;\n                return this.chartService.format.auto(format, value.from, value.to);\n            },\n            animationPoints: function () {\n                var points = this.points;\n                var result = [];\n                for (var idx = 0; idx < points.length; idx++) {\n                    var point = points[idx];\n                    if (point) {\n                        result.push((point.fromPoint || {}).marker);\n                        result.push((point.toPoint || {}).marker);\n                    }\n                }\n                return result.concat(this._segments);\n            }\n        });\n        deepExtend(RangeAreaChart.prototype, LineChartMixin, ClipAnimationMixin);\n        var OHLCPoint = Candlestick.extend({\n            reflow: function (box) {\n                var ref = this;\n                var options = ref.options;\n                var value = ref.value;\n                var chart = ref.owner;\n                var valueAxis = chart.seriesValueAxis(options);\n                var oPoints = [];\n                var cPoints = [];\n                var lhPoints = [];\n                var lhSlot = valueAxis.getSlot(value.low, value.high);\n                var oSlot = valueAxis.getSlot(value.open, value.open);\n                var cSlot = valueAxis.getSlot(value.close, value.close);\n                oSlot.x1 = cSlot.x1 = lhSlot.x1 = box.x1;\n                oSlot.x2 = cSlot.x2 = lhSlot.x2 = box.x2;\n                var mid = lhSlot.center().x;\n                oPoints.push([\n                    oSlot.x1,\n                    oSlot.y1\n                ]);\n                oPoints.push([\n                    mid,\n                    oSlot.y1\n                ]);\n                cPoints.push([\n                    mid,\n                    cSlot.y1\n                ]);\n                cPoints.push([\n                    cSlot.x2,\n                    cSlot.y1\n                ]);\n                lhPoints.push([\n                    mid,\n                    lhSlot.y1\n                ]);\n                lhPoints.push([\n                    mid,\n                    lhSlot.y2\n                ]);\n                this.lines = [\n                    oPoints,\n                    cPoints,\n                    lhPoints\n                ];\n                this.box = lhSlot.clone().wrap(oSlot.clone().wrap(cSlot));\n                this.reflowNote();\n            },\n            createBody: function () {\n            }\n        });\n        var OHLCChart = CandlestickChart.extend({\n            pointType: function () {\n                return OHLCPoint;\n            }\n        });\n        var WaterfallSegment = ChartElement.extend({\n            init: function (from, to, series) {\n                ChartElement.fn.init.call(this);\n                this.from = from;\n                this.to = to;\n                this.series = series;\n            },\n            linePoints: function () {\n                var from = this.from;\n                var ref = this;\n                var fromBox = ref.from.box;\n                var toBox = ref.to.box;\n                var points = [];\n                if (from.isVertical) {\n                    var y = from.aboveAxis ? fromBox.y1 : fromBox.y2;\n                    points.push([\n                        fromBox.x1,\n                        y\n                    ], [\n                        toBox.x2,\n                        y\n                    ]);\n                } else {\n                    var x = from.aboveAxis ? fromBox.x2 : fromBox.x1;\n                    points.push([\n                        x,\n                        fromBox.y1\n                    ], [\n                        x,\n                        toBox.y2\n                    ]);\n                }\n                return points;\n            },\n            createVisual: function () {\n                ChartElement.fn.createVisual.call(this);\n                var line = this.series.line || {};\n                var path = Path.fromPoints(this.linePoints(), {\n                    stroke: {\n                        color: line.color,\n                        width: line.width,\n                        opacity: line.opacity,\n                        dashType: line.dashType\n                    }\n                });\n                alignPathToPixel(path);\n                this.visual.append(path);\n            }\n        });\n        setDefaultOptions(WaterfallSegment, {\n            animation: {\n                type: FADEIN,\n                delay: INITIAL_ANIMATION_DURATION\n            }\n        });\n        var WaterfallChart = BarChart.extend({\n            render: function () {\n                BarChart.fn.render.call(this);\n                this.createSegments();\n            },\n            traverseDataPoints: function (callback) {\n                var this$1 = this;\n                var series = this.options.series;\n                var totalCategories = categoriesCount(series);\n                var isVertical = !this.options.invertAxes;\n                for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var total = 0;\n                    var runningTotal = 0;\n                    for (var categoryIx = 0; categoryIx < totalCategories; categoryIx++) {\n                        var data = SeriesBinder.current.bindPoint(currentSeries, categoryIx);\n                        var value = data.valueFields.value;\n                        var summary = data.fields.summary;\n                        var from = total;\n                        var to = void 0;\n                        if (summary) {\n                            if (summary.toLowerCase() === 'total') {\n                                data.valueFields.value = total;\n                                from = 0;\n                                to = total;\n                            } else {\n                                data.valueFields.value = runningTotal;\n                                to = from - runningTotal;\n                                runningTotal = 0;\n                            }\n                        } else if (isNumber(value)) {\n                            runningTotal += value;\n                            total += value;\n                            to = total;\n                        }\n                        callback(data, {\n                            category: this$1.categoryAxis.categoryAt(categoryIx),\n                            categoryIx: categoryIx,\n                            series: currentSeries,\n                            seriesIx: seriesIx,\n                            total: total,\n                            runningTotal: runningTotal,\n                            from: from,\n                            to: to,\n                            isVertical: isVertical\n                        });\n                    }\n                }\n            },\n            updateRange: function (value, fields) {\n                BarChart.fn.updateRange.call(this, { value: fields.to }, fields);\n            },\n            aboveAxis: function (point) {\n                return point.value >= 0;\n            },\n            plotRange: function (point) {\n                return [\n                    point.from,\n                    point.to\n                ];\n            },\n            createSegments: function () {\n                var this$1 = this;\n                var series = this.options.series;\n                var seriesPoints = this.seriesPoints;\n                var segments = this.segments = [];\n                for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var points = seriesPoints[seriesIx];\n                    if (points) {\n                        var prevPoint = void 0;\n                        for (var pointIx = 0; pointIx < points.length; pointIx++) {\n                            var point = points[pointIx];\n                            if (point && prevPoint) {\n                                var segment = new WaterfallSegment(prevPoint, point, currentSeries);\n                                segments.push(segment);\n                                this$1.append(segment);\n                            }\n                            prevPoint = point;\n                        }\n                    }\n                }\n            }\n        });\n        var AREA_SERIES = [\n            AREA,\n            VERTICAL_AREA,\n            RANGE_AREA,\n            VERTICAL_RANGE_AREA\n        ];\n        var OUT_OF_RANGE_SERIES = [\n            LINE,\n            VERTICAL_LINE\n        ].concat(AREA_SERIES);\n        var CategoricalPlotArea = PlotAreaBase.extend({\n            initFields: function (series) {\n                var this$1 = this;\n                this.namedCategoryAxes = {};\n                this.namedValueAxes = {};\n                this.valueAxisRangeTracker = new AxisGroupRangeTracker();\n                if (series.length > 0) {\n                    this.invertAxes = inArray(series[0].type, [\n                        BAR,\n                        BULLET,\n                        VERTICAL_LINE,\n                        VERTICAL_AREA,\n                        VERTICAL_RANGE_AREA,\n                        RANGE_BAR,\n                        HORIZONTAL_WATERFALL,\n                        VERTICAL_BOX_PLOT\n                    ]);\n                    for (var i = 0; i < series.length; i++) {\n                        var stack = series[i].stack;\n                        if (stack && stack.type === '100%') {\n                            this$1.stack100 = true;\n                            break;\n                        }\n                    }\n                }\n            },\n            render: function (panes) {\n                if (panes === void 0) {\n                    panes = this.panes;\n                }\n                this.createCategoryAxes(panes);\n                this.aggregateCategories(panes);\n                this.createCategoryAxesLabels(panes);\n                this.createCharts(panes);\n                this.createValueAxes(panes);\n            },\n            removeAxis: function (axis) {\n                var axisName = axis.options.name;\n                PlotAreaBase.fn.removeAxis.call(this, axis);\n                if (axis instanceof CategoryAxis) {\n                    delete this.namedCategoryAxes[axisName];\n                } else {\n                    this.valueAxisRangeTracker.reset(axisName);\n                    delete this.namedValueAxes[axisName];\n                }\n                if (axis === this.categoryAxis) {\n                    delete this.categoryAxis;\n                }\n                if (axis === this.valueAxis) {\n                    delete this.valueAxis;\n                }\n            },\n            createCharts: function (panes) {\n                var this$1 = this;\n                var seriesByPane = this.groupSeriesByPane();\n                for (var i = 0; i < panes.length; i++) {\n                    var pane = panes[i];\n                    var paneSeries = seriesByPane[pane.options.name || 'default'] || [];\n                    this$1.addToLegend(paneSeries);\n                    var visibleSeries = this$1.filterVisibleSeries(paneSeries);\n                    if (!visibleSeries) {\n                        continue;\n                    }\n                    var groups = this$1.groupSeriesByCategoryAxis(visibleSeries);\n                    for (var groupIx = 0; groupIx < groups.length; groupIx++) {\n                        this$1.createChartGroup(groups[groupIx], pane);\n                    }\n                }\n            },\n            createChartGroup: function (series, pane) {\n                this.createAreaChart(filterSeriesByType(series, [\n                    AREA,\n                    VERTICAL_AREA\n                ]), pane);\n                this.createRangeAreaChart(filterSeriesByType(series, [\n                    RANGE_AREA,\n                    VERTICAL_RANGE_AREA\n                ]), pane);\n                this.createBarChart(filterSeriesByType(series, [\n                    COLUMN,\n                    BAR\n                ]), pane);\n                this.createRangeBarChart(filterSeriesByType(series, [\n                    RANGE_COLUMN,\n                    RANGE_BAR\n                ]), pane);\n                this.createBulletChart(filterSeriesByType(series, [\n                    BULLET,\n                    VERTICAL_BULLET\n                ]), pane);\n                this.createCandlestickChart(filterSeriesByType(series, CANDLESTICK), pane);\n                this.createBoxPlotChart(filterSeriesByType(series, [\n                    BOX_PLOT,\n                    VERTICAL_BOX_PLOT\n                ]), pane);\n                this.createOHLCChart(filterSeriesByType(series, OHLC), pane);\n                this.createWaterfallChart(filterSeriesByType(series, [\n                    WATERFALL,\n                    HORIZONTAL_WATERFALL\n                ]), pane);\n                this.createLineChart(filterSeriesByType(series, [\n                    LINE,\n                    VERTICAL_LINE\n                ]), pane);\n            },\n            aggregateCategories: function (panes) {\n                var this$1 = this;\n                var series = this.srcSeries || this.series;\n                var processedSeries = [];\n                this._currentPointsCache = {};\n                this._seriesPointsCache = this._seriesPointsCache || {};\n                for (var i = 0; i < series.length; i++) {\n                    var currentSeries = series[i];\n                    var categoryAxis = this$1.seriesCategoryAxis(currentSeries);\n                    var axisPane = this$1.findPane(categoryAxis.options.pane);\n                    var dateAxis = equalsIgnoreCase(categoryAxis.options.type, DATE);\n                    if ((dateAxis || currentSeries.categoryField) && inArray(axisPane, panes)) {\n                        currentSeries = this$1.aggregateSeries(currentSeries, categoryAxis);\n                    } else {\n                        currentSeries = this$1.filterSeries(currentSeries, categoryAxis);\n                    }\n                    processedSeries.push(currentSeries);\n                }\n                this._seriesPointsCache = this._currentPointsCache;\n                this._currentPointsCache = null;\n                this.srcSeries = series;\n                this.series = processedSeries;\n            },\n            filterSeries: function (series, categoryAxis) {\n                var dataLength = (series.data || {}).length;\n                categoryAxis._seriesMax = Math.max(categoryAxis._seriesMax || 0, dataLength);\n                if (!(isNumber(categoryAxis.options.min) || isNumber(categoryAxis.options.max))) {\n                    return series;\n                }\n                var range = categoryAxis.currentRangeIndices();\n                var outOfRangePoints = inArray(series.type, OUT_OF_RANGE_SERIES);\n                var currentSeries = deepExtend({}, series);\n                currentSeries.data = (currentSeries.data || []).slice(range.min, range.max + 1);\n                if (outOfRangePoints) {\n                    createOutOfRangePoints(currentSeries, range, dataLength, function (idx) {\n                        return {\n                            item: series.data[idx],\n                            category: categoryAxis.categoryAt(idx, true),\n                            categoryIx: idx - range.min\n                        };\n                    }, function (idx) {\n                        return defined(series.data[idx]);\n                    });\n                }\n                return currentSeries;\n            },\n            clearSeriesPointsCache: function () {\n                this._seriesPointsCache = {};\n            },\n            seriesSourcePoints: function (series, categoryAxis) {\n                var this$1 = this;\n                var key = series.index + ';' + categoryAxis.categoriesHash();\n                if (this._seriesPointsCache[key]) {\n                    this._currentPointsCache[key] = this._seriesPointsCache[key];\n                    return this._seriesPointsCache[key];\n                }\n                var axisOptions = categoryAxis.options;\n                var srcCategories = axisOptions.srcCategories;\n                var dateAxis = equalsIgnoreCase(axisOptions.type, DATE);\n                var srcData = series.data;\n                var getFn = dateAxis ? getDateField : getField;\n                var result = [];\n                if (!dateAxis) {\n                    categoryAxis.mapCategories();\n                }\n                for (var idx = 0; idx < srcData.length; idx++) {\n                    var category = void 0;\n                    if (series.categoryField) {\n                        category = getFn(series.categoryField, srcData[idx], this$1.chartService.intl);\n                    } else {\n                        category = srcCategories[idx];\n                    }\n                    if (defined(category) && category !== null) {\n                        var categoryIx = categoryAxis.totalIndex(category);\n                        result[categoryIx] = result[categoryIx] || {\n                            items: [],\n                            category: category\n                        };\n                        result[categoryIx].items.push(idx);\n                    }\n                }\n                this._currentPointsCache[key] = result;\n                return result;\n            },\n            aggregateSeries: function (series, categoryAxis) {\n                var srcData = series.data;\n                if (!srcData.length) {\n                    return series;\n                }\n                var srcPoints = this.seriesSourcePoints(series, categoryAxis);\n                var result = deepExtend({}, series);\n                var aggregator = new SeriesAggregator(deepExtend({}, series), SeriesBinder.current, DefaultAggregates.current);\n                var data = result.data = [];\n                var dataItems = categoryAxis.options.dataItems || [];\n                var range = categoryAxis.currentRangeIndices();\n                var categoryItem = function (idx) {\n                    var categoryIdx = idx - range.min;\n                    var point = srcPoints[idx];\n                    if (!point) {\n                        point = srcPoints[idx] = {};\n                    }\n                    point.categoryIx = categoryIdx;\n                    if (!point.item) {\n                        var category = categoryAxis.categoryAt(idx, true);\n                        point.category = category;\n                        point.item = aggregator.aggregatePoints(point.items, category);\n                    }\n                    return point;\n                };\n                for (var idx = range.min; idx <= range.max; idx++) {\n                    var point = categoryItem(idx);\n                    data[point.categoryIx] = point.item;\n                    if (point.items && point.items.length) {\n                        dataItems[point.categoryIx] = point.item;\n                    }\n                }\n                if (inArray(result.type, OUT_OF_RANGE_SERIES)) {\n                    createOutOfRangePoints(result, range, categoryAxis.totalCount(), categoryItem, function (idx) {\n                        return srcPoints[idx];\n                    });\n                }\n                categoryAxis.options.dataItems = dataItems;\n                return result;\n            },\n            appendChart: function (chart, pane) {\n                var series = chart.options.series;\n                var categoryAxis = this.seriesCategoryAxis(series[0]);\n                var categories = categoryAxis.options.categories;\n                var categoriesToAdd = Math.max(0, categoriesCount(series) - categories.length);\n                if (categoriesToAdd > 0) {\n                    categories = categoryAxis.options.categories = categoryAxis.options.categories.slice(0);\n                    while (categoriesToAdd--) {\n                        categories.push('');\n                    }\n                }\n                this.valueAxisRangeTracker.update(chart.valueAxisRanges);\n                PlotAreaBase.fn.appendChart.call(this, chart, pane);\n            },\n            seriesPaneName: function (series) {\n                var options = this.options;\n                var axisName = series.axis;\n                var axisOptions = [].concat(options.valueAxis);\n                var axis = grep(axisOptions, function (a) {\n                    return a.name === axisName;\n                })[0];\n                var panes = options.panes || [{}];\n                var defaultPaneName = (panes[0] || {}).name || 'default';\n                var paneName = (axis || {}).pane || defaultPaneName;\n                return paneName;\n            },\n            seriesCategoryAxis: function (series) {\n                var axisName = series.categoryAxis;\n                var axis = axisName ? this.namedCategoryAxes[axisName] : this.categoryAxis;\n                if (!axis) {\n                    throw new Error('Unable to locate category axis with name ' + axisName);\n                }\n                return axis;\n            },\n            stackableChartOptions: function (firstSeries, pane) {\n                var stack = firstSeries.stack;\n                var isStacked100 = stack && stack.type === '100%';\n                var clip = pane.options.clip;\n                return {\n                    isStacked: stack,\n                    isStacked100: isStacked100,\n                    clip: clip\n                };\n            },\n            groupSeriesByCategoryAxis: function (series) {\n                var categoryAxes = [];\n                var unique = {};\n                for (var idx = 0; idx < series.length; idx++) {\n                    var name = series[idx].categoryAxis || '$$default$$';\n                    if (!unique.hasOwnProperty(name)) {\n                        unique[name] = true;\n                        categoryAxes.push(name);\n                    }\n                }\n                var groups = [];\n                for (var axisIx = 0; axisIx < categoryAxes.length; axisIx++) {\n                    var axis = categoryAxes[axisIx];\n                    var axisSeries = groupSeries(series, axis, axisIx);\n                    if (axisSeries.length === 0) {\n                        continue;\n                    }\n                    groups.push(axisSeries);\n                }\n                return groups;\n            },\n            createBarChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var barChart = new BarChart(this, $.extend({\n                    series: series,\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    spacing: firstSeries.spacing\n                }, this.stackableChartOptions(firstSeries, pane)));\n                this.appendChart(barChart, pane);\n            },\n            createRangeBarChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var rangeColumnChart = new RangeBarChart(this, {\n                    series: series,\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    spacing: firstSeries.spacing\n                });\n                this.appendChart(rangeColumnChart, pane);\n            },\n            createBulletChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var bulletChart = new BulletChart(this, {\n                    series: series,\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    spacing: firstSeries.spacing,\n                    clip: pane.options.clip\n                });\n                this.appendChart(bulletChart, pane);\n            },\n            createLineChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var lineChart = new LineChart(this, $.extend({\n                    invertAxes: this.invertAxes,\n                    series: series\n                }, this.stackableChartOptions(firstSeries, pane)));\n                this.appendChart(lineChart, pane);\n            },\n            createAreaChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var areaChart = new AreaChart(this, $.extend({\n                    invertAxes: this.invertAxes,\n                    series: series\n                }, this.stackableChartOptions(firstSeries, pane)));\n                this.appendChart(areaChart, pane);\n            },\n            createRangeAreaChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var rangeAreaChart = new RangeAreaChart(this, {\n                    invertAxes: this.invertAxes,\n                    series: series,\n                    clip: pane.options.clip\n                });\n                this.appendChart(rangeAreaChart, pane);\n            },\n            createOHLCChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var chart = new OHLCChart(this, {\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    series: series,\n                    spacing: firstSeries.spacing,\n                    clip: pane.options.clip\n                });\n                this.appendChart(chart, pane);\n            },\n            createCandlestickChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var chart = new CandlestickChart(this, {\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    series: series,\n                    spacing: firstSeries.spacing,\n                    clip: pane.options.clip\n                });\n                this.appendChart(chart, pane);\n            },\n            createBoxPlotChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var chart = new BoxPlotChart(this, {\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    series: series,\n                    spacing: firstSeries.spacing,\n                    clip: pane.options.clip\n                });\n                this.appendChart(chart, pane);\n            },\n            createWaterfallChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var waterfallChart = new WaterfallChart(this, {\n                    series: series,\n                    invertAxes: this.invertAxes,\n                    gap: firstSeries.gap,\n                    spacing: firstSeries.spacing\n                });\n                this.appendChart(waterfallChart, pane);\n            },\n            axisRequiresRounding: function (categoryAxisName, categoryAxisIndex) {\n                var this$1 = this;\n                var centeredSeries = filterSeriesByType(this.series, EQUALLY_SPACED_SERIES);\n                for (var seriesIx = 0; seriesIx < this.series.length; seriesIx++) {\n                    var currentSeries = this$1.series[seriesIx];\n                    if (inArray(currentSeries.type, AREA_SERIES)) {\n                        var line = currentSeries.line;\n                        if (line && line.style === STEP) {\n                            centeredSeries.push(currentSeries);\n                        }\n                    }\n                }\n                for (var seriesIx$1 = 0; seriesIx$1 < centeredSeries.length; seriesIx$1++) {\n                    var seriesAxis = centeredSeries[seriesIx$1].categoryAxis || '';\n                    if (seriesAxis === categoryAxisName || !seriesAxis && categoryAxisIndex === 0) {\n                        return true;\n                    }\n                }\n            },\n            aggregatedAxis: function (categoryAxisName, categoryAxisIndex) {\n                var series = this.series;\n                for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n                    var seriesAxis = series[seriesIx].categoryAxis || '';\n                    if ((seriesAxis === categoryAxisName || !seriesAxis && categoryAxisIndex === 0) && series[seriesIx].categoryField) {\n                        return true;\n                    }\n                }\n            },\n            createCategoryAxesLabels: function () {\n                var axes = this.axes;\n                for (var i = 0; i < axes.length; i++) {\n                    if (axes[i] instanceof CategoryAxis) {\n                        axes[i].createLabels();\n                    }\n                }\n            },\n            createCategoryAxes: function (panes) {\n                var this$1 = this;\n                var invertAxes = this.invertAxes;\n                var definitions = [].concat(this.options.categoryAxis);\n                var axes = [];\n                for (var i = 0; i < definitions.length; i++) {\n                    var axisOptions = definitions[i];\n                    var axisPane = this$1.findPane(axisOptions.pane);\n                    if (inArray(axisPane, panes)) {\n                        var name = axisOptions.name;\n                        var categories = axisOptions.categories;\n                        if (categories === void 0) {\n                            categories = [];\n                        }\n                        axisOptions = deepExtend({\n                            vertical: invertAxes,\n                            reverse: !invertAxes && this$1.chartService.rtl,\n                            axisCrossingValue: invertAxes ? MAX_VALUE : 0\n                        }, axisOptions);\n                        if (!defined(axisOptions.justified)) {\n                            axisOptions.justified = this$1.isJustified();\n                        }\n                        if (this$1.axisRequiresRounding(name, i)) {\n                            axisOptions.justified = false;\n                        }\n                        var categoryAxis = void 0;\n                        if (isDateAxis(axisOptions, categories[0])) {\n                            categoryAxis = new dataviz.DateCategoryAxis(axisOptions, this$1.chartService);\n                        } else {\n                            categoryAxis = new CategoryAxis(axisOptions, this$1.chartService);\n                        }\n                        definitions[i].categories = categoryAxis.options.srcCategories;\n                        if (name) {\n                            if (this$1.namedCategoryAxes[name]) {\n                                throw new Error('Category axis with name ' + name + ' is already defined');\n                            }\n                            this$1.namedCategoryAxes[name] = categoryAxis;\n                        }\n                        categoryAxis.axisIndex = i;\n                        axes.push(categoryAxis);\n                        this$1.appendAxis(categoryAxis);\n                    }\n                }\n                var primaryAxis = this.categoryAxis || axes[0];\n                this.categoryAxis = primaryAxis;\n                if (invertAxes) {\n                    this.axisY = primaryAxis;\n                } else {\n                    this.axisX = primaryAxis;\n                }\n            },\n            isJustified: function () {\n                var series = this.series;\n                for (var i = 0; i < series.length; i++) {\n                    var currentSeries = series[i];\n                    if (!inArray(currentSeries.type, AREA_SERIES)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            createValueAxes: function (panes) {\n                var this$1 = this;\n                var tracker = this.valueAxisRangeTracker;\n                var defaultRange = tracker.query();\n                var definitions = [].concat(this.options.valueAxis);\n                var invertAxes = this.invertAxes;\n                var baseOptions = {\n                    vertical: !invertAxes,\n                    reverse: invertAxes && this.chartService.rtl\n                };\n                var axes = [];\n                if (this.stack100) {\n                    baseOptions.roundToMajorUnit = false;\n                    baseOptions.labels = { format: 'P0' };\n                }\n                for (var i = 0; i < definitions.length; i++) {\n                    var axisOptions = definitions[i];\n                    var axisPane = this$1.findPane(axisOptions.pane);\n                    if (inArray(axisPane, panes)) {\n                        var name = axisOptions.name;\n                        var defaultAxisRange = equalsIgnoreCase(axisOptions.type, LOGARITHMIC) ? {\n                            min: 0.1,\n                            max: 1\n                        } : {\n                            min: 0,\n                            max: 1\n                        };\n                        var range = tracker.query(name) || defaultRange || defaultAxisRange;\n                        if (i === 0 && range && defaultRange) {\n                            range.min = Math.min(range.min, defaultRange.min);\n                            range.max = Math.max(range.max, defaultRange.max);\n                        }\n                        var axisType = void 0;\n                        if (equalsIgnoreCase(axisOptions.type, LOGARITHMIC)) {\n                            axisType = dataviz.LogarithmicAxis;\n                        } else {\n                            axisType = dataviz.NumericAxis;\n                        }\n                        var valueAxis = new axisType(range.min, range.max, deepExtend({}, baseOptions, axisOptions), this$1.chartService);\n                        if (name) {\n                            if (this$1.namedValueAxes[name]) {\n                                throw new Error('Value axis with name ' + name + ' is already defined');\n                            }\n                            this$1.namedValueAxes[name] = valueAxis;\n                        }\n                        valueAxis.axisIndex = i;\n                        axes.push(valueAxis);\n                        this$1.appendAxis(valueAxis);\n                    }\n                }\n                var primaryAxis = this.valueAxis || axes[0];\n                this.valueAxis = primaryAxis;\n                if (invertAxes) {\n                    this.axisX = primaryAxis;\n                } else {\n                    this.axisY = primaryAxis;\n                }\n            },\n            _dispatchEvent: function (chart, e, eventType) {\n                var coords = chart._eventCoordinates(e);\n                var point = new Point(coords.x, coords.y);\n                var pane = this.pointPane(point);\n                var categories = [];\n                var values = [];\n                if (!pane) {\n                    return;\n                }\n                var allAxes = pane.axes;\n                for (var i = 0; i < allAxes.length; i++) {\n                    var axis = allAxes[i];\n                    if (axis.getValue) {\n                        appendIfNotNull(values, axis.getValue(point));\n                    } else {\n                        appendIfNotNull(categories, axis.getCategory(point));\n                    }\n                }\n                if (categories.length === 0) {\n                    appendIfNotNull(categories, this.categoryAxis.getCategory(point));\n                }\n                if (categories.length > 0 && values.length > 0) {\n                    chart.trigger(eventType, {\n                        element: eventElement(e),\n                        originalEvent: e,\n                        category: singleItemOrArray(categories),\n                        value: singleItemOrArray(values)\n                    });\n                }\n            },\n            pointPane: function (point) {\n                var panes = this.panes;\n                for (var i = 0; i < panes.length; i++) {\n                    var currentPane = panes[i];\n                    if (currentPane.contentBox.containsPoint(point)) {\n                        return currentPane;\n                    }\n                }\n            },\n            updateAxisOptions: function (axis, options) {\n                updateAxisOptions(this.options, axis, options);\n                updateAxisOptions(this.originalOptions, axis, options);\n            }\n        });\n        function updateAxisOptions(targetOptions, axis, options) {\n            var axesOptions = axis instanceof CategoryAxis ? [].concat(targetOptions.categoryAxis) : [].concat(targetOptions.valueAxis);\n            deepExtend(axesOptions[axis.axisIndex], options);\n        }\n        function groupSeries(series, axis, axisIx) {\n            return grep(series, function (s) {\n                return axisIx === 0 && !s.categoryAxis || s.categoryAxis === axis;\n            });\n        }\n        setDefaultOptions(CategoricalPlotArea, {\n            categoryAxis: {},\n            valueAxis: {}\n        });\n        deepExtend(CategoricalPlotArea.prototype, PlotAreaEventsMixin);\n        var Highlight = Class.extend({\n            init: function () {\n                this._points = [];\n            },\n            destroy: function () {\n                this._points = [];\n            },\n            show: function (points) {\n                var this$1 = this;\n                var arrayPoints = [].concat(points);\n                this.hide();\n                for (var i = 0; i < arrayPoints.length; i++) {\n                    var point = arrayPoints[i];\n                    if (point && point.toggleHighlight && point.hasHighlight()) {\n                        this$1.togglePointHighlight(point, true);\n                        this$1._points.push(point);\n                    }\n                }\n            },\n            togglePointHighlight: function (point, show) {\n                var toggleHandler = (point.options.highlight || {}).toggle;\n                if (toggleHandler) {\n                    var eventArgs = {\n                        category: point.category,\n                        series: point.series,\n                        dataItem: point.dataItem,\n                        value: point.value,\n                        stackValue: point.stackValue,\n                        preventDefault: preventDefault,\n                        visual: point.highlightVisual(),\n                        show: show\n                    };\n                    toggleHandler(eventArgs);\n                    if (!eventArgs._defaultPrevented) {\n                        point.toggleHighlight(show);\n                    }\n                } else {\n                    point.toggleHighlight(show);\n                }\n            },\n            hide: function () {\n                var this$1 = this;\n                var points = this._points;\n                while (points.length) {\n                    this$1.togglePointHighlight(points.pop(), false);\n                }\n            },\n            isHighlighted: function (element) {\n                var points = this._points;\n                for (var i = 0; i < points.length; i++) {\n                    var point = points[i];\n                    if (element === point) {\n                        return true;\n                    }\n                }\n                return false;\n            }\n        });\n        function preventDefault() {\n            this._defaultPrevented = true;\n        }\n        function acceptKey(e, mouseKey) {\n            var key = (mouseKey || '').toLowerCase();\n            var event = e.event;\n            var accept = key === 'none' && !(event.ctrlKey || event.shiftKey || event.altKey) || event[key + 'Key'];\n            return accept;\n        }\n        function toChartAxisRanges(axisRanges) {\n            var ranges = {};\n            for (var idx = 0; idx < axisRanges.length; idx++) {\n                var axisRange = axisRanges[idx];\n                if (axisRange.axis.options.name) {\n                    ranges[axisRange.axis.options.name] = {\n                        min: axisRange.range.min,\n                        max: axisRange.range.max\n                    };\n                }\n            }\n            return ranges;\n        }\n        var Pannable = Class.extend({\n            init: function (plotArea, options) {\n                this.plotArea = plotArea;\n                this.options = deepExtend({}, this.options, options);\n            },\n            start: function (e) {\n                this._active = acceptKey(e, this.options.key);\n                return this._active;\n            },\n            move: function (e) {\n                if (this._active) {\n                    var axisRanges = this.axisRanges = this._panAxes(e, X).concat(this._panAxes(e, Y));\n                    if (axisRanges.length) {\n                        this.axisRanges = axisRanges;\n                        return toChartAxisRanges(axisRanges);\n                    }\n                }\n            },\n            end: function () {\n                var active = this._active;\n                this._active = false;\n                return active;\n            },\n            pan: function () {\n                var ref = this;\n                var plotArea = ref.plotArea;\n                var axisRanges = ref.axisRanges;\n                if (axisRanges.length) {\n                    for (var idx = 0; idx < axisRanges.length; idx++) {\n                        var range = axisRanges[idx];\n                        plotArea.updateAxisOptions(range.axis, range.range);\n                    }\n                    plotArea.redraw(plotArea.panes);\n                }\n            },\n            destroy: function () {\n                delete this.plotArea;\n            },\n            _panAxes: function (e, position) {\n                var plotArea = this.plotArea;\n                var delta = -e[position].delta;\n                var lock = (this.options.lock || '').toLowerCase();\n                var updatedAxes = [];\n                if (delta !== 0 && (lock || '').toLowerCase() !== position) {\n                    var axes = plotArea.axes;\n                    for (var idx = 0; idx < axes.length; idx++) {\n                        var axis = axes[idx];\n                        if (position === X && !axis.options.vertical || position === Y && axis.options.vertical) {\n                            var range = axis.pan(delta);\n                            if (range) {\n                                range.limitRange = true;\n                                updatedAxes.push({\n                                    axis: axis,\n                                    range: range\n                                });\n                            }\n                        }\n                    }\n                }\n                return updatedAxes;\n            }\n        });\n        Pannable.prototype.options = {\n            key: 'none',\n            lock: 'none'\n        };\n        var ZoomSelection = Class.extend({\n            init: function (chart, options) {\n                this.chart = chart;\n                this.options = deepExtend({}, this.options, options);\n                this.createElement();\n            },\n            createElement: function () {\n                var marquee = this._marquee = document.createElement('div');\n                marquee.className = 'k-marquee';\n                var marqueeColor = document.createElement('div');\n                marqueeColor.className = 'k-marquee-color';\n                marquee.appendChild(marqueeColor);\n            },\n            removeElement: function () {\n                if (this._marquee.parentNode) {\n                    this._marquee.parentNode.removeChild(this._marquee);\n                }\n            },\n            setStyles: function (styles) {\n                elementStyles(this._marquee, styles);\n            },\n            start: function (e) {\n                if (acceptKey(e, this.options.key)) {\n                    var chart = this.chart;\n                    var point = chart._eventCoordinates(e);\n                    var zoomPane = this._zoomPane = chart._plotArea.paneByPoint(point);\n                    var clipBox = zoomPane ? zoomPane.chartsBox().clone() : null;\n                    if (zoomPane && clipBox) {\n                        var offset = this._elementOffset();\n                        clipBox.translate(offset.left, offset.top);\n                        this._zoomPaneClipBox = clipBox;\n                        document.body.appendChild(this._marquee);\n                        this.setStyles({\n                            left: e.pageX + 1,\n                            top: e.pageY + 1,\n                            width: 0,\n                            height: 0\n                        });\n                        return true;\n                    }\n                }\n                return false;\n            },\n            _elementOffset: function () {\n                var chartElement = this.chart.element;\n                var ref = elementStyles(chartElement, [\n                    'paddingLeft',\n                    'paddingTop'\n                ]);\n                var paddingLeft = ref.paddingLeft;\n                var paddingTop = ref.paddingTop;\n                var offset = dataviz.elementOffset(chartElement);\n                return {\n                    left: paddingLeft + offset.left,\n                    top: paddingTop + offset.top\n                };\n            },\n            move: function (e) {\n                var zoomPane = this._zoomPane;\n                if (zoomPane) {\n                    this.setStyles(this._selectionPosition(e));\n                }\n            },\n            end: function (e) {\n                var zoomPane = this._zoomPane;\n                if (zoomPane) {\n                    var elementOffset$$1 = this._elementOffset();\n                    var selectionPosition = this._selectionPosition(e);\n                    selectionPosition.left -= elementOffset$$1.left;\n                    selectionPosition.top -= elementOffset$$1.top;\n                    var start = {\n                        x: selectionPosition.left,\n                        y: selectionPosition.top\n                    };\n                    var end = {\n                        x: selectionPosition.left + selectionPosition.width,\n                        y: selectionPosition.top + selectionPosition.height\n                    };\n                    this._updateAxisRanges(start, end);\n                    this.removeElement();\n                    delete this._zoomPane;\n                    return toChartAxisRanges(this.axisRanges);\n                }\n            },\n            zoom: function () {\n                var axisRanges = this.axisRanges;\n                if (axisRanges && axisRanges.length) {\n                    var plotArea = this.chart._plotArea;\n                    for (var idx = 0; idx < axisRanges.length; idx++) {\n                        var axisRange = axisRanges[idx];\n                        plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n                    }\n                    plotArea.redraw(plotArea.panes);\n                }\n            },\n            destroy: function () {\n                this.removeElement();\n                delete this._marquee;\n                delete this.chart;\n            },\n            _updateAxisRanges: function (start, end) {\n                var lock = (this.options.lock || '').toLowerCase();\n                var axisRanges = [];\n                var axes = this._zoomPane.axes;\n                for (var idx = 0; idx < axes.length; idx++) {\n                    var axis = axes[idx];\n                    var vertical = axis.options.vertical;\n                    if (!(lock === X && !vertical) && !(lock === Y && vertical)) {\n                        var range = axis.pointsRange(start, end);\n                        if (range) {\n                            axisRanges.push({\n                                axis: axis,\n                                range: range\n                            });\n                        }\n                    }\n                }\n                this.axisRanges = axisRanges;\n            },\n            _selectionPosition: function (e) {\n                var clipBox = this._zoomPaneClipBox;\n                var startLocation = {\n                    x: e.x.startLocation,\n                    y: e.y.startLocation\n                };\n                var pageX = e.x.location;\n                var pageY = e.y.location;\n                var lock = (this.options.lock || '').toLowerCase();\n                var left = Math.min(startLocation.x, pageX);\n                var top = Math.min(startLocation.y, pageY);\n                var width = Math.abs(startLocation.x - pageX);\n                var height = Math.abs(startLocation.y - pageY);\n                if (lock === X) {\n                    left = clipBox.x1;\n                    width = clipBox.width();\n                }\n                if (lock === Y) {\n                    top = clipBox.y1;\n                    height = clipBox.height();\n                }\n                if (pageX > clipBox.x2) {\n                    width = clipBox.x2 - startLocation.x;\n                }\n                if (pageX < clipBox.x1) {\n                    width = startLocation.x - clipBox.x1;\n                }\n                if (pageY > clipBox.y2) {\n                    height = clipBox.y2 - startLocation.y;\n                }\n                if (pageY < clipBox.y1) {\n                    height = startLocation.y - clipBox.y1;\n                }\n                return {\n                    left: Math.max(left, clipBox.x1),\n                    top: Math.max(top, clipBox.y1),\n                    width: width,\n                    height: height\n                };\n            }\n        });\n        ZoomSelection.prototype.options = {\n            key: 'shift',\n            lock: 'none'\n        };\n        var MousewheelZoom = Class.extend({\n            init: function (chart, options) {\n                this.chart = chart;\n                this.options = deepExtend({}, this.options, options);\n            },\n            updateRanges: function (delta) {\n                var lock = (this.options.lock || '').toLowerCase();\n                var axisRanges = [];\n                var axes = this.chart._plotArea.axes;\n                for (var idx = 0; idx < axes.length; idx++) {\n                    var axis = axes[idx];\n                    var vertical = axis.options.vertical;\n                    if (!(lock === X && !vertical) && !(lock === Y && vertical)) {\n                        var range = axis.zoomRange(-delta);\n                        if (range) {\n                            axisRanges.push({\n                                axis: axis,\n                                range: range\n                            });\n                        }\n                    }\n                }\n                this.axisRanges = axisRanges;\n                return toChartAxisRanges(axisRanges);\n            },\n            zoom: function () {\n                var axisRanges = this.axisRanges;\n                if (axisRanges && axisRanges.length) {\n                    var plotArea = this.chart._plotArea;\n                    for (var idx = 0; idx < axisRanges.length; idx++) {\n                        var axisRange = axisRanges[idx];\n                        plotArea.updateAxisOptions(axisRange.axis, axisRange.range);\n                    }\n                    plotArea.redraw(plotArea.panes);\n                }\n            },\n            destroy: function () {\n                delete this.chart;\n            }\n        });\n        var LegendLayout = ChartElement.extend({\n            init: function (options, chartService) {\n                ChartElement.fn.init.call(this, options);\n                this.chartService = chartService;\n            },\n            render: function () {\n                var ref = this;\n                var children = ref.children;\n                var options = ref.options;\n                var vertical = options.vertical;\n                this.visual = new drawing.Layout(null, {\n                    spacing: vertical ? 0 : options.spacing,\n                    lineSpacing: vertical ? options.spacing : 0,\n                    orientation: vertical ? 'vertical' : 'horizontal',\n                    reverse: options.rtl,\n                    alignItems: vertical ? 'start' : 'center'\n                });\n                for (var idx = 0; idx < children.length; idx++) {\n                    var legendItem = children[idx];\n                    legendItem.reflow(new Box());\n                    legendItem.renderVisual();\n                }\n            },\n            reflow: function (box) {\n                this.visual.rect(box.toRect());\n                this.visual.reflow();\n                var bbox = this.visual.clippedBBox();\n                if (bbox) {\n                    this.box = dataviz.rectToBox(bbox);\n                } else {\n                    this.box = new Box();\n                }\n            },\n            renderVisual: function () {\n                this.addVisual();\n            },\n            createVisual: function () {\n            }\n        });\n        var LegendItem = BoxElement.extend({\n            init: function (options) {\n                BoxElement.fn.init.call(this, options);\n                this.createContainer();\n                if (!options.rtl) {\n                    this.createMarker();\n                    this.createLabel();\n                } else {\n                    this.createLabel();\n                    this.createMarker();\n                }\n            },\n            createContainer: function () {\n                this.container = new dataviz.FloatElement({\n                    vertical: false,\n                    wrap: false,\n                    align: CENTER,\n                    spacing: this.options.spacing\n                });\n                this.append(this.container);\n            },\n            createMarker: function () {\n                this.container.append(new ShapeElement(this.markerOptions()));\n            },\n            markerOptions: function () {\n                var options = this.options;\n                var markerColor = options.markerColor;\n                return deepExtend({}, options.markers, {\n                    background: markerColor,\n                    border: { color: markerColor }\n                });\n            },\n            createLabel: function () {\n                var options = this.options;\n                var labelOptions = deepExtend({}, options.labels);\n                this.container.append(new TextBox(options.text, labelOptions));\n            },\n            renderComplete: function () {\n                BoxElement.fn.renderComplete.call(this);\n                var cursor = this.options.cursor || {};\n                var eventSink = this._itemOverlay = Path.fromRect(this.container.box.toRect(), {\n                    fill: {\n                        color: WHITE,\n                        opacity: 0\n                    },\n                    stroke: null,\n                    cursor: cursor.style || cursor\n                });\n                this.appendVisual(eventSink);\n            },\n            click: function (widget, e) {\n                var args = this.eventArgs(e);\n                if (!widget.trigger(LEGEND_ITEM_CLICK, args) && e && e.type === 'contextmenu') {\n                    e.preventDefault();\n                }\n            },\n            over: function (widget, e) {\n                var args = this.eventArgs(e);\n                if (!widget.trigger(LEGEND_ITEM_HOVER, args)) {\n                    widget._legendItemHover(args.seriesIndex, args.pointIndex);\n                }\n                return true;\n            },\n            out: function (widget, e) {\n                widget._unsetActivePoint();\n                widget.trigger(LEGEND_ITEM_LEAVE, this.eventArgs(e));\n            },\n            eventArgs: function (e) {\n                var options = this.options;\n                return {\n                    element: eventElement(e),\n                    text: options.text,\n                    series: options.series,\n                    seriesIndex: options.series.index,\n                    pointIndex: options.pointIndex\n                };\n            },\n            renderVisual: function () {\n                var this$1 = this;\n                var options = this.options;\n                var customVisual = options.visual;\n                if (customVisual) {\n                    this.visual = customVisual({\n                        active: options.active,\n                        series: options.series,\n                        sender: this.getSender(),\n                        pointIndex: options.pointIndex,\n                        options: {\n                            markers: this.markerOptions(),\n                            labels: options.labels\n                        },\n                        createVisual: function () {\n                            this$1.createVisual();\n                            this$1.renderChildren();\n                            this$1.renderComplete();\n                            var defaultVisual = this$1.visual;\n                            delete this$1.visual;\n                            return defaultVisual;\n                        }\n                    });\n                    this.addVisual();\n                } else {\n                    BoxElement.fn.renderVisual.call(this);\n                }\n            }\n        });\n        var HORIZONTAL = 'horizontal';\n        var POINTER = 'pointer';\n        var CUSTOM = 'custom';\n        var Legend = ChartElement.extend({\n            init: function (options, chartService) {\n                if (chartService === void 0) {\n                    chartService = {};\n                }\n                ChartElement.fn.init.call(this, options);\n                this.chartService = chartService;\n                if (!inArray(this.options.position, [\n                        TOP,\n                        RIGHT,\n                        BOTTOM,\n                        LEFT,\n                        CUSTOM\n                    ])) {\n                    this.options.position = RIGHT;\n                }\n                this.createContainer();\n                this.createItems();\n            },\n            createContainer: function () {\n                var options = this.options;\n                var position = options.position;\n                var userAlign = options.align;\n                var align = position;\n                var vAlign = CENTER;\n                if (position === CUSTOM) {\n                    align = LEFT;\n                } else if (inArray(position, [\n                        TOP,\n                        BOTTOM\n                    ])) {\n                    if (userAlign === 'start') {\n                        align = LEFT;\n                    } else if (userAlign === 'end') {\n                        align = RIGHT;\n                    } else {\n                        align = CENTER;\n                    }\n                    vAlign = position;\n                } else if (userAlign) {\n                    if (userAlign === 'start') {\n                        vAlign = TOP;\n                    } else if (userAlign === 'end') {\n                        vAlign = BOTTOM;\n                    }\n                }\n                this.container = new BoxElement({\n                    margin: options.margin,\n                    padding: options.padding,\n                    background: options.background,\n                    border: options.border,\n                    vAlign: vAlign,\n                    align: align,\n                    zIndex: options.zIndex,\n                    shrinkToFit: true\n                });\n                this.append(this.container);\n            },\n            createItems: function () {\n                var chartService = this.getService();\n                var options = this.options;\n                var vertical = this.isVertical();\n                var innerElement = new LegendLayout({\n                    vertical: vertical,\n                    spacing: options.spacing,\n                    rtl: chartService.rtl\n                }, chartService);\n                var items = options.items;\n                if (options.reverse) {\n                    items = items.slice(0).reverse();\n                }\n                var count = items.length;\n                for (var i = 0; i < count; i++) {\n                    var item = items[i];\n                    innerElement.append(new LegendItem(deepExtend({}, {\n                        markers: options.markers,\n                        labels: options.labels,\n                        rtl: chartService.rtl\n                    }, options.item, item)));\n                }\n                innerElement.render();\n                this.container.append(innerElement);\n            },\n            isVertical: function () {\n                var ref = this.options;\n                var orientation = ref.orientation;\n                var position = ref.position;\n                var vertical = position === CUSTOM && orientation !== HORIZONTAL || (defined(orientation) ? orientation !== HORIZONTAL : inArray(position, [\n                    LEFT,\n                    RIGHT\n                ]));\n                return vertical;\n            },\n            hasItems: function () {\n                return this.container.children[0].children.length > 0;\n            },\n            reflow: function (targetBox) {\n                var options = this.options;\n                var legendBox = targetBox.clone();\n                if (!this.hasItems()) {\n                    this.box = legendBox;\n                    return;\n                }\n                if (options.position === CUSTOM) {\n                    this.containerCustomReflow(legendBox);\n                    this.box = legendBox;\n                } else {\n                    this.containerReflow(legendBox);\n                }\n            },\n            containerReflow: function (targetBox) {\n                var ref = this;\n                var options = ref.options;\n                var container = ref.container;\n                var position = options.position;\n                var width = options.width;\n                var height = options.height;\n                var pos = position === TOP || position === BOTTOM ? X : Y;\n                var vertical = this.isVertical();\n                var alignTarget = targetBox.clone();\n                var containerBox = targetBox.clone();\n                if (position === LEFT || position === RIGHT) {\n                    containerBox.y1 = alignTarget.y1 = 0;\n                }\n                if (vertical && height) {\n                    containerBox.y2 = containerBox.y1 + height;\n                    containerBox.align(alignTarget, Y, container.options.vAlign);\n                } else if (!vertical && width) {\n                    containerBox.x2 = containerBox.x1 + width;\n                    containerBox.align(alignTarget, X, container.options.align);\n                }\n                container.reflow(containerBox);\n                containerBox = container.box;\n                var box = containerBox.clone();\n                if (options.offsetX || options.offsetY) {\n                    containerBox.translate(options.offsetX, options.offsetY);\n                    this.container.reflow(containerBox);\n                }\n                box[pos + 1] = targetBox[pos + 1];\n                box[pos + 2] = targetBox[pos + 2];\n                this.box = box;\n            },\n            containerCustomReflow: function (targetBox) {\n                var ref = this;\n                var options = ref.options;\n                var container = ref.container;\n                var offsetX = options.offsetX;\n                var offsetY = options.offsetY;\n                var width = options.width;\n                var height = options.height;\n                var vertical = this.isVertical();\n                var containerBox = targetBox.clone();\n                if (vertical && height) {\n                    containerBox.y2 = containerBox.y1 + height;\n                } else if (!vertical && width) {\n                    containerBox.x2 = containerBox.x1 + width;\n                }\n                container.reflow(containerBox);\n                containerBox = container.box;\n                container.reflow(new Box(offsetX, offsetY, offsetX + containerBox.width(), offsetY + containerBox.height()));\n            },\n            renderVisual: function () {\n                if (this.hasItems()) {\n                    ChartElement.fn.renderVisual.call(this);\n                }\n            }\n        });\n        setDefaultOptions(Legend, {\n            position: RIGHT,\n            items: [],\n            offsetX: 0,\n            offsetY: 0,\n            margin: getSpacing(5),\n            padding: getSpacing(5),\n            border: {\n                color: BLACK,\n                width: 0\n            },\n            item: {\n                cursor: POINTER,\n                spacing: 6\n            },\n            spacing: 6,\n            background: '',\n            zIndex: 1,\n            markers: {\n                border: { width: 0 },\n                width: 15,\n                height: 3,\n                type: 'rect',\n                align: LEFT,\n                vAlign: CENTER\n            }\n        });\n        var PlotAreaFactory = Class.extend({\n            init: function () {\n                this._registry = [];\n            },\n            register: function (type, seriesTypes) {\n                this._registry.push({\n                    type: type,\n                    seriesTypes: seriesTypes\n                });\n            },\n            create: function (srcSeries, options, chartService) {\n                var registry = this._registry;\n                var match = registry[0];\n                var series;\n                for (var idx = 0; idx < registry.length; idx++) {\n                    var entry = registry[idx];\n                    series = filterSeriesByType(srcSeries, entry.seriesTypes);\n                    if (series.length > 0) {\n                        match = entry;\n                        break;\n                    }\n                }\n                return new match.type(series, options, chartService);\n            }\n        });\n        PlotAreaFactory.current = new PlotAreaFactory();\n        var ZOOM_ACCELERATION = 3;\n        var SELECTOR_HEIGHT_ADJUST = 0.1;\n        function createDiv(className) {\n            var element = document.createElement('div');\n            if (className) {\n                element.className = className;\n            }\n            return element;\n        }\n        function closestHandle(element) {\n            var current = element;\n            while (current && !hasClasses(current, 'k-handle')) {\n                current = current.parentNode;\n            }\n            return current;\n        }\n        var Selection = Class.extend({\n            init: function (chart, categoryAxis, options, observer) {\n                var chartElement = chart.element;\n                this.options = deepExtend({}, this.options, options);\n                this.chart = chart;\n                this.observer = observer;\n                this.chartElement = chartElement;\n                this.categoryAxis = categoryAxis;\n                this._dateAxis = this.categoryAxis instanceof dataviz.DateCategoryAxis;\n                this.initOptions();\n                if (this.options.visible) {\n                    this.createElements();\n                    this.set(this._index(this.options.from), this._index(this.options.to));\n                    this.bindEvents();\n                }\n            },\n            onPane: function (pane) {\n                return this.categoryAxis.pane === pane;\n            },\n            createElements: function () {\n                var options = this.options;\n                var wrapper = this.wrapper = createDiv('k-selector');\n                elementStyles(wrapper, {\n                    top: options.offset.top,\n                    left: options.offset.left,\n                    width: options.width,\n                    height: options.height,\n                    direction: 'ltr'\n                });\n                var selection = this.selection = createDiv('k-selection');\n                this.leftMask = createDiv('k-mask');\n                this.rightMask = createDiv('k-mask');\n                wrapper.appendChild(this.leftMask);\n                wrapper.appendChild(this.rightMask);\n                wrapper.appendChild(selection);\n                selection.appendChild(createDiv('k-selection-bg'));\n                var leftHandle = this.leftHandle = createDiv('k-handle k-left-handle');\n                var rightHandle = this.rightHandle = createDiv('k-handle k-right-handle');\n                leftHandle.appendChild(createDiv());\n                rightHandle.appendChild(createDiv());\n                selection.appendChild(leftHandle);\n                selection.appendChild(rightHandle);\n                this.chartElement.appendChild(wrapper);\n                var selectionStyles = elementStyles(selection, [\n                    'borderLeftWidth',\n                    'borderRightWidth',\n                    'height'\n                ]);\n                var leftHandleHeight = elementStyles(leftHandle, 'height').height;\n                var rightHandleHeight = elementStyles(rightHandle, 'height').height;\n                options.selection = {\n                    border: {\n                        left: selectionStyles.borderLeftWidth,\n                        right: selectionStyles.borderRightWidth\n                    }\n                };\n                elementStyles(leftHandle, { top: (selectionStyles.height - leftHandleHeight) / 2 });\n                elementStyles(rightHandle, { top: (selectionStyles.height - rightHandleHeight) / 2 });\n                wrapper.style.cssText = wrapper.style.cssText;\n            },\n            bindEvents: function () {\n                if (this.options.mousewheel !== false) {\n                    this._mousewheelHandler = this._mousewheel.bind(this);\n                    var obj;\n                    bindEvents(this.wrapper, (obj = {}, obj[MOUSEWHEEL] = this._mousewheelHandler, obj));\n                }\n                this._domEvents = services.DomEventsBuilder.create(this.wrapper, {\n                    stopPropagation: true,\n                    start: this._start.bind(this),\n                    move: this._move.bind(this),\n                    end: this._end.bind(this),\n                    tap: this._tap.bind(this),\n                    press: this._press.bind(this),\n                    gesturestart: this._gesturestart.bind(this),\n                    gesturechange: this._gesturechange.bind(this),\n                    gestureend: this._gestureend.bind(this)\n                });\n            },\n            initOptions: function () {\n                var ref = this;\n                var options = ref.options;\n                var categoryAxis = ref.categoryAxis;\n                var box = categoryAxis.pane.chartsBox();\n                var intlService = this.chart.chartService.intl;\n                if (this._dateAxis) {\n                    deepExtend(options, {\n                        min: parseDate(intlService, options.min),\n                        max: parseDate(intlService, options.max),\n                        from: parseDate(intlService, options.from),\n                        to: parseDate(intlService, options.to)\n                    });\n                }\n                var ref$1 = elementStyles(this.chartElement, [\n                    'paddingLeft',\n                    'paddingTop'\n                ]);\n                var paddingLeft = ref$1.paddingLeft;\n                var paddingTop = ref$1.paddingTop;\n                this.options = deepExtend({}, {\n                    width: box.width(),\n                    height: box.height() + SELECTOR_HEIGHT_ADJUST,\n                    padding: {\n                        left: paddingLeft,\n                        top: paddingTop\n                    },\n                    offset: {\n                        left: box.x1 + paddingLeft,\n                        top: box.y1 + paddingTop\n                    },\n                    from: options.min,\n                    to: options.max\n                }, options);\n            },\n            destroy: function () {\n                if (this._domEvents) {\n                    this._domEvents.destroy();\n                    delete this._domEvents;\n                }\n                clearTimeout(this._mwTimeout);\n                this._state = null;\n                if (this.wrapper) {\n                    if (this._mousewheelHandler) {\n                        var obj;\n                        unbindEvents(this.wrapper, (obj = {}, obj[MOUSEWHEEL] = this._mousewheelHandler, obj));\n                        this._mousewheelHandler = null;\n                    }\n                    this.chartElement.removeChild(this.wrapper);\n                    this.wrapper = null;\n                }\n            },\n            _rangeEventArgs: function (range) {\n                return {\n                    axis: this.categoryAxis.options,\n                    from: this._value(range.from),\n                    to: this._value(range.to)\n                };\n            },\n            _start: function (e) {\n                var options = this.options;\n                var target = eventElement(e);\n                if (this._state || !target) {\n                    return;\n                }\n                this.chart._unsetActivePoint();\n                this._state = {\n                    moveTarget: closestHandle(target) || target,\n                    startLocation: e.x ? e.x.location : 0,\n                    range: {\n                        from: this._index(options.from),\n                        to: this._index(options.to)\n                    }\n                };\n                var args = this._rangeEventArgs({\n                    from: this._index(options.from),\n                    to: this._index(options.to)\n                });\n                if (this.trigger(SELECT_START, args)) {\n                    this._state = null;\n                }\n            },\n            _press: function (e) {\n                var handle;\n                if (this._state) {\n                    handle = this._state.moveTarget;\n                } else {\n                    handle = closestHandle(eventElement(e));\n                }\n                if (handle) {\n                    dataviz.addClass(handle, 'k-handle-active');\n                }\n            },\n            _move: function (e) {\n                if (!this._state) {\n                    return;\n                }\n                var ref = this;\n                var state = ref._state;\n                var options = ref.options;\n                var categoryAxis = ref.categoryAxis;\n                var range = state.range;\n                var target = state.moveTarget;\n                var reverse = categoryAxis.options.reverse;\n                var from = this._index(options.from);\n                var to = this._index(options.to);\n                var min = this._index(options.min);\n                var max = this._index(options.max);\n                var delta = state.startLocation - e.x.location;\n                var oldRange = {\n                    from: range.from,\n                    to: range.to\n                };\n                var span = range.to - range.from;\n                var scale = elementStyles(this.wrapper, 'width').width / (categoryAxis.categoriesCount() - 1);\n                var offset = Math.round(delta / scale) * (reverse ? -1 : 1);\n                if (!target) {\n                    return;\n                }\n                var leftHandle = hasClasses(target, 'k-left-handle');\n                var rightHandle = hasClasses(target, 'k-right-handle');\n                if (hasClasses(target, 'k-selection k-selection-bg')) {\n                    range.from = Math.min(Math.max(min, from - offset), max - span);\n                    range.to = Math.min(range.from + span, max);\n                } else if (leftHandle && !reverse || rightHandle && reverse) {\n                    range.from = Math.min(Math.max(min, from - offset), max - 1);\n                    range.to = Math.max(range.from + 1, range.to);\n                } else if (leftHandle && reverse || rightHandle && !reverse) {\n                    range.to = Math.min(Math.max(min + 1, to - offset), max);\n                    range.from = Math.min(range.to - 1, range.from);\n                }\n                if (range.from !== oldRange.from || range.to !== oldRange.to) {\n                    this.move(range.from, range.to);\n                    this.trigger(SELECT, this._rangeEventArgs(range));\n                }\n            },\n            _end: function () {\n                if (this._state) {\n                    var moveTarget = this._state.moveTarget;\n                    if (moveTarget) {\n                        dataviz.removeClass(moveTarget, 'k-handle-active');\n                    }\n                    var range = this._state.range;\n                    this.set(range.from, range.to);\n                    this.trigger(SELECT_END, this._rangeEventArgs(range));\n                    delete this._state;\n                }\n            },\n            _tap: function (e) {\n                var ref = this;\n                var options = ref.options;\n                var categoryAxis = ref.categoryAxis;\n                var coords = this.chart._eventCoordinates(e);\n                var categoryIx = categoryAxis.pointCategoryIndex(new Point(coords.x, categoryAxis.box.y1));\n                var from = this._index(options.from);\n                var to = this._index(options.to);\n                var min = this._index(options.min);\n                var max = this._index(options.max);\n                var span = to - from;\n                var mid = from + span / 2;\n                var range = {};\n                var rightClick = e.event.which === 3;\n                var offset = Math.round(mid - categoryIx);\n                if (this._state || rightClick) {\n                    return;\n                }\n                this.chart._unsetActivePoint();\n                if (!categoryAxis.options.justified) {\n                    offset--;\n                }\n                range.from = Math.min(Math.max(min, from - offset), max - span);\n                range.to = Math.min(range.from + span, max);\n                this._start(e);\n                if (this._state) {\n                    this._state.range = range;\n                    this.trigger(SELECT, this._rangeEventArgs(range));\n                    this._end();\n                }\n            },\n            _mousewheel: function (e) {\n                var this$1 = this;\n                var delta = dataviz.mousewheelDelta(e);\n                this._start({ target: this.selection });\n                if (this._state) {\n                    var range = this._state.range;\n                    e.preventDefault();\n                    e.stopPropagation();\n                    if (Math.abs(delta) > 1) {\n                        delta *= ZOOM_ACCELERATION;\n                    }\n                    if (this.options.mousewheel.reverse) {\n                        delta *= -1;\n                    }\n                    if (this.expand(delta)) {\n                        this.trigger(SELECT, {\n                            axis: this.categoryAxis.options,\n                            delta: delta,\n                            originalEvent: e,\n                            from: this._value(range.from),\n                            to: this._value(range.to)\n                        });\n                    }\n                    if (this._mwTimeout) {\n                        clearTimeout(this._mwTimeout);\n                    }\n                    this._mwTimeout = setTimeout(function () {\n                        this$1._end();\n                    }, MOUSEWHEEL_DELAY);\n                }\n            },\n            _gesturestart: function (e) {\n                var options = this.options;\n                this._state = {\n                    range: {\n                        from: this._index(options.from),\n                        to: this._index(options.to)\n                    }\n                };\n                var args = this._rangeEventArgs(this._state.range);\n                if (this.trigger(SELECT_START, args)) {\n                    this._state = null;\n                } else {\n                    e.preventDefault();\n                }\n            },\n            _gestureend: function () {\n                if (this._state) {\n                    this.trigger(SELECT_END, this._rangeEventArgs(this._state.range));\n                    delete this._state;\n                }\n            },\n            _gesturechange: function (e) {\n                var ref = this;\n                var chart = ref.chart;\n                var state = ref._state;\n                var options = ref.options;\n                var categoryAxis = ref.categoryAxis;\n                var range = state.range;\n                var p0 = chart._toModelCoordinates(e.touches[0].x.location).x;\n                var p1 = chart._toModelCoordinates(e.touches[1].x.location).x;\n                var left = Math.min(p0, p1);\n                var right = Math.max(p0, p1);\n                e.preventDefault();\n                range.from = categoryAxis.pointCategoryIndex(new Point(left)) || options.min;\n                range.to = categoryAxis.pointCategoryIndex(new Point(right)) || options.max;\n                this.move(range.from, range.to);\n                this.trigger(SELECT, this._rangeEventArgs(range));\n            },\n            _index: function (value) {\n                var index = value;\n                if (value instanceof Date) {\n                    index = this.categoryAxis.categoryIndex(value);\n                }\n                return index;\n            },\n            _value: function (index) {\n                var value = index;\n                if (this._dateAxis) {\n                    value = this.categoryAxis.categoryAt(index);\n                    if (value > this.options.max) {\n                        value = this.options.max;\n                    }\n                }\n                return value;\n            },\n            _slot: function (value) {\n                var categoryAxis = this.categoryAxis;\n                var index = this._index(value);\n                return categoryAxis.getSlot(index, index, true);\n            },\n            move: function (from, to) {\n                var options = this.options;\n                var reverse = this.categoryAxis.options.reverse;\n                var offset = options.offset;\n                var padding = options.padding;\n                var border = options.selection.border;\n                var left = reverse ? to : from;\n                var right = reverse ? from : to;\n                var edge = 'x' + (reverse ? 2 : 1);\n                var box = this._slot(left);\n                var leftMaskWidth = round(box[edge] - offset.left + padding.left);\n                elementStyles(this.leftMask, { width: leftMaskWidth });\n                elementStyles(this.selection, { left: leftMaskWidth });\n                box = this._slot(right);\n                var rightMaskWidth = round(options.width - (box[edge] - offset.left + padding.left));\n                elementStyles(this.rightMask, { width: rightMaskWidth });\n                var distance = options.width - rightMaskWidth;\n                if (distance !== options.width) {\n                    distance += border.right;\n                }\n                elementStyles(this.rightMask, { left: distance });\n                elementStyles(this.selection, { width: Math.max(options.width - (leftMaskWidth + rightMaskWidth) - border.right, 0) });\n            },\n            set: function (from, to) {\n                var options = this.options;\n                var min = this._index(options.min);\n                var max = this._index(options.max);\n                var fromValue = limitValue(this._index(from), min, max);\n                var toValue = limitValue(this._index(to), fromValue + 1, max);\n                if (options.visible) {\n                    this.move(fromValue, toValue);\n                }\n                options.from = this._value(fromValue);\n                options.to = this._value(toValue);\n            },\n            expand: function (delta) {\n                var options = this.options;\n                var min = this._index(options.min);\n                var max = this._index(options.max);\n                var zDir = options.mousewheel.zoom;\n                var from = this._index(options.from);\n                var to = this._index(options.to);\n                var range = {\n                    from: from,\n                    to: to\n                };\n                var oldRange = deepExtend({}, range);\n                if (this._state) {\n                    range = this._state.range;\n                }\n                if (zDir !== RIGHT) {\n                    range.from = limitValue(limitValue(from - delta, 0, to - 1), min, max);\n                }\n                if (zDir !== LEFT) {\n                    range.to = limitValue(limitValue(to + delta, range.from + 1, max), min, max);\n                }\n                if (range.from !== oldRange.from || range.to !== oldRange.to) {\n                    this.set(range.from, range.to);\n                    return true;\n                }\n            },\n            trigger: function (name, args) {\n                return (this.observer || this.chart).trigger(name, args);\n            }\n        });\n        setDefaultOptions(Selection, {\n            visible: true,\n            mousewheel: { zoom: 'both' },\n            min: MIN_VALUE,\n            max: MAX_VALUE\n        });\n        var Tooltip = BaseTooltip.extend({\n            show: function (point) {\n                if (!point || !point.tooltipAnchor || this._current && this._current === point) {\n                    return;\n                }\n                var options = deepExtend({}, this.options, point.options.tooltip);\n                var anchor = point.tooltipAnchor();\n                if (anchor) {\n                    this._current = point;\n                    BaseTooltip.fn.show.call(this, {\n                        point: point,\n                        anchor: anchor\n                    }, options, point);\n                } else {\n                    this.hide();\n                }\n            },\n            hide: function () {\n                delete this._current;\n                BaseTooltip.fn.hide.call(this);\n            }\n        });\n        var SharedTooltip = BaseTooltip.extend({\n            init: function (plotArea, options) {\n                BaseTooltip.fn.init.call(this, plotArea.chartService, options);\n                this.plotArea = plotArea;\n                this.formatService = plotArea.chartService.format;\n            },\n            showAt: function (points, coords) {\n                var tooltipPoints = grep(points, function (point) {\n                    var tooltip = point.series.tooltip;\n                    var excluded = tooltip && tooltip.visible === false;\n                    return !excluded;\n                });\n                if (tooltipPoints.length > 0) {\n                    var point = tooltipPoints[0];\n                    var slot = this.plotArea.categoryAxis.getSlot(point.categoryIx);\n                    var anchor = coords ? this._slotAnchor(coords, slot) : this._defaultAnchor(point, slot);\n                    this.show({\n                        anchor: anchor,\n                        shared: true,\n                        points: points,\n                        category: point.category,\n                        categoryText: this.formatService.auto(this.options.categoryFormat, point.category),\n                        series: this.plotArea.series\n                    }, this.options);\n                }\n            },\n            _slotAnchor: function (point, slot) {\n                var axis = this.plotArea.categoryAxis;\n                var align = {\n                    horizontal: 'left',\n                    vertical: 'center'\n                };\n                if (!axis.options.vertical) {\n                    point.x = slot.center().x;\n                }\n                return {\n                    point: point,\n                    align: align\n                };\n            },\n            _defaultAnchor: function (point, slot) {\n                var box = point.owner.pane.chartsBox();\n                var vertical = this.plotArea.categoryAxis.options.vertical;\n                var center = box.center();\n                var slotCenter = slot.center();\n                var align = {\n                    horizontal: 'center',\n                    vertical: 'center'\n                };\n                var centerPoint;\n                if (vertical) {\n                    centerPoint = new Point(center.x, slotCenter.y);\n                } else {\n                    centerPoint = new Point(slotCenter.x, center.y);\n                }\n                return {\n                    point: centerPoint,\n                    align: align\n                };\n            }\n        });\n        setDefaultOptions(SharedTooltip, { categoryFormat: '{0:d}' });\n        var BarChartAnimation = Animation.extend({\n            setup: function () {\n                var ref = this;\n                var element = ref.element;\n                var options = ref.options;\n                var bbox = element.bbox();\n                if (bbox) {\n                    this.origin = options.origin;\n                    var axis = options.vertical ? Y : X;\n                    var fromScale = this.fromScale = new GeometryPoint(1, 1);\n                    fromScale[axis] = START_SCALE;\n                    element.transform(transform().scale(fromScale.x, fromScale.y));\n                } else {\n                    this.abort();\n                }\n            },\n            step: function (pos) {\n                var scaleX = dataviz.interpolateValue(this.fromScale.x, 1, pos);\n                var scaleY = dataviz.interpolateValue(this.fromScale.y, 1, pos);\n                this.element.transform(transform().scale(scaleX, scaleY, this.origin));\n            },\n            abort: function () {\n                Animation.fn.abort.call(this);\n                this.element.transform(null);\n            }\n        });\n        setDefaultOptions(BarChartAnimation, { duration: INITIAL_ANIMATION_DURATION });\n        AnimationFactory.current.register(BAR, BarChartAnimation);\n        var BubbleAnimation = Animation.extend({\n            setup: function () {\n                var center = this.center = this.element.bbox().center();\n                this.element.transform(transform().scale(START_SCALE, START_SCALE, center));\n            },\n            step: function (pos) {\n                this.element.transform(transform().scale(pos, pos, this.center));\n            }\n        });\n        setDefaultOptions(BubbleAnimation, { easing: 'easeOutElastic' });\n        AnimationFactory.current.register(BUBBLE, BubbleAnimation);\n        var FadeInAnimation = Animation.extend({\n            setup: function () {\n                this.fadeTo = this.element.opacity();\n                this.element.opacity(0);\n            },\n            step: function (pos) {\n                this.element.opacity(pos * this.fadeTo);\n            }\n        });\n        setDefaultOptions(FadeInAnimation, {\n            duration: 200,\n            easing: 'linear'\n        });\n        AnimationFactory.current.register(FADEIN, FadeInAnimation);\n        var PieAnimation = Animation.extend({\n            setup: function () {\n                this.element.transform(transform().scale(START_SCALE, START_SCALE, this.options.center));\n            },\n            step: function (pos) {\n                this.element.transform(transform().scale(pos, pos, this.options.center));\n            }\n        });\n        setDefaultOptions(PieAnimation, {\n            easing: 'easeOutElastic',\n            duration: INITIAL_ANIMATION_DURATION\n        });\n        AnimationFactory.current.register(PIE, PieAnimation);\n        var ScatterLineChart = ScatterChart.extend({\n            render: function () {\n                ScatterChart.fn.render.call(this);\n                this.renderSegments();\n            },\n            createSegment: function (linePoints, currentSeries, seriesIx) {\n                var style = currentSeries.style;\n                var pointType;\n                if (style === SMOOTH) {\n                    pointType = SplineSegment;\n                } else {\n                    pointType = LineSegment;\n                }\n                return new pointType(linePoints, currentSeries, seriesIx);\n            },\n            animationPoints: function () {\n                var points = ScatterChart.fn.animationPoints.call(this);\n                return points.concat(this._segments);\n            },\n            createMissingValue: function (value, missingValues) {\n                if (missingValues === ZERO) {\n                    var missingValue = {\n                        x: value.x,\n                        y: value.y\n                    };\n                    if (!hasValue(missingValue.x)) {\n                        missingValue.x = 0;\n                    }\n                    if (!hasValue(missingValue.y)) {\n                        missingValue.y = 0;\n                    }\n                    return missingValue;\n                }\n            }\n        });\n        deepExtend(ScatterLineChart.prototype, LineChartMixin);\n        var XYPlotArea = PlotAreaBase.extend({\n            initFields: function () {\n                this.namedXAxes = {};\n                this.namedYAxes = {};\n                this.xAxisRangeTracker = new AxisGroupRangeTracker();\n                this.yAxisRangeTracker = new AxisGroupRangeTracker();\n            },\n            render: function (panes) {\n                var this$1 = this;\n                if (panes === void 0) {\n                    panes = this.panes;\n                }\n                var seriesByPane = this.groupSeriesByPane();\n                for (var i = 0; i < panes.length; i++) {\n                    var pane = panes[i];\n                    var paneSeries = seriesByPane[pane.options.name || 'default'] || [];\n                    this$1.addToLegend(paneSeries);\n                    var filteredSeries = this$1.filterVisibleSeries(paneSeries);\n                    if (!filteredSeries) {\n                        continue;\n                    }\n                    this$1.createScatterChart(filterSeriesByType(filteredSeries, SCATTER), pane);\n                    this$1.createScatterLineChart(filterSeriesByType(filteredSeries, SCATTER_LINE), pane);\n                    this$1.createBubbleChart(filterSeriesByType(filteredSeries, BUBBLE), pane);\n                }\n                this.createAxes(panes);\n            },\n            appendChart: function (chart, pane) {\n                this.xAxisRangeTracker.update(chart.xAxisRanges);\n                this.yAxisRangeTracker.update(chart.yAxisRanges);\n                PlotAreaBase.fn.appendChart.call(this, chart, pane);\n            },\n            removeAxis: function (axis) {\n                var axisName = axis.options.name;\n                PlotAreaBase.fn.removeAxis.call(this, axis);\n                if (axis.options.vertical) {\n                    this.yAxisRangeTracker.reset(axisName);\n                    delete this.namedYAxes[axisName];\n                } else {\n                    this.xAxisRangeTracker.reset(axisName);\n                    delete this.namedXAxes[axisName];\n                }\n                if (axis === this.axisX) {\n                    delete this.axisX;\n                }\n                if (axis === this.axisY) {\n                    delete this.axisY;\n                }\n            },\n            seriesPaneName: function (series) {\n                var options = this.options;\n                var xAxisName = series.xAxis;\n                var xAxisOptions = [].concat(options.xAxis);\n                var xAxis = grep(xAxisOptions, function (a) {\n                    return a.name === xAxisName;\n                })[0];\n                var yAxisName = series.yAxis;\n                var yAxisOptions = [].concat(options.yAxis);\n                var yAxis = grep(yAxisOptions, function (a) {\n                    return a.name === yAxisName;\n                })[0];\n                var panes = options.panes || [{}];\n                var defaultPaneName = panes[0].name || 'default';\n                var paneName = (xAxis || {}).pane || (yAxis || {}).pane || defaultPaneName;\n                return paneName;\n            },\n            createScatterChart: function (series, pane) {\n                if (series.length > 0) {\n                    this.appendChart(new ScatterChart(this, {\n                        series: series,\n                        clip: pane.options.clip\n                    }), pane);\n                }\n            },\n            createScatterLineChart: function (series, pane) {\n                if (series.length > 0) {\n                    this.appendChart(new ScatterLineChart(this, {\n                        series: series,\n                        clip: pane.options.clip\n                    }), pane);\n                }\n            },\n            createBubbleChart: function (series, pane) {\n                if (series.length > 0) {\n                    this.appendChart(new BubbleChart(this, {\n                        series: series,\n                        clip: pane.options.clip\n                    }), pane);\n                }\n            },\n            createXYAxis: function (options, vertical, axisIndex) {\n                var axisName = options.name;\n                var namedAxes = vertical ? this.namedYAxes : this.namedXAxes;\n                var tracker = vertical ? this.yAxisRangeTracker : this.xAxisRangeTracker;\n                var axisOptions = deepExtend({ reverse: !vertical && this.chartService.rtl }, options, { vertical: vertical });\n                var isLog = equalsIgnoreCase(axisOptions.type, LOGARITHMIC);\n                var defaultRange = tracker.query();\n                var defaultAxisRange = isLog ? {\n                    min: 0.1,\n                    max: 1\n                } : {\n                    min: 0,\n                    max: 1\n                };\n                var range = tracker.query(axisName) || defaultRange || defaultAxisRange;\n                var typeSamples = [\n                    axisOptions.min,\n                    axisOptions.max\n                ];\n                var series = this.series;\n                for (var seriesIx = 0; seriesIx < series.length; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var seriesAxisName = currentSeries[vertical ? 'yAxis' : 'xAxis'];\n                    if (seriesAxisName === axisOptions.name || axisIndex === 0 && !seriesAxisName) {\n                        var firstPointValue = SeriesBinder.current.bindPoint(currentSeries, 0).valueFields;\n                        typeSamples.push(firstPointValue[vertical ? 'y' : 'x']);\n                        break;\n                    }\n                }\n                if (axisIndex === 0 && defaultRange) {\n                    range.min = Math.min(range.min, defaultRange.min);\n                    range.max = Math.max(range.max, defaultRange.max);\n                }\n                var inferredDate;\n                for (var i = 0; i < typeSamples.length; i++) {\n                    if (typeSamples[i] instanceof Date) {\n                        inferredDate = true;\n                        break;\n                    }\n                }\n                var axisType;\n                if (equalsIgnoreCase(axisOptions.type, DATE) || !axisOptions.type && inferredDate) {\n                    axisType = dataviz.DateValueAxis;\n                } else if (isLog) {\n                    axisType = dataviz.LogarithmicAxis;\n                } else {\n                    axisType = dataviz.NumericAxis;\n                }\n                var axis = new axisType(range.min, range.max, axisOptions, this.chartService);\n                axis.axisIndex = axisIndex;\n                if (axisName) {\n                    if (namedAxes[axisName]) {\n                        throw new Error((vertical ? 'Y' : 'X') + ' axis with name ' + axisName + ' is already defined');\n                    }\n                    namedAxes[axisName] = axis;\n                }\n                this.appendAxis(axis);\n                return axis;\n            },\n            createAxes: function (panes) {\n                var this$1 = this;\n                var options = this.options;\n                var xAxesOptions = [].concat(options.xAxis);\n                var xAxes = [];\n                var yAxesOptions = [].concat(options.yAxis);\n                var yAxes = [];\n                for (var idx = 0; idx < xAxesOptions.length; idx++) {\n                    var axisPane = this$1.findPane(xAxesOptions[idx].pane);\n                    if (inArray(axisPane, panes)) {\n                        xAxes.push(this$1.createXYAxis(xAxesOptions[idx], false, idx));\n                    }\n                }\n                for (var idx$1 = 0; idx$1 < yAxesOptions.length; idx$1++) {\n                    var axisPane$1 = this$1.findPane(yAxesOptions[idx$1].pane);\n                    if (inArray(axisPane$1, panes)) {\n                        yAxes.push(this$1.createXYAxis(yAxesOptions[idx$1], true, idx$1));\n                    }\n                }\n                this.axisX = this.axisX || xAxes[0];\n                this.axisY = this.axisY || yAxes[0];\n            },\n            _dispatchEvent: function (chart, e, eventType) {\n                var coords = chart._eventCoordinates(e);\n                var point = new Point(coords.x, coords.y);\n                var allAxes = this.axes;\n                var length = allAxes.length;\n                var xValues = [];\n                var yValues = [];\n                for (var i = 0; i < length; i++) {\n                    var axis = allAxes[i];\n                    var values = axis.options.vertical ? yValues : xValues;\n                    var currentValue = axis.getValue(point);\n                    if (currentValue !== null) {\n                        values.push(currentValue);\n                    }\n                }\n                if (xValues.length > 0 && yValues.length > 0) {\n                    chart.trigger(eventType, {\n                        element: eventElement(e),\n                        originalEvent: e,\n                        x: singleItemOrArray(xValues),\n                        y: singleItemOrArray(yValues)\n                    });\n                }\n            },\n            updateAxisOptions: function (axis, options) {\n                var vertical = axis.options.vertical;\n                var axes = this.groupAxes(this.panes);\n                var index = (vertical ? axes.y : axes.x).indexOf(axis);\n                updateAxisOptions$1(this.options, index, vertical, options);\n                updateAxisOptions$1(this.originalOptions, index, vertical, options);\n            }\n        });\n        function updateAxisOptions$1(targetOptions, axisIndex, vertical, options) {\n            var axisOptions = [].concat(vertical ? targetOptions.yAxis : targetOptions.xAxis)[axisIndex];\n            deepExtend(axisOptions, options);\n        }\n        setDefaultOptions(XYPlotArea, {\n            xAxis: {},\n            yAxis: {}\n        });\n        deepExtend(XYPlotArea.prototype, PlotAreaEventsMixin);\n        var PieSegment = ChartElement.extend({\n            init: function (value, sector, options) {\n                ChartElement.fn.init.call(this, options);\n                this.value = value;\n                this.sector = sector;\n            },\n            render: function () {\n                var labels = this.options.labels;\n                var chartService = this.owner.chartService;\n                var labelText = this.value;\n                if (this._rendered || this.visible === false) {\n                    return;\n                }\n                this._rendered = true;\n                var labelTemplate = getTemplate(labels);\n                var pointData = this.pointData();\n                if (labelTemplate) {\n                    labelText = labelTemplate(pointData);\n                } else if (labels.format) {\n                    labelText = chartService.format.auto(labels.format, labelText);\n                }\n                if (labels.visible && (labelText || labelText === 0)) {\n                    if (labels.position === CENTER || labels.position === INSIDE_END) {\n                        if (!labels.color) {\n                            var brightnessValue = new Color(this.options.color).percBrightness();\n                            if (brightnessValue > 180) {\n                                labels.color = BLACK;\n                            } else {\n                                labels.color = WHITE;\n                            }\n                        }\n                        if (!labels.background) {\n                            labels.background = this.options.color;\n                        }\n                    } else {\n                        var themeLabels = chartService.theme.seriesDefaults.labels;\n                        labels.color = labels.color || themeLabels.color;\n                        labels.background = labels.background || themeLabels.background;\n                    }\n                    this.label = new TextBox(labelText, deepExtend({}, labels, {\n                        align: CENTER,\n                        vAlign: '',\n                        animation: {\n                            type: FADEIN,\n                            delay: this.animationDelay\n                        }\n                    }), pointData);\n                    this.append(this.label);\n                }\n            },\n            reflow: function (targetBox) {\n                this.render();\n                this.box = targetBox;\n                this.reflowLabel();\n            },\n            reflowLabel: function () {\n                var ref = this;\n                var labelsOptions = ref.options.labels;\n                var label = ref.label;\n                var sector = this.sector.clone();\n                var labelsDistance = labelsOptions.distance;\n                var angle = sector.middle();\n                if (label) {\n                    var labelHeight = label.box.height();\n                    var labelWidth = label.box.width();\n                    var lp;\n                    if (labelsOptions.position === CENTER) {\n                        sector.radius = Math.abs((sector.radius - labelHeight) / 2) + labelHeight;\n                        lp = sector.point(angle);\n                        label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n                    } else if (labelsOptions.position === INSIDE_END) {\n                        sector.radius = sector.radius - labelHeight / 2;\n                        lp = sector.point(angle);\n                        label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n                    } else {\n                        var x1;\n                        lp = sector.clone().expand(labelsDistance).point(angle);\n                        if (lp.x >= sector.center.x) {\n                            x1 = lp.x + labelWidth;\n                            label.orientation = RIGHT;\n                        } else {\n                            x1 = lp.x - labelWidth;\n                            label.orientation = LEFT;\n                        }\n                        label.reflow(new Box(x1, lp.y - labelHeight, lp.x, lp.y));\n                    }\n                }\n            },\n            createVisual: function () {\n                var this$1 = this;\n                var ref = this;\n                var sector = ref.sector;\n                var options = ref.options;\n                ChartElement.fn.createVisual.call(this);\n                if (this.value) {\n                    if (options.visual) {\n                        var startAngle = (sector.startAngle + 180) % 360;\n                        var visual = options.visual({\n                            category: this.category,\n                            dataItem: this.dataItem,\n                            value: this.value,\n                            series: this.series,\n                            percentage: this.percentage,\n                            center: new GeometryPoint(sector.center.x, sector.center.y),\n                            radius: sector.radius,\n                            innerRadius: sector.innerRadius,\n                            startAngle: startAngle,\n                            endAngle: startAngle + sector.angle,\n                            options: options,\n                            sender: this.getSender(),\n                            createVisual: function () {\n                                var group = new Group();\n                                this$1.createSegmentVisual(group);\n                                return group;\n                            }\n                        });\n                        if (visual) {\n                            this.visual.append(visual);\n                        }\n                    } else {\n                        this.createSegmentVisual(this.visual);\n                    }\n                }\n            },\n            createSegmentVisual: function (group) {\n                var ref = this;\n                var sector = ref.sector;\n                var options = ref.options;\n                var borderOptions = options.border || {};\n                var border = borderOptions.width > 0 ? {\n                    stroke: {\n                        color: borderOptions.color,\n                        width: borderOptions.width,\n                        opacity: borderOptions.opacity,\n                        dashType: borderOptions.dashType\n                    }\n                } : {};\n                var color = options.color;\n                var fill = {\n                    color: color,\n                    opacity: options.opacity\n                };\n                var visual = this.createSegment(sector, deepExtend({\n                    fill: fill,\n                    stroke: { opacity: options.opacity },\n                    zIndex: options.zIndex\n                }, border));\n                group.append(visual);\n                if (hasGradientOverlay(options)) {\n                    group.append(this.createGradientOverlay(visual, {\n                        baseColor: color,\n                        fallbackFill: fill\n                    }, deepExtend({\n                        center: [\n                            sector.center.x,\n                            sector.center.y\n                        ],\n                        innerRadius: sector.innerRadius,\n                        radius: sector.radius,\n                        userSpace: true\n                    }, options.overlay)));\n                }\n            },\n            createSegment: function (sector, options) {\n                if (options.singleSegment) {\n                    return new drawing.Circle(new geometry.Circle(new GeometryPoint(sector.center.x, sector.center.y), sector.radius), options);\n                }\n                return dataviz.ShapeBuilder.current.createRing(sector, options);\n            },\n            createAnimation: function () {\n                var ref = this;\n                var options = ref.options;\n                var center = ref.sector.center;\n                deepExtend(options, {\n                    animation: {\n                        center: [\n                            center.x,\n                            center.y\n                        ],\n                        delay: this.animationDelay\n                    }\n                });\n                ChartElement.fn.createAnimation.call(this);\n            },\n            createHighlight: function (options) {\n                var highlight = this.options.highlight || {};\n                var border = highlight.border || {};\n                return this.createSegment(this.sector, deepExtend({}, options, {\n                    fill: {\n                        color: highlight.color,\n                        opacity: highlight.opacity\n                    },\n                    stroke: {\n                        opacity: border.opacity,\n                        width: border.width,\n                        color: border.color\n                    }\n                }));\n            },\n            highlightVisual: function () {\n                return this.visual.children[0];\n            },\n            highlightVisualArgs: function () {\n                var sector = this.sector;\n                return {\n                    options: this.options,\n                    radius: sector.radius,\n                    innerRadius: sector.innerRadius,\n                    center: new GeometryPoint(sector.center.x, sector.center.y),\n                    startAngle: sector.startAngle,\n                    endAngle: sector.angle + sector.startAngle,\n                    visual: this.visual\n                };\n            },\n            tooltipAnchor: function () {\n                var sector = this.sector.clone().expand(TOOLTIP_OFFSET);\n                var midAndle = sector.middle();\n                var midPoint = sector.point(midAndle);\n                return {\n                    point: midPoint,\n                    align: tooltipAlignment(midAndle + 180)\n                };\n            },\n            formatValue: function (format) {\n                return this.owner.formatPointValue(this, format);\n            },\n            pointData: function () {\n                return {\n                    dataItem: this.dataItem,\n                    category: this.category,\n                    value: this.value,\n                    series: this.series,\n                    percentage: this.percentage\n                };\n            }\n        });\n        var RAD_30 = round(dataviz.rad(30), DEFAULT_PRECISION);\n        var RAD_60 = round(dataviz.rad(60), DEFAULT_PRECISION);\n        function tooltipAlignment(angle) {\n            var radians = dataviz.rad(angle);\n            var sine = round(Math.sin(radians), DEFAULT_PRECISION);\n            var cosine = round(Math.cos(radians), DEFAULT_PRECISION);\n            var horizontal;\n            if (Math.abs(sine) > RAD_60) {\n                horizontal = CENTER;\n            } else if (cosine < 0) {\n                horizontal = RIGHT;\n            } else {\n                horizontal = LEFT;\n            }\n            var vertical;\n            if (Math.abs(sine) < RAD_30) {\n                vertical = CENTER;\n            } else if (sine < 0) {\n                vertical = BOTTOM;\n            } else {\n                vertical = TOP;\n            }\n            return {\n                horizontal: horizontal,\n                vertical: vertical\n            };\n        }\n        setDefaultOptions(PieSegment, {\n            color: WHITE,\n            overlay: { gradient: 'roundedBevel' },\n            border: { width: 0.5 },\n            labels: {\n                visible: false,\n                distance: 35,\n                font: datavizConstants.DEFAULT_FONT,\n                margin: getSpacing(0.5),\n                align: CIRCLE,\n                zIndex: 1,\n                position: OUTSIDE_END\n            },\n            animation: { type: PIE },\n            highlight: {\n                visible: true,\n                border: { width: 1 }\n            },\n            visible: true\n        });\n        deepExtend(PieSegment.prototype, PointEventsMixin);\n        var PieChartMixin = {\n            createLegendItem: function (value, point, options) {\n                var legendOptions = this.options.legend || {};\n                var labelsOptions = legendOptions.labels || {};\n                var inactiveItems = legendOptions.inactiveItems || {};\n                var inactiveItemsLabels = inactiveItems.labels || {};\n                if (options && options.visibleInLegend !== false) {\n                    var pointVisible = options.visible !== false;\n                    var labelTemplate = pointVisible ? getTemplate(labelsOptions) : getTemplate(inactiveItemsLabels) || getTemplate(labelsOptions);\n                    var text = options.category;\n                    if (labelTemplate) {\n                        text = labelTemplate({\n                            text: text,\n                            series: options.series,\n                            dataItem: options.dataItem,\n                            percentage: options.percentage,\n                            value: value\n                        });\n                    }\n                    var itemLabelOptions, markerColor;\n                    if (pointVisible) {\n                        itemLabelOptions = {};\n                        markerColor = point.color;\n                    } else {\n                        itemLabelOptions = {\n                            color: inactiveItemsLabels.color,\n                            font: inactiveItemsLabels.font\n                        };\n                        markerColor = (inactiveItems.markers || {}).color;\n                    }\n                    if (hasValue(text) && text !== '') {\n                        this.legendItems.push({\n                            active: pointVisible,\n                            pointIndex: options.index,\n                            text: text,\n                            series: options.series,\n                            markerColor: markerColor,\n                            labels: itemLabelOptions\n                        });\n                    }\n                }\n            }\n        };\n        var PIE_SECTOR_ANIM_DELAY = 70;\n        var PieChart = ChartElement.extend({\n            init: function (plotArea, options) {\n                ChartElement.fn.init.call(this, options);\n                this.plotArea = plotArea;\n                this.chartService = plotArea.chartService;\n                this.points = [];\n                this.legendItems = [];\n                this.render();\n            },\n            render: function () {\n                this.traverseDataPoints(this.addValue.bind(this));\n            },\n            traverseDataPoints: function (callback) {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var seriesColors = ref.plotArea.options.seriesColors;\n                if (seriesColors === void 0) {\n                    seriesColors = [];\n                }\n                var colorsCount = seriesColors.length;\n                var series = options.series;\n                var seriesCount = series.length;\n                for (var seriesIx = 0; seriesIx < seriesCount; seriesIx++) {\n                    var currentSeries = series[seriesIx];\n                    var data = currentSeries.data;\n                    var ref$1 = bindSegments(currentSeries);\n                    var total = ref$1.total;\n                    var points = ref$1.points;\n                    var count = ref$1.count;\n                    var anglePerValue = 360 / total;\n                    var constantAngle = void 0;\n                    if (!isFinite(anglePerValue)) {\n                        constantAngle = 360 / count;\n                    }\n                    var currentAngle = void 0;\n                    if (defined(currentSeries.startAngle)) {\n                        currentAngle = currentSeries.startAngle;\n                    } else {\n                        currentAngle = options.startAngle;\n                    }\n                    if (seriesIx !== seriesCount - 1) {\n                        if (currentSeries.labels.position === OUTSIDE_END) {\n                            currentSeries.labels.position = CENTER;\n                        }\n                    }\n                    for (var i = 0; i < points.length; i++) {\n                        var pointData = points[i];\n                        if (!pointData) {\n                            continue;\n                        }\n                        var fields = pointData.fields;\n                        var value = pointData.value;\n                        var visible = pointData.visible;\n                        var angle = value !== 0 ? constantAngle || value * anglePerValue : 0;\n                        var explode = data.length !== 1 && Boolean(fields.explode);\n                        if (!isFunction(currentSeries.color)) {\n                            currentSeries.color = fields.color || seriesColors[i % colorsCount];\n                        }\n                        callback(pointData.valueFields.value, new dataviz.Ring(null, 0, 0, currentAngle, angle), {\n                            owner: this$1,\n                            category: defined(fields.category) ? fields.category : '',\n                            index: i,\n                            series: currentSeries,\n                            seriesIx: seriesIx,\n                            dataItem: data[i],\n                            percentage: total !== 0 ? value / total : 0,\n                            explode: explode,\n                            visibleInLegend: fields.visibleInLegend,\n                            visible: visible,\n                            zIndex: seriesCount - seriesIx,\n                            animationDelay: this$1.animationDelay(i, seriesIx, seriesCount)\n                        });\n                        if (visible !== false) {\n                            currentAngle += angle;\n                        }\n                    }\n                }\n            },\n            evalSegmentOptions: function (options, value, fields) {\n                var series = fields.series;\n                evalOptions(options, {\n                    value: value,\n                    series: series,\n                    dataItem: fields.dataItem,\n                    category: fields.category,\n                    percentage: fields.percentage\n                }, {\n                    defaults: series._defaults,\n                    excluded: [\n                        'data',\n                        'content',\n                        'template',\n                        'visual',\n                        'toggle'\n                    ]\n                });\n            },\n            addValue: function (value, sector, fields) {\n                var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n                this.evalSegmentOptions(segmentOptions, value, fields);\n                this.createLegendItem(value, segmentOptions, fields);\n                if (fields.visible === false) {\n                    return;\n                }\n                var segment = new PieSegment(value, sector, segmentOptions);\n                $.extend(segment, fields);\n                this.append(segment);\n                this.points.push(segment);\n            },\n            reflow: function (targetBox) {\n                var ref = this;\n                var options = ref.options;\n                var points = ref.points;\n                var seriesConfigs = ref.seriesConfigs;\n                if (seriesConfigs === void 0) {\n                    seriesConfigs = [];\n                }\n                var count = points.length;\n                var box = targetBox.clone();\n                var space = 5;\n                var minWidth = Math.min(box.width(), box.height());\n                var halfMinWidth = minWidth / 2;\n                var defaultPadding = minWidth - minWidth * 0.85;\n                var newBox = new Box(box.x1, box.y1, box.x1 + minWidth, box.y1 + minWidth);\n                var newBoxCenter = newBox.center();\n                var boxCenter = box.center();\n                var seriesCount = options.series.length;\n                var leftSideLabels = [];\n                var rightSideLabels = [];\n                var padding = valueOrDefault(options.padding, defaultPadding);\n                padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n                newBox.translate(boxCenter.x - newBoxCenter.x, boxCenter.y - newBoxCenter.y);\n                var radius = halfMinWidth - padding;\n                var center = new Point(radius + newBox.x1 + padding, radius + newBox.y1 + padding);\n                for (var i = 0; i < count; i++) {\n                    var segment = points[i];\n                    var sector = segment.sector;\n                    var seriesIndex = segment.seriesIx;\n                    sector.radius = radius;\n                    sector.center = center;\n                    if (seriesConfigs.length) {\n                        var seriesConfig = seriesConfigs[seriesIndex];\n                        sector.innerRadius = seriesConfig.innerRadius;\n                        sector.radius = seriesConfig.radius;\n                    }\n                    if (seriesIndex === seriesCount - 1 && segment.explode) {\n                        sector.center = sector.clone().setRadius(sector.radius * 0.15).point(sector.middle());\n                    }\n                    segment.reflow(newBox);\n                    var label = segment.label;\n                    if (label) {\n                        if (label.options.position === OUTSIDE_END) {\n                            if (seriesIndex === seriesCount - 1) {\n                                if (label.orientation === RIGHT) {\n                                    rightSideLabels.push(label);\n                                } else {\n                                    leftSideLabels.push(label);\n                                }\n                            }\n                        }\n                    }\n                }\n                if (leftSideLabels.length > 0) {\n                    leftSideLabels.sort(this.labelComparator(true));\n                    this.leftLabelsReflow(leftSideLabels);\n                }\n                if (rightSideLabels.length > 0) {\n                    rightSideLabels.sort(this.labelComparator(false));\n                    this.rightLabelsReflow(rightSideLabels);\n                }\n                this.box = newBox;\n            },\n            leftLabelsReflow: function (labels) {\n                var distances = this.distanceBetweenLabels(labels);\n                this.distributeLabels(distances, labels);\n            },\n            rightLabelsReflow: function (labels) {\n                var distances = this.distanceBetweenLabels(labels);\n                this.distributeLabels(distances, labels);\n            },\n            distanceBetweenLabels: function (labels) {\n                var segment = last(this.points);\n                var sector = segment.sector;\n                var count = labels.length - 1;\n                var lr = sector.radius + segment.options.labels.distance;\n                var distances = [];\n                var firstBox = labels[0].box;\n                var distance = round(firstBox.y1 - (sector.center.y - lr - firstBox.height() - firstBox.height() / 2));\n                distances.push(distance);\n                for (var i = 0; i < count; i++) {\n                    var secondBox = labels[i + 1].box;\n                    firstBox = labels[i].box;\n                    distance = round(secondBox.y1 - firstBox.y2);\n                    distances.push(distance);\n                }\n                distance = round(sector.center.y + lr - labels[count].box.y2 - labels[count].box.height() / 2);\n                distances.push(distance);\n                return distances;\n            },\n            distributeLabels: function (distances, labels) {\n                var this$1 = this;\n                var count = distances.length;\n                var left, right, remaining;\n                for (var i = 0; i < count; i++) {\n                    remaining = -distances[i];\n                    left = right = i;\n                    while (remaining > 0 && (left >= 0 || right < count)) {\n                        remaining = this$1._takeDistance(distances, i, --left, remaining);\n                        remaining = this$1._takeDistance(distances, i, ++right, remaining);\n                    }\n                }\n                this.reflowLabels(distances, labels);\n            },\n            _takeDistance: function (distances, anchor, position, amount) {\n                var result = amount;\n                if (distances[position] > 0) {\n                    var available = Math.min(distances[position], result);\n                    result -= available;\n                    distances[position] -= available;\n                    distances[anchor] += available;\n                }\n                return result;\n            },\n            reflowLabels: function (distances, labels) {\n                var this$1 = this;\n                var segment = last(this.points);\n                var sector = segment.sector;\n                var labelOptions = segment.options.labels;\n                var labelsCount = labels.length;\n                var labelDistance = labelOptions.distance;\n                var boxY = sector.center.y - (sector.radius + labelDistance) - labels[0].box.height();\n                var boxX;\n                distances[0] += 2;\n                for (var i = 0; i < labelsCount; i++) {\n                    var label = labels[i];\n                    var box = label.box;\n                    boxY += distances[i];\n                    boxX = this$1.hAlignLabel(box.x2, sector.clone().expand(labelDistance), boxY, boxY + box.height(), label.orientation === RIGHT);\n                    if (label.orientation === RIGHT) {\n                        if (labelOptions.align !== CIRCLE) {\n                            boxX = sector.radius + sector.center.x + labelDistance;\n                        }\n                        label.reflow(new Box(boxX + box.width(), boxY, boxX, boxY));\n                    } else {\n                        if (labelOptions.align !== CIRCLE) {\n                            boxX = sector.center.x - sector.radius - labelDistance;\n                        }\n                        label.reflow(new Box(boxX - box.width(), boxY, boxX, boxY));\n                    }\n                    boxY += box.height();\n                }\n            },\n            createVisual: function () {\n                var this$1 = this;\n                var ref = this;\n                var connectors = ref.options.connectors;\n                var points = ref.points;\n                var count = points.length;\n                var space = 4;\n                ChartElement.fn.createVisual.call(this);\n                this._connectorLines = [];\n                for (var i = 0; i < count; i++) {\n                    var segment = points[i];\n                    var sector = segment.sector;\n                    var label = segment.label;\n                    var angle = sector.middle();\n                    var connectorsColor = (segment.options.connectors || {}).color || connectors.color;\n                    if (label) {\n                        var connectorLine = new Path({\n                            stroke: {\n                                color: connectorsColor,\n                                width: connectors.width\n                            },\n                            animation: {\n                                type: FADEIN,\n                                delay: segment.animationDelay\n                            }\n                        });\n                        if (label.options.position === OUTSIDE_END) {\n                            var box = label.box;\n                            var centerPoint = sector.center;\n                            var start = sector.point(angle);\n                            var middle = new Point(box.x1, box.center().y);\n                            var sr = void 0, end = void 0, crossing = void 0;\n                            start = sector.clone().expand(connectors.padding).point(angle);\n                            connectorLine.moveTo(start.x, start.y);\n                            if (label.orientation === RIGHT) {\n                                end = new Point(box.x1 - connectors.padding, box.center().y);\n                                crossing = intersection(centerPoint, start, middle, end);\n                                middle = new Point(end.x - space, end.y);\n                                crossing = crossing || middle;\n                                crossing.x = Math.min(crossing.x, middle.x);\n                                if (this$1.pointInCircle(crossing, sector.center, sector.radius + space) || crossing.x < sector.center.x) {\n                                    sr = sector.center.x + sector.radius + space;\n                                    if (segment.options.labels.align !== COLUMN) {\n                                        if (sr < middle.x) {\n                                            connectorLine.lineTo(sr, start.y);\n                                        } else {\n                                            connectorLine.lineTo(start.x + space * 2, start.y);\n                                        }\n                                    } else {\n                                        connectorLine.lineTo(sr, start.y);\n                                    }\n                                    connectorLine.lineTo(middle.x, end.y);\n                                } else {\n                                    crossing.y = end.y;\n                                    connectorLine.lineTo(crossing.x, crossing.y);\n                                }\n                            } else {\n                                end = new Point(box.x2 + connectors.padding, box.center().y);\n                                crossing = intersection(centerPoint, start, middle, end);\n                                middle = new Point(end.x + space, end.y);\n                                crossing = crossing || middle;\n                                crossing.x = Math.max(crossing.x, middle.x);\n                                if (this$1.pointInCircle(crossing, sector.center, sector.radius + space) || crossing.x > sector.center.x) {\n                                    sr = sector.center.x - sector.radius - space;\n                                    if (segment.options.labels.align !== COLUMN) {\n                                        if (sr > middle.x) {\n                                            connectorLine.lineTo(sr, start.y);\n                                        } else {\n                                            connectorLine.lineTo(start.x - space * 2, start.y);\n                                        }\n                                    } else {\n                                        connectorLine.lineTo(sr, start.y);\n                                    }\n                                    connectorLine.lineTo(middle.x, end.y);\n                                } else {\n                                    crossing.y = end.y;\n                                    connectorLine.lineTo(crossing.x, crossing.y);\n                                }\n                            }\n                            connectorLine.lineTo(end.x, end.y);\n                            this$1._connectorLines.push(connectorLine);\n                            this$1.visual.append(connectorLine);\n                        }\n                    }\n                }\n            },\n            labelComparator: function (reverse) {\n                var reverseValue = reverse ? -1 : 1;\n                return function (a, b) {\n                    var first = (a.parent.sector.middle() + 270) % 360;\n                    var second = (b.parent.sector.middle() + 270) % 360;\n                    return (first - second) * reverseValue;\n                };\n            },\n            hAlignLabel: function (originalX, sector, y1, y2, direction) {\n                var radius = sector.radius;\n                var sector_center = sector.center;\n                var cx = sector_center.x;\n                var cy = sector_center.y;\n                var t = Math.min(Math.abs(cy - y1), Math.abs(cy - y2));\n                if (t > radius) {\n                    return originalX;\n                }\n                return cx + Math.sqrt(radius * radius - t * t) * (direction ? 1 : -1);\n            },\n            pointInCircle: function (point, center, radius) {\n                return Math.pow(center.x - point.x, 2) + Math.pow(center.y - point.y, 2) < Math.pow(radius, 2);\n            },\n            formatPointValue: function (point, format) {\n                return this.chartService.format.auto(format, point.value);\n            },\n            animationDelay: function (categoryIndex) {\n                return categoryIndex * PIE_SECTOR_ANIM_DELAY;\n            }\n        });\n        function intersection(a1, a2, b1, b2) {\n            var uat = (b2.x - b1.x) * (a1.y - b1.y) - (b2.y - b1.y) * (a1.x - b1.x);\n            var ub = (b2.y - b1.y) * (a2.x - a1.x) - (b2.x - b1.x) * (a2.y - a1.y);\n            var result;\n            if (ub !== 0) {\n                var ua = uat / ub;\n                result = new Point(a1.x + ua * (a2.x - a1.x), a1.y + ua * (a2.y - a1.y));\n            }\n            return result;\n        }\n        setDefaultOptions(PieChart, {\n            startAngle: 90,\n            connectors: {\n                width: 2,\n                color: '#939393',\n                padding: 8\n            },\n            inactiveItems: {\n                markers: {},\n                labels: {}\n            }\n        });\n        deepExtend(PieChart.prototype, PieChartMixin);\n        var PiePlotArea = PlotAreaBase.extend({\n            render: function () {\n                this.createPieChart(this.series);\n            },\n            createPieChart: function (series) {\n                var firstSeries = series[0];\n                var pieChart = new PieChart(this, {\n                    series: series,\n                    padding: firstSeries.padding,\n                    startAngle: firstSeries.startAngle,\n                    connectors: firstSeries.connectors,\n                    legend: this.options.legend\n                });\n                this.appendChart(pieChart);\n            },\n            appendChart: function (chart, pane) {\n                PlotAreaBase.fn.appendChart.call(this, chart, pane);\n                append(this.options.legend.items, chart.legendItems);\n            }\n        });\n        var DonutSegment = PieSegment.extend({\n            reflowLabel: function () {\n                var ref = this;\n                var labelsOptions = ref.options.labels;\n                var label = ref.label;\n                var sector = this.sector.clone();\n                var angle = sector.middle();\n                if (label) {\n                    var labelHeight = label.box.height();\n                    if (labelsOptions.position === CENTER) {\n                        sector.radius -= (sector.radius - sector.innerRadius) / 2;\n                        var lp = sector.point(angle);\n                        label.reflow(new Box(lp.x, lp.y - labelHeight / 2, lp.x, lp.y));\n                    } else {\n                        PieSegment.fn.reflowLabel.call(this);\n                    }\n                }\n            },\n            createSegment: function (sector, options) {\n                return dataviz.ShapeBuilder.current.createRing(sector, options);\n            }\n        });\n        setDefaultOptions(DonutSegment, {\n            overlay: { gradient: 'roundedGlass' },\n            labels: { position: CENTER },\n            animation: { type: PIE }\n        });\n        deepExtend(DonutSegment.prototype, PointEventsMixin);\n        var DONUT_SECTOR_ANIM_DELAY = 50;\n        var DonutChart = PieChart.extend({\n            addValue: function (value, sector, fields) {\n                var segmentOptions = deepExtend({}, fields.series, { index: fields.index });\n                this.evalSegmentOptions(segmentOptions, value, fields);\n                this.createLegendItem(value, segmentOptions, fields);\n                if (!value || fields.visible === false) {\n                    return;\n                }\n                var segment = new DonutSegment(value, sector, segmentOptions);\n                $.extend(segment, fields);\n                this.append(segment);\n                this.points.push(segment);\n            },\n            reflow: function (targetBox) {\n                var this$1 = this;\n                var options = this.options;\n                var box = targetBox.clone();\n                var space = 5;\n                var minWidth = Math.min(box.width(), box.height());\n                var halfMinWidth = minWidth / 2;\n                var defaultPadding = minWidth - minWidth * 0.85;\n                var series = options.series;\n                var seriesCount = series.length;\n                var padding = valueOrDefault(options.padding, defaultPadding);\n                padding = padding > halfMinWidth - space ? halfMinWidth - space : padding;\n                var totalSize = halfMinWidth - padding;\n                var seriesWithoutSize = 0;\n                var holeSize;\n                for (var i = 0; i < seriesCount; i++) {\n                    var currentSeries = series[i];\n                    if (i === 0) {\n                        if (defined(currentSeries.holeSize)) {\n                            holeSize = currentSeries.holeSize;\n                            totalSize -= currentSeries.holeSize;\n                        }\n                    }\n                    if (defined(currentSeries.size)) {\n                        totalSize -= currentSeries.size;\n                    } else {\n                        seriesWithoutSize++;\n                    }\n                    if (defined(currentSeries.margin) && i !== seriesCount - 1) {\n                        totalSize -= currentSeries.margin;\n                    }\n                }\n                if (!defined(holeSize)) {\n                    var currentSize = (halfMinWidth - padding) / (seriesCount + 0.75);\n                    holeSize = currentSize * 0.75;\n                    totalSize -= holeSize;\n                }\n                var innerRadius = holeSize;\n                var margin = 0;\n                var size, radius;\n                this.seriesConfigs = [];\n                for (var i$1 = 0; i$1 < seriesCount; i$1++) {\n                    var currentSeries$1 = series[i$1];\n                    size = valueOrDefault(currentSeries$1.size, totalSize / seriesWithoutSize);\n                    innerRadius += margin;\n                    radius = innerRadius + size;\n                    this$1.seriesConfigs.push({\n                        innerRadius: innerRadius,\n                        radius: radius\n                    });\n                    margin = currentSeries$1.margin || 0;\n                    innerRadius = radius;\n                }\n                PieChart.fn.reflow.call(this, targetBox);\n            },\n            animationDelay: function (categoryIndex, seriesIndex, seriesCount) {\n                return categoryIndex * DONUT_SECTOR_ANIM_DELAY + INITIAL_ANIMATION_DURATION * (seriesIndex + 1) / (seriesCount + 1);\n            }\n        });\n        setDefaultOptions(DonutChart, {\n            startAngle: 90,\n            connectors: {\n                width: 2,\n                color: '#939393',\n                padding: 8\n            }\n        });\n        var DonutPlotArea = PiePlotArea.extend({\n            render: function () {\n                this.createDonutChart(this.series);\n            },\n            createDonutChart: function (series) {\n                var firstSeries = series[0];\n                var donutChart = new DonutChart(this, {\n                    series: series,\n                    padding: firstSeries.padding,\n                    connectors: firstSeries.connectors,\n                    legend: this.options.legend\n                });\n                this.appendChart(donutChart);\n            }\n        });\n        var DEFAULT_PADDING = 0.15;\n        var PolarPlotAreaBase = PlotAreaBase.extend({\n            initFields: function () {\n                this.valueAxisRangeTracker = new AxisGroupRangeTracker();\n            },\n            render: function () {\n                this.addToLegend(this.series);\n                this.createPolarAxis();\n                this.createCharts();\n                this.createValueAxis();\n            },\n            alignAxes: function () {\n                var axis = this.valueAxis;\n                var range = axis.range();\n                var crossingValue = axis.options.reverse ? range.max : range.min;\n                var slot = axis.getSlot(crossingValue);\n                var center = this.polarAxis.getSlot(0).center;\n                var axisBox = axis.box.translate(center.x - slot.x1, center.y - slot.y1);\n                axis.reflow(axisBox);\n            },\n            createValueAxis: function () {\n                var tracker = this.valueAxisRangeTracker;\n                var defaultRange = tracker.query();\n                var axisOptions = this.valueAxisOptions({\n                    roundToMajorUnit: false,\n                    zIndex: -1\n                });\n                var axisType, axisDefaultRange;\n                if (axisOptions.type === LOGARITHMIC) {\n                    axisType = dataviz.RadarLogarithmicAxis;\n                    axisDefaultRange = {\n                        min: 0.1,\n                        max: 1\n                    };\n                } else {\n                    axisType = dataviz.RadarNumericAxis;\n                    axisDefaultRange = {\n                        min: 0,\n                        max: 1\n                    };\n                }\n                var range = tracker.query(name) || defaultRange || axisDefaultRange;\n                if (range && defaultRange) {\n                    range.min = Math.min(range.min, defaultRange.min);\n                    range.max = Math.max(range.max, defaultRange.max);\n                }\n                var valueAxis = new axisType(range.min, range.max, axisOptions, this.chartService);\n                this.valueAxis = valueAxis;\n                this.appendAxis(valueAxis);\n            },\n            reflowAxes: function () {\n                var ref = this;\n                var options = ref.options.plotArea;\n                var valueAxis = ref.valueAxis;\n                var polarAxis = ref.polarAxis;\n                var box = ref.box;\n                var defaultPadding = Math.min(box.width(), box.height()) * DEFAULT_PADDING;\n                var padding = getSpacing(options.padding || {}, defaultPadding);\n                var paddingBox = box.clone().unpad(padding);\n                var axisBox = paddingBox.clone();\n                axisBox.y2 = axisBox.y1 + Math.min(axisBox.width(), axisBox.height());\n                axisBox.align(paddingBox, Y, CENTER);\n                var valueAxisBox = axisBox.clone().shrink(0, axisBox.height() / 2);\n                polarAxis.reflow(axisBox);\n                valueAxis.reflow(valueAxisBox);\n                var heightDiff = valueAxis.lineBox().height() - valueAxis.box.height();\n                valueAxis.reflow(valueAxis.box.unpad({ top: heightDiff }));\n                this.axisBox = axisBox;\n                this.alignAxes(axisBox);\n            },\n            backgroundBox: function () {\n                return this.box;\n            },\n            detachLabels: function () {\n            }\n        });\n        var PolarScatterChart = ScatterChart.extend({\n            pointSlot: function (slotX, slotY) {\n                var valueRadius = slotX.center.y - slotY.y1;\n                var slot = Point.onCircle(slotX.center, slotX.startAngle, valueRadius);\n                return new Box(slot.x, slot.y, slot.x, slot.y);\n            }\n        });\n        setDefaultOptions(PolarScatterChart, { clip: false });\n        var PolarLineChart = ScatterLineChart.extend({});\n        PolarLineChart.prototype.pointSlot = PolarScatterChart.prototype.pointSlot;\n        setDefaultOptions(PolarLineChart, { clip: false });\n        var SplinePolarAreaSegment = SplineAreaSegment.extend({\n            fillToAxes: function (fillPath) {\n                var center = this._polarAxisCenter();\n                fillPath.lineTo(center.x, center.y);\n            },\n            _polarAxisCenter: function () {\n                var polarAxis = this.parent.plotArea.polarAxis;\n                var center = polarAxis.box.center();\n                return center;\n            },\n            strokeSegments: function () {\n                var segments = this._strokeSegments;\n                if (!segments) {\n                    var center = this._polarAxisCenter();\n                    var curveProcessor = new CurveProcessor(false);\n                    var linePoints = this.points();\n                    linePoints.push(center);\n                    segments = this._strokeSegments = curveProcessor.process(linePoints);\n                    segments.pop();\n                }\n                return segments;\n            }\n        });\n        var PolarAreaSegment = AreaSegment.extend({\n            fillToAxes: function (fillPath) {\n                var polarAxis = this.parent.plotArea.polarAxis;\n                var center = polarAxis.box.center();\n                var centerSegment = new geometry.Segment([\n                    center.x,\n                    center.y\n                ]);\n                fillPath.segments.unshift(centerSegment);\n                fillPath.segments.push(centerSegment);\n            }\n        });\n        var PolarAreaChart = PolarLineChart.extend({\n            createSegment: function (linePoints, currentSeries, seriesIx) {\n                var style = (currentSeries.line || {}).style;\n                var segment;\n                if (style === SMOOTH) {\n                    segment = new SplinePolarAreaSegment(linePoints, currentSeries, seriesIx);\n                } else {\n                    segment = new PolarAreaSegment(linePoints, currentSeries, seriesIx);\n                }\n                return segment;\n            },\n            createMissingValue: function (value, missingValues) {\n                var missingValue;\n                if (hasValue(value.x) && missingValues !== INTERPOLATE) {\n                    missingValue = {\n                        x: value.x,\n                        y: value.y\n                    };\n                    if (missingValues === ZERO) {\n                        missingValue.y = 0;\n                    }\n                }\n                return missingValue;\n            },\n            seriesMissingValues: function (series) {\n                return series.missingValues || ZERO;\n            },\n            _hasMissingValuesGap: function () {\n                var this$1 = this;\n                var series = this.options.series;\n                for (var idx = 0; idx < series.length; idx++) {\n                    if (this$1.seriesMissingValues(series[idx]) === GAP) {\n                        return true;\n                    }\n                }\n            },\n            sortPoints: function (points) {\n                var this$1 = this;\n                points.sort(xComparer);\n                if (this._hasMissingValuesGap()) {\n                    for (var idx = 0; idx < points.length; idx++) {\n                        var point = points[idx];\n                        if (point) {\n                            var value = point.value;\n                            if (!hasValue(value.y) && this$1.seriesMissingValues(point.series) === GAP) {\n                                delete points[idx];\n                            }\n                        }\n                    }\n                }\n                return points;\n            }\n        });\n        function xComparer(a, b) {\n            return a.value.x - b.value.x;\n        }\n        var PolarPlotArea = PolarPlotAreaBase.extend({\n            createPolarAxis: function () {\n                var polarAxis = new dataviz.PolarAxis(this.options.xAxis, this.chartService);\n                this.polarAxis = polarAxis;\n                this.axisX = polarAxis;\n                this.appendAxis(polarAxis);\n            },\n            valueAxisOptions: function (defaults) {\n                return deepExtend(defaults, {\n                    majorGridLines: { type: ARC },\n                    minorGridLines: { type: ARC }\n                }, this.options.yAxis);\n            },\n            createValueAxis: function () {\n                PolarPlotAreaBase.fn.createValueAxis.call(this);\n                this.axisY = this.valueAxis;\n            },\n            appendChart: function (chart, pane) {\n                this.valueAxisRangeTracker.update(chart.yAxisRanges);\n                PlotAreaBase.prototype.appendChart.call(this, chart, pane);\n            },\n            createCharts: function () {\n                var series = this.filterVisibleSeries(this.series);\n                var pane = this.panes[0];\n                this.createLineChart(filterSeriesByType(series, [POLAR_LINE]), pane);\n                this.createScatterChart(filterSeriesByType(series, [POLAR_SCATTER]), pane);\n                this.createAreaChart(filterSeriesByType(series, [POLAR_AREA]), pane);\n            },\n            createLineChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var lineChart = new PolarLineChart(this, { series: series });\n                this.appendChart(lineChart, pane);\n            },\n            createScatterChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var scatterChart = new PolarScatterChart(this, { series: series });\n                this.appendChart(scatterChart, pane);\n            },\n            createAreaChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var areaChart = new PolarAreaChart(this, { series: series });\n                this.appendChart(areaChart, pane);\n            },\n            _dispatchEvent: function (chart, e, eventType) {\n                var coords = chart._eventCoordinates(e);\n                var point = new Point(coords.x, coords.y);\n                var xValue = this.axisX.getValue(point);\n                var yValue = this.axisY.getValue(point);\n                if (xValue !== null && yValue !== null) {\n                    chart.trigger(eventType, {\n                        element: eventElement(e),\n                        x: xValue,\n                        y: yValue\n                    });\n                }\n            },\n            createCrosshairs: function () {\n            }\n        });\n        setDefaultOptions(PolarPlotArea, {\n            xAxis: {},\n            yAxis: {}\n        });\n        deepExtend(PolarPlotArea.prototype, PlotAreaEventsMixin);\n        var RadarLineChart = LineChart.extend({\n            pointSlot: function (categorySlot, valueSlot) {\n                var valueRadius = categorySlot.center.y - valueSlot.y1;\n                var slot = Point.onCircle(categorySlot.center, categorySlot.middle(), valueRadius);\n                return new Box(slot.x, slot.y, slot.x, slot.y);\n            },\n            createSegment: function (linePoints, currentSeries, seriesIx) {\n                var style = currentSeries.style;\n                var pointType;\n                if (style === SMOOTH) {\n                    pointType = SplineSegment;\n                } else {\n                    pointType = LineSegment;\n                }\n                var segment = new pointType(linePoints, currentSeries, seriesIx);\n                if (linePoints.length === currentSeries.data.length) {\n                    segment.options.closed = true;\n                }\n                return segment;\n            }\n        });\n        setDefaultOptions(RadarLineChart, {\n            clip: false,\n            limitPoints: false\n        });\n        var SplineRadarAreaSegment = SplineAreaSegment.extend({\n            fillToAxes: function () {\n            }\n        });\n        var RadarAreaSegment = AreaSegment.extend({\n            fillToAxes: function () {\n            }\n        });\n        var RadarAreaChart = RadarLineChart.extend({\n            createSegment: function (linePoints, currentSeries, seriesIx, prevSegment) {\n                var isStacked = this.options.isStacked;\n                var style = (currentSeries.line || {}).style;\n                var previousSegment;\n                var stackPoints;\n                var segment;\n                if (isStacked && seriesIx > 0 && prevSegment) {\n                    stackPoints = prevSegment.linePoints.slice(0);\n                    previousSegment = prevSegment;\n                }\n                if (style === SMOOTH) {\n                    segment = new SplineRadarAreaSegment(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n                    segment.options.closed = true;\n                } else {\n                    linePoints.push(linePoints[0]);\n                    segment = new RadarAreaSegment(linePoints, currentSeries, seriesIx, previousSegment, stackPoints);\n                }\n                return segment;\n            },\n            seriesMissingValues: function (series) {\n                return series.missingValues || ZERO;\n            }\n        });\n        var RadarSegment = DonutSegment.extend({\n            init: function (value, options) {\n                DonutSegment.fn.init.call(this, value, null, options);\n            }\n        });\n        setDefaultOptions(RadarSegment, {\n            overlay: { gradient: 'none' },\n            labels: { distance: 10 }\n        });\n        var RadarClusterLayout = ChartElement.extend({\n            init: function (options) {\n                ChartElement.fn.init.call(this, options);\n                this.forEach = options.rtl ? forEachReverse : forEach;\n            },\n            reflow: function (sector) {\n                var ref = this;\n                var options = ref.options;\n                var children = ref.children;\n                var gap = options.gap;\n                var spacing = options.spacing;\n                var count = children.length;\n                var slots = count + gap + spacing * (count - 1);\n                var slotAngle = sector.angle / slots;\n                var angle = sector.startAngle + slotAngle * (gap / 2);\n                this.forEach(children, function (child) {\n                    var slotSector = sector.clone();\n                    slotSector.startAngle = angle;\n                    slotSector.angle = slotAngle;\n                    if (child.sector) {\n                        slotSector.radius = child.sector.radius;\n                    }\n                    child.reflow(slotSector);\n                    child.sector = slotSector;\n                    angle += slotAngle + slotAngle * spacing;\n                });\n            }\n        });\n        setDefaultOptions(RadarClusterLayout, {\n            gap: 1,\n            spacing: 0\n        });\n        var RadarStackLayout = ChartElement.extend({\n            reflow: function (sector) {\n                var ref = this;\n                var reverse = ref.options.reverse;\n                var children = ref.children;\n                var childrenCount = children.length;\n                var first = reverse ? childrenCount - 1 : 0;\n                var step = reverse ? -1 : 1;\n                this.box = new Box();\n                for (var i = first; i >= 0 && i < childrenCount; i += step) {\n                    var childSector = children[i].sector;\n                    childSector.startAngle = sector.startAngle;\n                    childSector.angle = sector.angle;\n                }\n            }\n        });\n        var RadarBarChart = BarChart.extend({\n            pointType: function () {\n                return RadarSegment;\n            },\n            clusterType: function () {\n                return RadarClusterLayout;\n            },\n            stackType: function () {\n                return RadarStackLayout;\n            },\n            categorySlot: function (categoryAxis, categoryIx) {\n                return categoryAxis.getSlot(categoryIx);\n            },\n            pointSlot: function (categorySlot, valueSlot) {\n                var slot = categorySlot.clone();\n                var y = categorySlot.center.y;\n                slot.radius = y - valueSlot.y1;\n                slot.innerRadius = y - valueSlot.y2;\n                return slot;\n            },\n            reflowPoint: function (point, pointSlot) {\n                point.sector = pointSlot;\n                point.reflow();\n            },\n            createAnimation: function () {\n                this.options.animation.center = this.box.toRect().center();\n                BarChart.fn.createAnimation.call(this);\n            }\n        });\n        RadarBarChart.prototype.reflow = CategoricalChart.prototype.reflow;\n        setDefaultOptions(RadarBarChart, {\n            clip: false,\n            limitPoints: false,\n            animation: { type: 'pie' }\n        });\n        var RadarPlotArea = PolarPlotAreaBase.extend({\n            createPolarAxis: function () {\n                var categoryAxis = new dataviz.RadarCategoryAxis(this.options.categoryAxis, this.chartService);\n                this.polarAxis = categoryAxis;\n                this.categoryAxis = categoryAxis;\n                this.appendAxis(categoryAxis);\n                this.aggregateCategories();\n                this.createCategoryAxesLabels();\n            },\n            valueAxisOptions: function (defaults) {\n                if (this._hasBarCharts) {\n                    deepExtend(defaults, {\n                        majorGridLines: { type: ARC },\n                        minorGridLines: { type: ARC }\n                    });\n                }\n                if (this._isStacked100) {\n                    deepExtend(defaults, {\n                        roundToMajorUnit: false,\n                        labels: { format: 'P0' }\n                    });\n                }\n                return deepExtend(defaults, this.options.valueAxis);\n            },\n            aggregateCategories: function () {\n                CategoricalPlotArea.prototype.aggregateCategories.call(this, this.panes);\n            },\n            createCategoryAxesLabels: function () {\n                CategoricalPlotArea.prototype.createCategoryAxesLabels.call(this, this.panes);\n            },\n            filterSeries: function (currentSeries) {\n                return currentSeries;\n            },\n            createCharts: function () {\n                var series = this.filterVisibleSeries(this.series);\n                var pane = this.panes[0];\n                this.createAreaChart(filterSeriesByType(series, [RADAR_AREA]), pane);\n                this.createLineChart(filterSeriesByType(series, [RADAR_LINE]), pane);\n                this.createBarChart(filterSeriesByType(series, [RADAR_COLUMN]), pane);\n            },\n            chartOptions: function (series) {\n                var options = { series: series };\n                var firstSeries = series[0];\n                if (firstSeries) {\n                    var filteredSeries = this.filterVisibleSeries(series);\n                    var stack = firstSeries.stack;\n                    options.isStacked = stack && filteredSeries.length > 1;\n                    options.isStacked100 = stack && stack.type === '100%' && filteredSeries.length > 1;\n                    if (options.isStacked100) {\n                        this._isStacked100 = true;\n                    }\n                }\n                return options;\n            },\n            createAreaChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var areaChart = new RadarAreaChart(this, this.chartOptions(series));\n                this.appendChart(areaChart, pane);\n            },\n            createLineChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var lineChart = new RadarLineChart(this, this.chartOptions(series));\n                this.appendChart(lineChart, pane);\n            },\n            createBarChart: function (series, pane) {\n                if (series.length === 0) {\n                    return;\n                }\n                var firstSeries = series[0];\n                var options = this.chartOptions(series);\n                options.gap = firstSeries.gap;\n                options.spacing = firstSeries.spacing;\n                var barChart = new RadarBarChart(this, options);\n                this.appendChart(barChart, pane);\n                this._hasBarCharts = true;\n            },\n            seriesCategoryAxis: function () {\n                return this.categoryAxis;\n            },\n            _dispatchEvent: function (chart, e, eventType) {\n                var coords = chart._eventCoordinates(e);\n                var point = new Point(coords.x, coords.y);\n                var category = this.categoryAxis.getCategory(point);\n                var value = this.valueAxis.getValue(point);\n                if (category !== null && value !== null) {\n                    chart.trigger(eventType, {\n                        element: eventElement(e),\n                        category: category,\n                        value: value\n                    });\n                }\n            },\n            createCrosshairs: function () {\n            }\n        });\n        deepExtend(RadarPlotArea.prototype, PlotAreaEventsMixin, {\n            appendChart: CategoricalPlotArea.prototype.appendChart,\n            aggregateSeries: CategoricalPlotArea.prototype.aggregateSeries,\n            seriesSourcePoints: CategoricalPlotArea.prototype.seriesSourcePoints\n        });\n        setDefaultOptions(RadarPlotArea, {\n            categoryAxis: { categories: [] },\n            valueAxis: {}\n        });\n        var FunnelSegment = ChartElement.extend({\n            init: function (value, options, segmentOptions) {\n                ChartElement.fn.init.call(this, options);\n                this.value = value;\n                this.options.index = segmentOptions.index;\n            },\n            reflow: function (chartBox) {\n                var points = this.points;\n                var label = this.children[0];\n                this.box = new Box(points[0].x, points[0].y, points[1].x, points[2].y);\n                if (label) {\n                    label.reflow(new Box(chartBox.x1, points[0].y, chartBox.x2, points[2].y));\n                }\n            },\n            createVisual: function () {\n                var this$1 = this;\n                var options = this.options;\n                var visual;\n                ChartElement.fn.createVisual.call(this);\n                if (options.visual) {\n                    visual = options.visual({\n                        category: this.category,\n                        dataItem: this.dataItem,\n                        value: this.value,\n                        series: this.series,\n                        percentage: this.percentage,\n                        points: this.points,\n                        options: options,\n                        sender: this.getSender(),\n                        createVisual: function () {\n                            return this$1.createPath();\n                        }\n                    });\n                } else {\n                    visual = this.createPath();\n                }\n                if (visual) {\n                    this.visual.append(visual);\n                }\n            },\n            createPath: function () {\n                var options = this.options;\n                var border = options.border;\n                var path = Path.fromPoints(this.points, {\n                    fill: {\n                        color: options.color,\n                        opacity: options.opacity\n                    },\n                    stroke: {\n                        color: border.color,\n                        opacity: border.opacity,\n                        width: border.width\n                    }\n                }).close();\n                return path;\n            },\n            createHighlight: function (style) {\n                return Path.fromPoints(this.points, style);\n            },\n            highlightVisual: function () {\n                return this.visual.children[0];\n            },\n            highlightVisualArgs: function () {\n                var path = Path.fromPoints(this.points).close();\n                return {\n                    options: this.options,\n                    path: path\n                };\n            },\n            tooltipAnchor: function () {\n                var box = this.box;\n                return {\n                    point: new Point(box.center().x, box.y1),\n                    align: {\n                        horizontal: 'center',\n                        vertical: 'top'\n                    }\n                };\n            },\n            formatValue: function (format) {\n                var point = this;\n                return point.owner.formatPointValue(point, format);\n            }\n        });\n        setDefaultOptions(FunnelSegment, {\n            color: WHITE,\n            border: { width: 1 }\n        });\n        deepExtend(FunnelSegment.prototype, PointEventsMixin);\n        var FunnelChart = ChartElement.extend({\n            init: function (plotArea, options) {\n                ChartElement.fn.init.call(this, options);\n                this.plotArea = plotArea;\n                this.points = [];\n                this.labels = [];\n                this.legendItems = [];\n                this.render();\n            },\n            formatPointValue: function (point, format) {\n                return this.chartService.format.auto(format, point.value);\n            },\n            render: function () {\n                var this$1 = this;\n                var ref = this;\n                var options = ref.options;\n                var seriesColors = ref.plotArea.options.seriesColors;\n                if (seriesColors === void 0) {\n                    seriesColors = [];\n                }\n                var series = options.series[0];\n                var data = series.data;\n                if (!data) {\n                    return;\n                }\n                var ref$1 = bindSegments(series);\n                var total = ref$1.total;\n                var points = ref$1.points;\n                for (var i = 0; i < points.length; i++) {\n                    var pointData = points[i];\n                    if (!pointData) {\n                        continue;\n                    }\n                    var fields = pointData.fields;\n                    if (!isFunction(series.color)) {\n                        series.color = fields.color || seriesColors[i % seriesColors.length];\n                    }\n                    fields = deepExtend({\n                        index: i,\n                        owner: this$1,\n                        series: series,\n                        dataItem: data[i],\n                        percentage: pointData.value / total\n                    }, fields, { visible: pointData.visible });\n                    var value = pointData.valueFields.value;\n                    var segment = this$1.createSegment(value, fields);\n                    var label = this$1.createLabel(value, fields);\n                    if (segment && label) {\n                        segment.append(label);\n                    }\n                }\n            },\n            evalSegmentOptions: function (options, value, fields) {\n                var series = fields.series;\n                evalOptions(options, {\n                    value: value,\n                    series: series,\n                    dataItem: fields.dataItem,\n                    index: fields.index\n                }, {\n                    defaults: series._defaults,\n                    excluded: [\n                        'data',\n                        'content',\n                        'template',\n                        'toggle',\n                        'visual'\n                    ]\n                });\n            },\n            createSegment: function (value, fields) {\n                var seriesOptions = deepExtend({}, fields.series);\n                this.evalSegmentOptions(seriesOptions, value, fields);\n                this.createLegendItem(value, seriesOptions, fields);\n                if (fields.visible !== false) {\n                    var segment = new FunnelSegment(value, seriesOptions, fields);\n                    $.extend(segment, fields);\n                    this.append(segment);\n                    this.points.push(segment);\n                    return segment;\n                }\n            },\n            createLabel: function (value, fields) {\n                var series = fields.series;\n                var dataItem = fields.dataItem;\n                var labels = deepExtend({}, this.options.labels, series.labels);\n                var text = value;\n                if (labels.visible) {\n                    var labelTemplate = getTemplate(labels);\n                    var data = {\n                        dataItem: dataItem,\n                        value: value,\n                        percentage: fields.percentage,\n                        category: fields.category,\n                        series: series\n                    };\n                    if (labelTemplate) {\n                        text = labelTemplate(data);\n                    } else if (labels.format) {\n                        text = this.plotArea.chartService.format.auto(labels.format, text);\n                    }\n                    if (!labels.color) {\n                        var brightnessValue = new Color(series.color).percBrightness();\n                        if (brightnessValue > 180) {\n                            labels.color = BLACK;\n                        } else {\n                            labels.color = WHITE;\n                        }\n                        if (!labels.background) {\n                            labels.background = series.color;\n                        }\n                    }\n                    this.evalSegmentOptions(labels, value, fields);\n                    var textBox = new TextBox(text, deepExtend({ vAlign: labels.position }, labels), data);\n                    this.labels.push(textBox);\n                    return textBox;\n                }\n            },\n            labelPadding: function () {\n                var labels = this.labels;\n                var padding = {\n                    left: 0,\n                    right: 0\n                };\n                for (var i = 0; i < labels.length; i++) {\n                    var label = labels[i];\n                    var align = label.options.align;\n                    if (align !== CENTER) {\n                        var width = labels[i].box.width();\n                        if (align === LEFT) {\n                            padding.left = Math.max(padding.left, width);\n                        } else {\n                            padding.right = Math.max(padding.right, width);\n                        }\n                    }\n                }\n                return padding;\n            },\n            dynamicSlopeReflow: function (box, width, totalHeight) {\n                var ref = this;\n                var options = ref.options;\n                var segments = ref.points;\n                var count = segments.length;\n                var firstSegment = segments[0];\n                var maxSegment = firstSegment;\n                for (var idx = 0; idx < segments.length; idx++) {\n                    if (segments[idx].percentage > maxSegment.percentage) {\n                        maxSegment = segments[idx];\n                    }\n                }\n                var lastUpperSide = firstSegment.percentage / maxSegment.percentage * width;\n                var previousOffset = (width - lastUpperSide) / 2;\n                var previousHeight = 0;\n                for (var idx$1 = 0; idx$1 < count; idx$1++) {\n                    var percentage = segments[idx$1].percentage;\n                    var nextSegment = segments[idx$1 + 1];\n                    var nextPercentage = nextSegment ? nextSegment.percentage : percentage;\n                    var points = segments[idx$1].points = [];\n                    var height = options.dynamicHeight ? totalHeight * percentage : totalHeight / count;\n                    var offset = void 0;\n                    if (!percentage) {\n                        offset = nextPercentage ? 0 : width / 2;\n                    } else {\n                        offset = (width - lastUpperSide * (nextPercentage / percentage)) / 2;\n                    }\n                    offset = limitValue(offset, 0, width);\n                    points.push(new GeometryPoint(box.x1 + previousOffset, box.y1 + previousHeight));\n                    points.push(new GeometryPoint(box.x1 + width - previousOffset, box.y1 + previousHeight));\n                    points.push(new GeometryPoint(box.x1 + width - offset, box.y1 + height + previousHeight));\n                    points.push(new GeometryPoint(box.x1 + offset, box.y1 + height + previousHeight));\n                    previousOffset = offset;\n                    previousHeight += height + options.segmentSpacing;\n                    lastUpperSide = limitValue(width - 2 * offset, 0, width);\n                }\n            },\n            constantSlopeReflow: function (box, width, totalHeight) {\n                var ref = this;\n                var options = ref.options;\n                var segments = ref.points;\n                var count = segments.length;\n                var decreasingWidth = options.neckRatio <= 1;\n                var neckRatio = decreasingWidth ? options.neckRatio * width : width;\n                var previousOffset = decreasingWidth ? 0 : (width - width / options.neckRatio) / 2;\n                var topMostWidth = decreasingWidth ? width : width - previousOffset * 2;\n                var finalNarrow = (topMostWidth - neckRatio) / 2;\n                var previousHeight = 0;\n                for (var idx = 0; idx < count; idx++) {\n                    var points = segments[idx].points = [];\n                    var percentage = segments[idx].percentage;\n                    var offset = options.dynamicHeight ? finalNarrow * percentage : finalNarrow / count;\n                    var height = options.dynamicHeight ? totalHeight * percentage : totalHeight / count;\n                    points.push(new GeometryPoint(box.x1 + previousOffset, box.y1 + previousHeight));\n                    points.push(new GeometryPoint(box.x1 + width - previousOffset, box.y1 + previousHeight));\n                    points.push(new GeometryPoint(box.x1 + width - previousOffset - offset, box.y1 + height + previousHeight));\n                    points.push(new GeometryPoint(box.x1 + previousOffset + offset, box.y1 + height + previousHeight));\n                    previousOffset += offset;\n                    previousHeight += height + options.segmentSpacing;\n                }\n            },\n            reflow: function (chartBox) {\n                var points = this.points;\n                var count = points.length;\n                if (!count) {\n                    return;\n                }\n                var options = this.options;\n                var box = chartBox.clone().unpad(this.labelPadding());\n                var totalHeight = box.height() - options.segmentSpacing * (count - 1);\n                var width = box.width();\n                if (options.dynamicSlope) {\n                    this.dynamicSlopeReflow(box, width, totalHeight);\n                } else {\n                    this.constantSlopeReflow(box, width, totalHeight);\n                }\n                for (var idx = 0; idx < count; idx++) {\n                    points[idx].reflow(chartBox);\n                }\n            }\n        });\n        setDefaultOptions(FunnelChart, {\n            neckRatio: 0.3,\n            width: 300,\n            dynamicSlope: false,\n            dynamicHeight: true,\n            segmentSpacing: 0,\n            labels: {\n                visible: false,\n                align: CENTER,\n                position: CENTER,\n                zIndex: 1\n            }\n        });\n        deepExtend(FunnelChart.prototype, PieChartMixin);\n        var FunnelPlotArea = PlotAreaBase.extend({\n            render: function () {\n                this.createFunnelChart(this.series);\n            },\n            createFunnelChart: function (series) {\n                var firstSeries = series[0];\n                var funnelChart = new FunnelChart(this, {\n                    series: series,\n                    legend: this.options.legend,\n                    neckRatio: firstSeries.neckRatio,\n                    dynamicHeight: firstSeries.dynamicHeight,\n                    dynamicSlope: firstSeries.dynamicSlope,\n                    segmentSpacing: firstSeries.segmentSpacing,\n                    highlight: firstSeries.highlight\n                });\n                this.appendChart(funnelChart);\n            },\n            appendChart: function (chart, pane) {\n                PlotAreaBase.fn.appendChart.call(this, chart, pane);\n                append(this.options.legend.items, chart.legendItems);\n            }\n        });\n        var COLOR = 'color';\n        var FIRST = 'first';\n        var FROM = 'from';\n        var MAX = 'max';\n        var MIN = 'min';\n        var NOTE_TEXT = 'noteText';\n        var SUMMARY_FIELD = 'summary';\n        var TO = 'to';\n        PlotAreaFactory.current.register(CategoricalPlotArea, [\n            BAR,\n            COLUMN,\n            LINE,\n            VERTICAL_LINE,\n            AREA,\n            VERTICAL_AREA,\n            CANDLESTICK,\n            OHLC,\n            BULLET,\n            VERTICAL_BULLET,\n            BOX_PLOT,\n            VERTICAL_BOX_PLOT,\n            RANGE_COLUMN,\n            RANGE_BAR,\n            WATERFALL,\n            HORIZONTAL_WATERFALL,\n            RANGE_AREA,\n            VERTICAL_RANGE_AREA\n        ]);\n        PlotAreaFactory.current.register(XYPlotArea, [\n            SCATTER,\n            SCATTER_LINE,\n            BUBBLE\n        ]);\n        PlotAreaFactory.current.register(PiePlotArea, [PIE]);\n        PlotAreaFactory.current.register(DonutPlotArea, [DONUT]);\n        PlotAreaFactory.current.register(FunnelPlotArea, [FUNNEL]);\n        PlotAreaFactory.current.register(PolarPlotArea, [\n            POLAR_AREA,\n            POLAR_LINE,\n            POLAR_SCATTER\n        ]);\n        PlotAreaFactory.current.register(RadarPlotArea, [\n            RADAR_AREA,\n            RADAR_COLUMN,\n            RADAR_LINE\n        ]);\n        SeriesBinder.current.register([\n            BAR,\n            COLUMN,\n            LINE,\n            VERTICAL_LINE,\n            AREA,\n            VERTICAL_AREA\n        ], [VALUE], [\n            CATEGORY,\n            COLOR,\n            NOTE_TEXT,\n            ERROR_LOW_FIELD,\n            ERROR_HIGH_FIELD\n        ]);\n        SeriesBinder.current.register([\n            RANGE_COLUMN,\n            RANGE_BAR,\n            RANGE_AREA,\n            VERTICAL_RANGE_AREA\n        ], [\n            FROM,\n            TO\n        ], [\n            CATEGORY,\n            COLOR,\n            NOTE_TEXT\n        ]);\n        SeriesBinder.current.register([\n            WATERFALL,\n            HORIZONTAL_WATERFALL\n        ], [VALUE], [\n            CATEGORY,\n            COLOR,\n            NOTE_TEXT,\n            SUMMARY_FIELD\n        ]);\n        SeriesBinder.current.register([\n            POLAR_AREA,\n            POLAR_LINE,\n            POLAR_SCATTER\n        ], [\n            X,\n            Y\n        ], [COLOR]);\n        SeriesBinder.current.register([\n            RADAR_AREA,\n            RADAR_COLUMN,\n            RADAR_LINE\n        ], [VALUE], [COLOR]);\n        SeriesBinder.current.register([FUNNEL], [VALUE], [\n            CATEGORY,\n            COLOR,\n            'visibleInLegend',\n            'visible'\n        ]);\n        DefaultAggregates.current.register([\n            BAR,\n            COLUMN,\n            LINE,\n            VERTICAL_LINE,\n            AREA,\n            VERTICAL_AREA,\n            WATERFALL,\n            HORIZONTAL_WATERFALL\n        ], {\n            value: MAX,\n            color: FIRST,\n            noteText: FIRST,\n            errorLow: MIN,\n            errorHigh: MAX\n        });\n        DefaultAggregates.current.register([\n            RANGE_COLUMN,\n            RANGE_BAR,\n            RANGE_AREA,\n            VERTICAL_RANGE_AREA\n        ], {\n            from: MIN,\n            to: MAX,\n            color: FIRST,\n            noteText: FIRST\n        });\n        DefaultAggregates.current.register([\n            RADAR_AREA,\n            RADAR_COLUMN,\n            RADAR_LINE\n        ], {\n            value: MAX,\n            color: FIRST\n        });\n        SeriesBinder.current.register([\n            SCATTER,\n            SCATTER_LINE,\n            BUBBLE\n        ], [\n            X,\n            Y\n        ], [\n            COLOR,\n            NOTE_TEXT,\n            X_ERROR_LOW_FIELD,\n            X_ERROR_HIGH_FIELD,\n            Y_ERROR_LOW_FIELD,\n            Y_ERROR_HIGH_FIELD\n        ]);\n        SeriesBinder.current.register([BUBBLE], [\n            X,\n            Y,\n            'size'\n        ], [\n            COLOR,\n            CATEGORY,\n            NOTE_TEXT\n        ]);\n        SeriesBinder.current.register([\n            CANDLESTICK,\n            OHLC\n        ], [\n            'open',\n            'high',\n            'low',\n            'close'\n        ], [\n            CATEGORY,\n            COLOR,\n            'downColor',\n            NOTE_TEXT\n        ]);\n        DefaultAggregates.current.register([\n            CANDLESTICK,\n            OHLC\n        ], {\n            open: MAX,\n            high: MAX,\n            low: MIN,\n            close: MAX,\n            color: FIRST,\n            downColor: FIRST,\n            noteText: FIRST\n        });\n        SeriesBinder.current.register([\n            BOX_PLOT,\n            VERTICAL_BOX_PLOT\n        ], [\n            'lower',\n            'q1',\n            'median',\n            'q3',\n            'upper',\n            'mean',\n            'outliers'\n        ], [\n            CATEGORY,\n            COLOR,\n            NOTE_TEXT\n        ]);\n        DefaultAggregates.current.register([\n            BOX_PLOT,\n            VERTICAL_BOX_PLOT\n        ], {\n            lower: MAX,\n            q1: MAX,\n            median: MAX,\n            q3: MAX,\n            upper: MAX,\n            mean: MAX,\n            outliers: FIRST,\n            color: FIRST,\n            noteText: FIRST\n        });\n        SeriesBinder.current.register([\n            BULLET,\n            VERTICAL_BULLET\n        ], [\n            'current',\n            'target'\n        ], [\n            CATEGORY,\n            COLOR,\n            'visibleInLegend',\n            NOTE_TEXT\n        ]);\n        DefaultAggregates.current.register([\n            BULLET,\n            VERTICAL_BULLET\n        ], {\n            current: MAX,\n            target: MAX,\n            color: FIRST,\n            noteText: FIRST\n        });\n        SeriesBinder.current.register([\n            PIE,\n            DONUT\n        ], [VALUE], [\n            CATEGORY,\n            COLOR,\n            'explode',\n            'visibleInLegend',\n            'visible'\n        ]);\n        var AXIS_NAMES = [\n            CATEGORY,\n            VALUE,\n            X,\n            Y\n        ];\n        var MOUSEMOVE = 'mousemove';\n        var CONTEXTMENU = 'contextmenu';\n        var MOUSELEAVE = 'mouseleave';\n        var MOUSEMOVE_DELAY = 20;\n        var Chart = Class.extend({\n            init: function (element, userOptions, themeOptions, context) {\n                var this$1 = this;\n                if (context === void 0) {\n                    context = {};\n                }\n                this.observers = [];\n                this.addObserver(context.observer);\n                this.chartService = new services.ChartService(this, context);\n                this.chartService.theme = themeOptions;\n                this._initElement(element);\n                var options = deepExtend({}, this.options, userOptions);\n                this._originalOptions = deepExtend({}, options);\n                this._theme = themeOptions;\n                this._initTheme(options, themeOptions);\n                this._initHandlers();\n                this._initSurface();\n                this.bindCategories();\n                dataviz.FontLoader.preloadFonts(userOptions, function () {\n                    this$1.fontLoaded = true;\n                    if (!this$1._destroyed) {\n                        this$1.trigger('init');\n                        this$1._redraw();\n                        this$1._attachEvents();\n                    }\n                });\n            },\n            _initElement: function (element) {\n                this._setElementClass(element);\n                element.style.position = 'relative';\n                while (element.firstChild) {\n                    element.removeChild(element.firstChild);\n                }\n                this.element = element;\n            },\n            _setElementClass: function (element) {\n                dataviz.addClass(element, 'k-chart');\n            },\n            _initTheme: function (options, themeOptions) {\n                var seriesCopies = [];\n                var series = options.series || [];\n                for (var i = 0; i < series.length; i++) {\n                    seriesCopies.push($.extend({}, series[i]));\n                }\n                options.series = seriesCopies;\n                resolveAxisAliases(options);\n                this.applyDefaults(options, themeOptions);\n                if (options.seriesColors === null) {\n                    delete options.seriesColors;\n                }\n                this.options = deepExtend({}, themeOptions, options);\n                this.applySeriesColors();\n            },\n            getSize: function () {\n                var chartArea = this.options.chartArea || {};\n                var width = chartArea.width ? parseInt(chartArea.width, 10) : Math.floor(this.element.offsetWidth);\n                var height = chartArea.height ? parseInt(chartArea.height, 10) : Math.floor(this.element.offsetHeight);\n                return {\n                    width: width,\n                    height: height\n                };\n            },\n            resize: function (force) {\n                var size = this.getSize();\n                var currentSize = this._size;\n                if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n                    this._size = size;\n                    this._resize(size, force);\n                    this.trigger('resize', size);\n                }\n            },\n            _resize: function () {\n                this._noTransitionsRedraw();\n            },\n            redraw: function (paneName) {\n                this.applyDefaults(this.options);\n                this.applySeriesColors();\n                if (paneName) {\n                    var plotArea = this._model._plotArea;\n                    var pane = plotArea.findPane(paneName);\n                    plotArea.redraw(pane);\n                } else {\n                    this._redraw();\n                }\n            },\n            getAxis: function (name) {\n                return findAxisByName(name, this._plotArea.axes);\n            },\n            findAxisByName: function (name) {\n                return this.getAxis(name);\n            },\n            findPaneByName: function (name) {\n                var panes = this._plotArea.panes;\n                for (var idx = 0; idx < panes.length; idx++) {\n                    if (panes[idx].options.name === name) {\n                        return new ChartPane(panes[idx]);\n                    }\n                }\n            },\n            findPaneByIndex: function (idx) {\n                var panes = this._plotArea.panes;\n                if (panes[idx]) {\n                    return new ChartPane(panes[idx]);\n                }\n            },\n            plotArea: function () {\n                return new ChartPlotArea(this._plotArea);\n            },\n            toggleHighlight: function (show, filter) {\n                var plotArea = this._plotArea;\n                var firstSeries = (plotArea.srcSeries || plotArea.series || [])[0];\n                var points;\n                if (isFunction(filter)) {\n                    points = plotArea.filterPoints(filter);\n                } else {\n                    var seriesName, categoryName;\n                    if (isObject(filter)) {\n                        seriesName = filter.series;\n                        categoryName = filter.category;\n                    } else {\n                        seriesName = categoryName = filter;\n                    }\n                    if (firstSeries.type === DONUT) {\n                        points = pointByCategoryName(plotArea.pointsBySeriesName(seriesName), categoryName);\n                    } else if (firstSeries.type === PIE || firstSeries.type === FUNNEL) {\n                        points = pointByCategoryName((plotArea.charts[0] || {}).points, categoryName);\n                    } else {\n                        points = plotArea.pointsBySeriesName(seriesName);\n                    }\n                }\n                if (points) {\n                    this.togglePointsHighlight(show, points);\n                }\n            },\n            togglePointsHighlight: function (show, points) {\n                var highlight = this._highlight;\n                for (var idx = 0; idx < points.length; idx++) {\n                    highlight.togglePointHighlight(points[idx], show);\n                }\n            },\n            showTooltip: function (filter) {\n                var shared = this._sharedTooltip();\n                var ref = this;\n                var tooltip = ref._tooltip;\n                var plotArea = ref._plotArea;\n                var point, categoryIndex;\n                if (isFunction(filter)) {\n                    point = plotArea.findPoint(filter);\n                    if (point && shared) {\n                        categoryIndex = point.categoryIx;\n                    }\n                } else if (shared && defined(filter)) {\n                    categoryIndex = plotArea.categoryAxis.categoryIndex(filter);\n                }\n                if (shared) {\n                    if (categoryIndex >= 0) {\n                        var points = this._plotArea.pointsByCategoryIndex(categoryIndex);\n                        tooltip.showAt(points);\n                    }\n                } else if (point) {\n                    tooltip.show(point);\n                }\n            },\n            hideTooltip: function () {\n                this._tooltip.hide();\n            },\n            _initSurface: function () {\n                var surface = this.surface;\n                var wrap = this._surfaceWrap();\n                var chartArea = this.options.chartArea;\n                if (chartArea.width) {\n                    dataviz.elementSize(wrap, { width: chartArea.width });\n                }\n                if (chartArea.height) {\n                    dataviz.elementSize(wrap, { height: chartArea.height });\n                }\n                if (!surface || surface.options.type !== this.options.renderAs) {\n                    this._destroySurface();\n                    this.surface = drawing.Surface.create(wrap, { type: this.options.renderAs });\n                    this.surface.bind('mouseenter', this._surfaceMouseenterHandler);\n                    this.surface.bind('mouseleave', this._surfaceMouseleaveHandler);\n                } else {\n                    this.surface.clear();\n                    this.surface.resize();\n                }\n            },\n            _surfaceWrap: function () {\n                return this.element;\n            },\n            _redraw: function () {\n                var model = this._getModel();\n                this._size = {\n                    width: model.options.width,\n                    height: model.options.height\n                };\n                this._destroyView();\n                this._model = model;\n                this._plotArea = model._plotArea;\n                model.renderVisual();\n                if (this.options.transitions !== false) {\n                    model.traverse(function (element) {\n                        if (element.animation) {\n                            element.animation.setup();\n                        }\n                    });\n                }\n                this._initSurface();\n                this.surface.draw(model.visual);\n                if (this.options.transitions !== false) {\n                    model.traverse(function (element) {\n                        if (element.animation) {\n                            element.animation.play();\n                        }\n                    });\n                }\n                this._tooltip = this._createTooltip();\n                this._highlight = new Highlight();\n                this._setupSelection();\n                this._createPannable();\n                this._createZoomSelection();\n                this._createMousewheelZoom();\n                this.trigger(RENDER);\n                triggerPaneRender(this._plotArea.panes);\n                if (!this._navState) {\n                    this._cancelDomEvents();\n                }\n            },\n            exportVisual: function (exportOptions) {\n                var visual;\n                if (exportOptions && (exportOptions.width || exportOptions.height || exportOptions.options)) {\n                    var currentOptions = this.options;\n                    var options = deepExtend({}, exportOptions.options, {\n                        chartArea: {\n                            width: exportOptions.width,\n                            height: exportOptions.height\n                        }\n                    });\n                    clearMissingValues(this._originalOptions, options);\n                    this.options = deepExtend({}, this._originalOptions, options);\n                    this._initTheme(this.options, this._theme);\n                    this.bindCategories();\n                    var model = this._getModel();\n                    model.renderVisual();\n                    triggerPaneRender(model._plotArea.panes);\n                    visual = model.visual;\n                    this.options = currentOptions;\n                } else {\n                    visual = this.surface.exportVisual();\n                }\n                return visual;\n            },\n            _sharedTooltip: function () {\n                return this._plotArea instanceof CategoricalPlotArea && this.options.tooltip.shared;\n            },\n            _createPannable: function () {\n                var options = this.options;\n                if (options.pannable !== false) {\n                    this._pannable = new Pannable(this._plotArea, options.pannable);\n                }\n            },\n            _createZoomSelection: function () {\n                var zoomable = this.options.zoomable;\n                var selection = (zoomable || {}).selection;\n                if (zoomable !== false && selection !== false) {\n                    this._zoomSelection = new ZoomSelection(this, selection);\n                }\n            },\n            _createMousewheelZoom: function () {\n                var zoomable = this.options.zoomable;\n                var mousewheel = (zoomable || {}).mousewheel;\n                if (zoomable !== false && mousewheel !== false) {\n                    this._mousewheelZoom = new MousewheelZoom(this, mousewheel);\n                }\n            },\n            _toggleDragZoomEvents: function () {\n                var pannable = this.options.pannable;\n                var zoomable = this.options.zoomable;\n                var selection = (zoomable || {}).selection;\n                var mousewheel = (zoomable || {}).mousewheel;\n                var allowDrag = !pannable && (zoomable === false || selection === false) && !this.requiresHandlers([\n                    DRAG_START,\n                    DRAG,\n                    DRAG_END\n                ]);\n                var allowZoom = (zoomable === false || mousewheel === false) && !this.requiresHandlers([\n                    ZOOM_START,\n                    ZOOM,\n                    ZOOM_END\n                ]);\n                var element = this.element;\n                if (this._dragZoomEnabled && allowDrag && allowZoom) {\n                    element.style.touchAction = this._touchAction || '';\n                    this._dragZoomEnabled = false;\n                } else if (!this._dragZoomEnabled && !(allowDrag && allowZoom)) {\n                    element.style.touchAction = 'none';\n                    this._dragZoomEnabled = true;\n                }\n                this._toggleDomEvents(!allowDrag, !allowZoom);\n            },\n            _toggleDomEvents: function (drag, zoom) {\n                var domEvents = this.domEvents;\n                if (!domEvents) {\n                    return;\n                }\n                if (domEvents.toggleDrag) {\n                    domEvents.toggleDrag(drag);\n                }\n                if (domEvents.toggleZoom) {\n                    domEvents.toggleZoom(zoom);\n                }\n            },\n            _createTooltip: function () {\n                var ref = this;\n                var tooltipOptions = ref.options.tooltip;\n                var tooltip;\n                if (this._sharedTooltip()) {\n                    tooltip = this._createSharedTooltip(tooltipOptions);\n                } else {\n                    tooltip = new Tooltip(this.chartService, tooltipOptions);\n                }\n                return tooltip;\n            },\n            _createSharedTooltip: function (options) {\n                return new SharedTooltip(this._plotArea, options);\n            },\n            applyDefaults: function (options, themeOptions) {\n                applyAxisDefaults(options, themeOptions);\n                applySeriesDefaults(options, themeOptions);\n            },\n            applySeriesColors: function () {\n                var options = this.options;\n                var series = options.series;\n                var colors = options.seriesColors || [];\n                for (var i = 0; i < series.length; i++) {\n                    var currentSeries = series[i];\n                    var seriesColor = colors[i % colors.length];\n                    var defaults = currentSeries._defaults;\n                    currentSeries.color = currentSeries.color || seriesColor;\n                    if (defaults) {\n                        defaults.color = defaults.color || seriesColor;\n                    }\n                }\n            },\n            _getModel: function () {\n                var options = this.options;\n                var plotArea = this._createPlotArea();\n                var model = new dataviz.RootElement(this._modelOptions());\n                model.chart = this;\n                model._plotArea = plotArea;\n                dataviz.Title.buildTitle(options.title, model);\n                if (options.legend.visible) {\n                    model.append(new Legend(plotArea.options.legend, this.chartService));\n                }\n                model.append(plotArea);\n                model.reflow();\n                return model;\n            },\n            _modelOptions: function () {\n                var options = this.options;\n                var size = this.getSize();\n                return deepExtend({\n                    transitions: options.transitions,\n                    width: size.width || datavizConstants.DEFAULT_WIDTH,\n                    height: size.height || datavizConstants.DEFAULT_HEIGHT\n                }, options.chartArea);\n            },\n            _createPlotArea: function (skipSeries) {\n                var options = this.options;\n                var plotArea = PlotAreaFactory.current.create(skipSeries ? [] : options.series, options, this.chartService);\n                return plotArea;\n            },\n            _setupSelection: function () {\n                var this$1 = this;\n                var ref = this;\n                var axes = ref._plotArea.axes;\n                var selections = this._selections = [];\n                for (var i = 0; i < axes.length; i++) {\n                    var axis = axes[i];\n                    var options = axis.options;\n                    if (axis instanceof CategoryAxis && options.select && !options.vertical) {\n                        var range = axis.range();\n                        var selection = new Selection(this$1, axis, deepExtend({\n                            min: range.min,\n                            max: range.max\n                        }, options.select));\n                        selections.push(selection);\n                    }\n                }\n            },\n            _selectStart: function (e) {\n                return this.trigger(SELECT_START, e);\n            },\n            _select: function (e) {\n                return this.trigger(SELECT, e);\n            },\n            _selectEnd: function (e) {\n                return this.trigger(SELECT_END, e);\n            },\n            _initHandlers: function () {\n                this._clickHandler = this._click.bind(this);\n                this._mousewheelHandler = this._mousewheel.bind(this);\n                this._mouseleaveHandler = this._mouseleave.bind(this);\n                this._surfaceMouseenterHandler = this._mouseover.bind(this);\n                this._surfaceMouseleaveHandler = this._mouseout.bind(this);\n                this._mousemove = kendo.throttle(this._mousemove.bind(this), MOUSEMOVE_DELAY);\n            },\n            addObserver: function (observer) {\n                if (observer) {\n                    this.observers.push(observer);\n                }\n            },\n            removeObserver: function (observer) {\n                var index = this.observers.indexOf(observer);\n                if (index >= 0) {\n                    this.observers.splice(index, 1);\n                }\n            },\n            requiresHandlers: function (eventNames) {\n                var observers = this.observers;\n                for (var idx = 0; idx < observers.length; idx++) {\n                    if (observers[idx].requiresHandlers(eventNames)) {\n                        return true;\n                    }\n                }\n            },\n            trigger: function (name, args) {\n                if (args === void 0) {\n                    args = {};\n                }\n                if (name === SHOW_TOOLTIP) {\n                    args.anchor.point = this._toDocumentCoordinates(args.anchor.point);\n                }\n                args.sender = this;\n                var observers = this.observers;\n                var isDefaultPrevented = false;\n                for (var idx = 0; idx < observers.length; idx++) {\n                    if (observers[idx].trigger(name, args)) {\n                        isDefaultPrevented = true;\n                    }\n                }\n                return isDefaultPrevented;\n            },\n            _attachEvents: function () {\n                var element = this.element;\n                this._touchAction = element.style.touchAction;\n                var obj;\n                bindEvents(element, (obj = {}, obj[CONTEXTMENU] = this._clickHandler, obj[MOUSEWHEEL] = this._mousewheelHandler, obj[MOUSELEAVE] = this._mouseleaveHandler, obj));\n                if (this._shouldAttachMouseMove()) {\n                    var obj$1;\n                    bindEvents(element, (obj$1 = {}, obj$1[MOUSEMOVE] = this._mousemove, obj$1));\n                }\n                this.domEvents = services.DomEventsBuilder.create(this.element, {\n                    start: this._start.bind(this),\n                    move: this._move.bind(this),\n                    end: this._end.bind(this),\n                    tap: this._tap.bind(this),\n                    gesturestart: this._gesturestart.bind(this),\n                    gesturechange: this._gesturechange.bind(this),\n                    gestureend: this._gestureend.bind(this)\n                });\n                this._toggleDragZoomEvents();\n            },\n            _mouseleave: function (e) {\n                if (this._hoveredPoint) {\n                    this._hoveredPoint.out(this, e);\n                    this._hoveredPoint = null;\n                }\n                if (this._plotArea.hovered) {\n                    this.trigger(PLOT_AREA_LEAVE);\n                    this._plotArea.hovered = false;\n                }\n            },\n            _cancelDomEvents: function () {\n                if (this.domEvents && this.domEvents.cancel) {\n                    this.domEvents.cancel();\n                }\n            },\n            _gesturestart: function (e) {\n                if (this._mousewheelZoom && !this._stopChartHandlers(e)) {\n                    this._gestureDistance = e.distance;\n                    this._unsetActivePoint();\n                    this.surface.suspendTracking();\n                }\n            },\n            _gestureend: function (e) {\n                if (this._zooming && !this._stopChartHandlers(e)) {\n                    if (this.surface) {\n                        this.surface.resumeTracking();\n                    }\n                    this._zooming = false;\n                    this.trigger(ZOOM_END, {});\n                }\n            },\n            _gesturechange: function (e) {\n                var mousewheelZoom = this._mousewheelZoom;\n                if (mousewheelZoom && !this._stopChartHandlers(e)) {\n                    e.preventDefault();\n                    var previousGestureDistance = this._gestureDistance;\n                    var scaleDelta = -e.distance / previousGestureDistance + 1;\n                    if (Math.abs(scaleDelta) >= 0.1) {\n                        scaleDelta = Math.round(scaleDelta * 10);\n                        this._gestureDistance = e.distance;\n                        var args = {\n                            delta: scaleDelta,\n                            axisRanges: axisRanges(this._plotArea.axes),\n                            originalEvent: e\n                        };\n                        if (this._zooming || !this.trigger(ZOOM_START, args)) {\n                            if (!this._zooming) {\n                                this._zooming = true;\n                            }\n                            var ranges = args.axisRanges = mousewheelZoom.updateRanges(scaleDelta);\n                            if (ranges && !this.trigger(ZOOM, args)) {\n                                mousewheelZoom.zoom();\n                            }\n                        }\n                    }\n                }\n            },\n            _mouseout: function (e) {\n                if (e.element) {\n                    var element = this._drawingChartElement(e.element, e);\n                    if (element && element.leave) {\n                        element.leave(this, e.originalEvent);\n                    }\n                }\n            },\n            _start: function (e) {\n                var coords = this._eventCoordinates(e);\n                if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n                    return;\n                }\n                if (this.requiresHandlers([\n                        DRAG_START,\n                        DRAG,\n                        DRAG_END\n                    ])) {\n                    this._startNavigation(e, coords, DRAG_START);\n                }\n                if (this._pannable && this._pannable.start(e)) {\n                    this.surface.suspendTracking();\n                    this._unsetActivePoint();\n                    this._suppressHover = true;\n                    this.chartService.panning = true;\n                }\n                if (this._zoomSelection) {\n                    if (this._zoomSelection.start(e)) {\n                        this.trigger(ZOOM_START, {\n                            axisRanges: axisRanges(this._plotArea.axes),\n                            originalEvent: e\n                        });\n                    }\n                }\n            },\n            _move: function (e) {\n                var ref = this;\n                var state = ref._navState;\n                var pannable = ref._pannable;\n                if (this._stopChartHandlers(e)) {\n                    return;\n                }\n                if (pannable) {\n                    var ranges = pannable.move(e);\n                    if (ranges && !this.trigger(DRAG, {\n                            axisRanges: ranges,\n                            originalEvent: e\n                        })) {\n                        pannable.pan();\n                    }\n                } else if (state) {\n                    var ranges$1 = {};\n                    var axes = state.axes;\n                    for (var i = 0; i < axes.length; i++) {\n                        var currentAxis = axes[i];\n                        var axisName = currentAxis.options.name;\n                        if (axisName) {\n                            var axis = currentAxis.options.vertical ? e.y : e.x;\n                            var delta = axis.startLocation - axis.location;\n                            if (delta !== 0) {\n                                ranges$1[currentAxis.options.name] = currentAxis.translateRange(delta);\n                            }\n                        }\n                    }\n                    state.axisRanges = ranges$1;\n                    this.trigger(DRAG, {\n                        axisRanges: ranges$1,\n                        originalEvent: e\n                    });\n                }\n                if (this._zoomSelection) {\n                    this._zoomSelection.move(e);\n                }\n            },\n            _end: function (e) {\n                if (this._stopChartHandlers(e)) {\n                    return;\n                }\n                var pannable = this._pannable;\n                if (pannable && pannable.end(e)) {\n                    this.surface.resumeTracking();\n                    this.trigger(DRAG_END, {\n                        axisRanges: axisRanges(this._plotArea.axes),\n                        originalEvent: e\n                    });\n                    this._suppressHover = false;\n                    this.chartService.panning = false;\n                } else {\n                    this._endNavigation(e, DRAG_END);\n                }\n                if (this._zoomSelection) {\n                    var ranges = this._zoomSelection.end(e);\n                    if (ranges && !this.trigger(ZOOM, {\n                            axisRanges: ranges,\n                            originalEvent: e\n                        })) {\n                        this._zoomSelection.zoom();\n                        this.trigger(ZOOM_END, {\n                            axisRanges: ranges,\n                            originalEvent: e\n                        });\n                    }\n                }\n            },\n            _stopChartHandlers: function (e) {\n                var selections = this._selections || [];\n                if (!selections.length) {\n                    return false;\n                }\n                var coords = this._eventCoordinates(e);\n                var pane = this._plotArea.paneByPoint(coords);\n                if (pane) {\n                    for (var idx = 0; idx < selections.length; idx++) {\n                        if (selections[idx].onPane(pane)) {\n                            return true;\n                        }\n                    }\n                }\n            },\n            _mousewheel: function (e) {\n                var this$1 = this;\n                var delta = dataviz.mousewheelDelta(e);\n                var mousewheelZoom = this._mousewheelZoom;\n                var coords = this._eventCoordinates(e);\n                if (this._stopChartHandlers(e) || !this._plotArea.backgroundContainsPoint(coords)) {\n                    return;\n                }\n                if (mousewheelZoom) {\n                    var args = {\n                        delta: delta,\n                        axisRanges: axisRanges(this._plotArea.axes),\n                        originalEvent: e\n                    };\n                    if (this._zooming || !this.trigger(ZOOM_START, args)) {\n                        e.preventDefault();\n                        if (!this._zooming) {\n                            this._unsetActivePoint();\n                            this.surface.suspendTracking();\n                            this._zooming = true;\n                        }\n                        if (this._mwTimeout) {\n                            clearTimeout(this._mwTimeout);\n                        }\n                        args.axisRanges = mousewheelZoom.updateRanges(delta);\n                        if (args.axisRanges && !this.trigger(ZOOM, args)) {\n                            mousewheelZoom.zoom();\n                        }\n                        this._mwTimeout = setTimeout(function () {\n                            this$1.trigger(ZOOM_END, args);\n                            this$1._zooming = false;\n                            if (this$1.surface) {\n                                this$1.surface.resumeTracking();\n                            }\n                        }, MOUSEWHEEL_DELAY);\n                    }\n                } else {\n                    var state = this._navState;\n                    if (!state) {\n                        var prevented = this._startNavigation(e, coords, ZOOM_START);\n                        if (!prevented) {\n                            state = this._navState;\n                        }\n                    }\n                    if (state) {\n                        var totalDelta = state.totalDelta || delta;\n                        state.totalDelta = totalDelta + delta;\n                        var axes = this._navState.axes;\n                        var ranges = {};\n                        for (var i = 0; i < axes.length; i++) {\n                            var currentAxis = axes[i];\n                            var axisName = currentAxis.options.name;\n                            if (axisName) {\n                                ranges[axisName] = currentAxis.scaleRange(-totalDelta);\n                            }\n                        }\n                        this.trigger(ZOOM, {\n                            delta: delta,\n                            axisRanges: ranges,\n                            originalEvent: e\n                        });\n                        if (this._mwTimeout) {\n                            clearTimeout(this._mwTimeout);\n                        }\n                        this._mwTimeout = setTimeout(function () {\n                            this$1._endNavigation(e, ZOOM_END);\n                        }, MOUSEWHEEL_DELAY);\n                    }\n                }\n            },\n            _startNavigation: function (e, coords, chartEvent) {\n                var plotArea = this._model._plotArea;\n                var pane = plotArea.findPointPane(coords);\n                var axes = plotArea.axes.slice(0);\n                if (!pane) {\n                    return;\n                }\n                var ranges = axisRanges(axes);\n                var prevented = this.trigger(chartEvent, {\n                    axisRanges: ranges,\n                    originalEvent: e\n                });\n                if (prevented) {\n                    this._cancelDomEvents();\n                } else {\n                    this._suppressHover = true;\n                    this._unsetActivePoint();\n                    this._navState = {\n                        axisRanges: ranges,\n                        pane: pane,\n                        axes: axes\n                    };\n                }\n            },\n            _endNavigation: function (e, chartEvent) {\n                if (this._navState) {\n                    this.trigger(chartEvent, {\n                        axisRanges: this._navState.axisRanges,\n                        originalEvent: e\n                    });\n                    this._suppressHover = false;\n                    this._navState = null;\n                }\n            },\n            _getChartElement: function (e, match) {\n                var element = this.surface.eventTarget(e);\n                if (element) {\n                    return this._drawingChartElement(element, e, match);\n                }\n            },\n            _drawingChartElement: function (element, e, match) {\n                var current = element;\n                var chartElement;\n                while (current && !chartElement) {\n                    chartElement = current.chartElement;\n                    current = current.parent;\n                }\n                if (chartElement) {\n                    if (chartElement.aliasFor) {\n                        chartElement = chartElement.aliasFor(e, this._eventCoordinates(e));\n                    }\n                    if (match) {\n                        chartElement = chartElement.closest(match);\n                        if (chartElement && chartElement.aliasFor) {\n                            chartElement = chartElement.aliasFor();\n                        }\n                    }\n                    return chartElement;\n                }\n            },\n            _eventCoordinates: function (e) {\n                var coordinates = dataviz.eventCoordinates(e);\n                return this._toModelCoordinates(coordinates.x, coordinates.y);\n            },\n            _elementPadding: function () {\n                if (!this._padding) {\n                    var ref = elementStyles(this.element, [\n                        'paddingLeft',\n                        'paddingTop'\n                    ]);\n                    var paddingLeft = ref.paddingLeft;\n                    var paddingTop = ref.paddingTop;\n                    this._padding = {\n                        top: paddingTop,\n                        left: paddingLeft\n                    };\n                }\n                return this._padding;\n            },\n            _toDocumentCoordinates: function (point) {\n                var padding = this._elementPadding();\n                var offset = dataviz.elementOffset(this.element);\n                return {\n                    left: round(point.x + padding.left + offset.left),\n                    top: round(point.y + padding.top + offset.top)\n                };\n            },\n            _toModelCoordinates: function (clientX, clientY) {\n                var element = this.element;\n                var offset = dataviz.elementOffset(element);\n                var padding = this._elementPadding();\n                return new Point(clientX - offset.left - padding.left, clientY - offset.top - padding.top);\n            },\n            _tap: function (e) {\n                var this$1 = this;\n                var drawingElement = this.surface.eventTarget(e);\n                var element = this._drawingChartElement(drawingElement, e);\n                var sharedTooltip = this._sharedTooltip();\n                if (!this._startHover(drawingElement, e) && !sharedTooltip) {\n                    this._unsetActivePoint();\n                }\n                if (sharedTooltip) {\n                    this._trackSharedTooltip(this._eventCoordinates(e), e, true);\n                }\n                this._propagateClick(element, e);\n                this.handlingTap = true;\n                setTimeout(function () {\n                    this$1.handlingTap = false;\n                }, 0);\n            },\n            _click: function (e) {\n                var element = this._getChartElement(e);\n                this._propagateClick(element, e);\n            },\n            _propagateClick: function (element, e) {\n                var this$1 = this;\n                var current = element;\n                while (current) {\n                    if (current.click) {\n                        current.click(this$1, e);\n                    }\n                    current = current.parent;\n                }\n            },\n            _startHover: function (element, e) {\n                if (this._suppressHover) {\n                    return false;\n                }\n                var point = this._drawingChartElement(element, e, function (element) {\n                    return (element.hover || element.over) && !(element instanceof PlotAreaBase);\n                });\n                var activePoint = this._activePoint;\n                var hoveredPoint = this._hoveredPoint;\n                if (hoveredPoint && hoveredPoint !== point) {\n                    hoveredPoint.out(this, e);\n                    this._hoveredPoint = null;\n                }\n                if (point && hoveredPoint !== point && point.over) {\n                    this._hoveredPoint = point;\n                    point.over(this, e);\n                }\n                if (point && activePoint !== point && point.hover) {\n                    this._activePoint = point;\n                    if (!this._sharedTooltip() && !point.hover(this, e)) {\n                        var tooltipOptions = deepExtend({}, this.options.tooltip, point.options.tooltip);\n                        if (tooltipOptions.visible) {\n                            this._tooltip.show(point);\n                        }\n                        this._highlight.show(point);\n                    }\n                }\n                return point;\n            },\n            _mouseover: function (e) {\n                var point = this._startHover(e.element, e.originalEvent);\n                if (point && point.tooltipTracking && !this._mouseMoveTrackHandler && !this._sharedTooltip()) {\n                    this._mouseMoveTrackHandler = this._mouseMoveTracking.bind(this);\n                    var obj;\n                    bindEvents(document, (obj = {}, obj[MOUSEMOVE] = this._mouseMoveTrackHandler, obj));\n                }\n            },\n            _mouseMoveTracking: function (e) {\n                var ref = this;\n                var options = ref.options;\n                var tooltip = ref._tooltip;\n                var highlight = ref._highlight;\n                var point = ref._activePoint;\n                var coords = this._eventCoordinates(e);\n                if (this._plotArea.box.containsPoint(coords)) {\n                    if (point && point.tooltipTracking && point.series && point.parent.getNearestPoint) {\n                        var seriesPoint = point.parent.getNearestPoint(coords.x, coords.y, point.seriesIx);\n                        if (seriesPoint && seriesPoint !== point) {\n                            this._activePoint = seriesPoint;\n                            if (!seriesPoint.hover(this, e)) {\n                                var tooltipOptions = deepExtend({}, options.tooltip, seriesPoint.options.tooltip);\n                                if (tooltipOptions.visible) {\n                                    tooltip.show(seriesPoint);\n                                }\n                                highlight.show(seriesPoint);\n                            }\n                        }\n                    }\n                } else {\n                    var obj;\n                    unbindEvents(document, (obj = {}, obj[MOUSEMOVE] = this._mouseMoveTrackHandler, obj));\n                    this._unsetActivePoint();\n                    this._mouseMoveTrackHandler = null;\n                }\n            },\n            _mousemove: function (e) {\n                var coords = this._eventCoordinates(e);\n                var plotArea = this._plotArea;\n                this._trackCrosshairs(coords);\n                if (plotArea.hover) {\n                    var overPlotArea = plotArea.backgroundContainsPoint(coords);\n                    if (overPlotArea) {\n                        plotArea.hovered = true;\n                        this._plotArea.hover(this, e);\n                    } else if (plotArea.hovered && !overPlotArea) {\n                        this.trigger(PLOT_AREA_LEAVE);\n                        plotArea.hovered = false;\n                    }\n                }\n                if (this._sharedTooltip()) {\n                    this._trackSharedTooltip(coords, e);\n                }\n            },\n            _trackCrosshairs: function (coords) {\n                var crosshairs = this._plotArea.crosshairs;\n                for (var i = 0; i < crosshairs.length; i++) {\n                    var current = crosshairs[i];\n                    if (current.box.containsPoint(coords)) {\n                        current.showAt(coords);\n                    } else {\n                        current.hide();\n                    }\n                }\n            },\n            _trackSharedTooltip: function (coords, e, toggle) {\n                if (this._suppressHover) {\n                    return;\n                }\n                var ref = this;\n                var tooltipOptions = ref.options.tooltip;\n                var plotArea = ref._plotArea;\n                var categoryAxis = ref._plotArea.categoryAxis;\n                var tooltip = ref._tooltip;\n                var highlight = ref._highlight;\n                if (plotArea.backgroundContainsPoint(coords)) {\n                    var index = categoryAxis.pointCategoryIndex(coords);\n                    if (index !== this._tooltipCategoryIx || !this._sharedHighlight && toggle) {\n                        var points = plotArea.pointsByCategoryIndex(index);\n                        var pointArgs = points.map(function (point) {\n                            return point.eventArgs(e);\n                        });\n                        var hoverArgs = pointArgs[0] || {};\n                        hoverArgs.categoryPoints = pointArgs;\n                        if (points.length > 0 && !this.trigger(SERIES_HOVER, hoverArgs)) {\n                            if (tooltipOptions.visible) {\n                                tooltip.showAt(points, coords);\n                            }\n                            highlight.show(points);\n                            this._sharedHighlight = true;\n                        } else {\n                            tooltip.hide();\n                        }\n                        this._tooltipCategoryIx = index;\n                    } else if (toggle && this._sharedHighlight) {\n                        highlight.hide();\n                        tooltip.hide();\n                        this._sharedHighlight = false;\n                    }\n                } else if (this._sharedHighlight) {\n                    highlight.hide();\n                    tooltip.hide();\n                    this._tooltipCategoryIx = null;\n                    this._sharedHighlight = false;\n                }\n            },\n            hideElements: function () {\n                var plotArea = this._plotArea;\n                this._mousemove.cancel();\n                plotArea.hideCrosshairs();\n                this._unsetActivePoint();\n            },\n            _unsetActivePoint: function () {\n                var ref = this;\n                var tooltip = ref._tooltip;\n                var highlight = ref._highlight;\n                this._activePoint = null;\n                this._hoveredPoint = null;\n                if (tooltip) {\n                    tooltip.hide();\n                }\n                this._tooltipCategoryIx = null;\n                this._sharedHighlight = false;\n                if (highlight) {\n                    highlight.hide();\n                }\n            },\n            _deferRedraw: function () {\n                this._redraw();\n            },\n            _clearRedrawTimeout: function () {\n                if (this._redrawTimeout) {\n                    clearInterval(this._redrawTimeout);\n                    this._redrawTimeout = null;\n                }\n            },\n            bindCategories: function () {\n                var this$1 = this;\n                var options = this.options;\n                var definitions = [].concat(options.categoryAxis);\n                for (var axisIx = 0; axisIx < definitions.length; axisIx++) {\n                    var axis = definitions[axisIx];\n                    if (axis.autoBind !== false) {\n                        this$1.bindCategoryAxisFromSeries(axis, axisIx);\n                    }\n                }\n            },\n            bindCategoryAxisFromSeries: function (axis, axisIx) {\n                var this$1 = this;\n                var series = this.options.series;\n                var seriesLength = series.length;\n                var uniqueCategories = new dataviz.HashMap();\n                var items = [];\n                var bindable = false;\n                var dateAxis;\n                for (var seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n                    var s = series[seriesIx];\n                    var onAxis = s.categoryAxis === axis.name || !s.categoryAxis && axisIx === 0;\n                    var data = s.data;\n                    var dataLength = data.length;\n                    var bind = s.categoryField && onAxis;\n                    bindable = bind || bindable;\n                    if (bind && dataLength > 0) {\n                        dateAxis = isDateAxis(axis, getField(s.categoryField, data[0]));\n                        var getFn = dateAxis ? getDateField : getField;\n                        for (var dataIx = 0; dataIx < dataLength; dataIx++) {\n                            var dataRow = data[dataIx];\n                            var category = getFn(s.categoryField, dataRow, this$1.chartService.intl);\n                            if (dateAxis || !uniqueCategories.get(category)) {\n                                items.push([\n                                    category,\n                                    dataRow\n                                ]);\n                                if (!dateAxis) {\n                                    uniqueCategories.set(category, true);\n                                }\n                            }\n                        }\n                    }\n                }\n                if (items.length > 0) {\n                    if (dateAxis) {\n                        items = uniqueDates(items, function (a, b) {\n                            return dataviz.dateComparer(a[0], b[0]);\n                        });\n                    }\n                    var result = transpose(items);\n                    axis.categories = result[0];\n                } else if (bindable) {\n                    axis.categories = [];\n                }\n            },\n            _isBindable: function (series) {\n                var valueFields = SeriesBinder.current.valueFields(series);\n                var result = true;\n                for (var i = 0; i < valueFields.length; i++) {\n                    var field = valueFields[i];\n                    if (field === VALUE) {\n                        field = 'field';\n                    } else {\n                        field = field + 'Field';\n                    }\n                    if (!defined(series[field])) {\n                        result = false;\n                        break;\n                    }\n                }\n                return result;\n            },\n            _noTransitionsRedraw: function () {\n                var options = this.options;\n                var transitionsState;\n                if (options.transitions) {\n                    options.transitions = false;\n                    transitionsState = true;\n                }\n                this._redraw();\n                if (transitionsState) {\n                    options.transitions = true;\n                }\n            },\n            _legendItemHover: function (seriesIndex, pointIndex) {\n                var ref = this;\n                var plotArea = ref._plotArea;\n                var highlight = ref._highlight;\n                var currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex];\n                var items;\n                if (inArray(currentSeries.type, [\n                        PIE,\n                        DONUT,\n                        FUNNEL\n                    ])) {\n                    items = plotArea.findPoint(function (point) {\n                        return point.series.index === seriesIndex && point.index === pointIndex;\n                    });\n                } else {\n                    items = plotArea.pointsBySeriesIndex(seriesIndex);\n                }\n                highlight.show(items);\n            },\n            _shouldAttachMouseMove: function () {\n                return this._plotArea.crosshairs.length || this._tooltip && this._sharedTooltip() || this.requiresHandlers([\n                    PLOT_AREA_HOVER,\n                    PLOT_AREA_LEAVE\n                ]);\n            },\n            updateMouseMoveHandler: function () {\n                var obj;\n                unbindEvents(this.element, (obj = {}, obj[MOUSEMOVE] = this._mousemove, obj));\n                if (this._shouldAttachMouseMove()) {\n                    var obj$1;\n                    bindEvents(this.element, (obj$1 = {}, obj$1[MOUSEMOVE] = this._mousemove, obj$1));\n                }\n            },\n            applyOptions: function (options, theme) {\n                clearMissingValues(this._originalOptions, options);\n                this._originalOptions = deepExtend(this._originalOptions, options);\n                this.options = deepExtend({}, this._originalOptions);\n                if (theme) {\n                    this._theme = theme;\n                    this.chartService.theme = theme;\n                }\n                this._initTheme(this.options, this._theme);\n                this._toggleDragZoomEvents();\n            },\n            setOptions: function (options, theme) {\n                this.applyOptions(options, theme);\n                this.bindCategories();\n                this.redraw();\n                this.updateMouseMoveHandler();\n            },\n            setDirection: function (rtl) {\n                this.chartService.rtl = Boolean(rtl);\n                if (this.surface && this.surface.type === 'svg') {\n                    this._destroySurface();\n                }\n            },\n            setIntlService: function (intl) {\n                this.chartService.intl = intl;\n            },\n            noTransitionsRedraw: function () {\n                this._noTransitionsRedraw();\n            },\n            destroy: function () {\n                this._destroyed = true;\n                var obj;\n                unbindEvents(this.element, (obj = {}, obj[CONTEXTMENU] = this._clickHandler, obj[MOUSEWHEEL] = this._mousewheelHandler, obj[MOUSEMOVE] = this._mousemove, obj[MOUSELEAVE] = this._mouseleaveHandler, obj));\n                if (this.domEvents) {\n                    this.domEvents.destroy();\n                    delete this.domEvents;\n                }\n                if (this._mouseMoveTrackHandler) {\n                    var obj$1;\n                    unbindEvents(document, (obj$1 = {}, obj$1[MOUSEMOVE] = this._mouseMoveTrackHandler, obj$1));\n                }\n                this._destroyView();\n                this._destroySurface();\n                this._clearRedrawTimeout();\n            },\n            _destroySurface: function () {\n                var surface = this.surface;\n                if (surface) {\n                    surface.unbind('mouseenter', this._surfaceMouseenterHandler);\n                    surface.unbind('mouseleave', this._surfaceMouseleaveHandler);\n                    surface.destroy();\n                    this.surface = null;\n                }\n            },\n            _destroyView: function () {\n                var ref = this;\n                var model = ref._model;\n                var selections = ref._selections;\n                if (model) {\n                    model.destroy();\n                    this._model = null;\n                }\n                if (selections) {\n                    while (selections.length > 0) {\n                        selections.shift().destroy();\n                    }\n                }\n                this._unsetActivePoint();\n                if (this._tooltip) {\n                    this._tooltip.destroy();\n                }\n                if (this._highlight) {\n                    this._highlight.destroy();\n                }\n                if (this._zoomSelection) {\n                    this._zoomSelection.destroy();\n                    delete this._zoomSelection;\n                }\n                if (this._pannable) {\n                    this._pannable.destroy();\n                    delete this._pannable;\n                }\n                if (this._mousewheelZoom) {\n                    this._mousewheelZoom.destroy();\n                    delete this._mousewheelZoom;\n                }\n            }\n        });\n        function resolveAxisAliases(options) {\n            var aliases = AXIS_NAMES;\n            for (var idx = 0; idx < aliases.length; idx++) {\n                var alias = aliases[idx] + 'Axes';\n                if (options[alias]) {\n                    options[aliases[idx] + 'Axis'] = options[alias];\n                    delete options[alias];\n                }\n            }\n        }\n        function pointByCategoryName(points, name) {\n            if (points) {\n                for (var idx = 0; idx < points.length; idx++) {\n                    if (points[idx].category === name) {\n                        return [points[idx]];\n                    }\n                }\n            }\n        }\n        function applyAxisDefaults(options, themeOptions) {\n            var themeAxisDefaults = (themeOptions || {}).axisDefaults || {};\n            var axisName, axisDefaults, axes;\n            function mapAxisOptions(axisOptions) {\n                var axisColor = (axisOptions || {}).color || axisDefaults.color;\n                var result = deepExtend({}, themeAxisDefaults, themeAxisDefaults[axisName], axisDefaults, axisDefaults[axisName], {\n                    line: { color: axisColor },\n                    labels: { color: axisColor },\n                    title: { color: axisColor }\n                }, axisOptions);\n                delete result[axisName];\n                return result;\n            }\n            for (var idx = 0; idx < AXIS_NAMES.length; idx++) {\n                axisName = AXIS_NAMES[idx] + 'Axis';\n                axisDefaults = options.axisDefaults || {};\n                axes = [].concat(options[axisName]);\n                axes = axes.map(mapAxisOptions);\n                options[axisName] = axes.length > 1 ? axes : axes[0];\n            }\n        }\n        function applySeriesDefaults(options, themeOptions) {\n            var series = options.series;\n            var seriesLength = series.length;\n            var seriesDefaults = options.seriesDefaults;\n            var commonDefaults = deepExtend({}, options.seriesDefaults);\n            var themeSeriesDefaults = themeOptions ? deepExtend({}, themeOptions.seriesDefaults) : {};\n            var commonThemeDefaults = deepExtend({}, themeSeriesDefaults);\n            cleanupNestedSeriesDefaults(commonDefaults);\n            cleanupNestedSeriesDefaults(commonThemeDefaults);\n            for (var i = 0; i < seriesLength; i++) {\n                var seriesType = series[i].type || options.seriesDefaults.type;\n                var baseOptions = deepExtend({ data: [] }, commonThemeDefaults, themeSeriesDefaults[seriesType], { tooltip: options.tooltip }, commonDefaults, seriesDefaults[seriesType]);\n                series[i]._defaults = baseOptions;\n                series[i] = deepExtend({}, baseOptions, series[i]);\n                series[i].data = series[i].data || [];\n            }\n        }\n        function cleanupNestedSeriesDefaults(seriesDefaults) {\n            delete seriesDefaults.bar;\n            delete seriesDefaults.column;\n            delete seriesDefaults.rangeColumn;\n            delete seriesDefaults.line;\n            delete seriesDefaults.verticalLine;\n            delete seriesDefaults.pie;\n            delete seriesDefaults.donut;\n            delete seriesDefaults.area;\n            delete seriesDefaults.verticalArea;\n            delete seriesDefaults.scatter;\n            delete seriesDefaults.scatterLine;\n            delete seriesDefaults.bubble;\n            delete seriesDefaults.candlestick;\n            delete seriesDefaults.ohlc;\n            delete seriesDefaults.boxPlot;\n            delete seriesDefaults.bullet;\n            delete seriesDefaults.verticalBullet;\n            delete seriesDefaults.polarArea;\n            delete seriesDefaults.polarLine;\n            delete seriesDefaults.radarArea;\n            delete seriesDefaults.radarLine;\n            delete seriesDefaults.waterfall;\n        }\n        function axisRanges(axes) {\n            var ranges = {};\n            for (var i = 0; i < axes.length; i++) {\n                var axis = axes[i];\n                var axisName = axis.options.name;\n                if (axisName) {\n                    ranges[axisName] = axis.range();\n                }\n            }\n            return ranges;\n        }\n        function sortDates(dates, comparer) {\n            if (comparer === void 0) {\n                comparer = dataviz.dateComparer;\n            }\n            for (var i = 1, length = dates.length; i < length; i++) {\n                if (comparer(dates[i], dates[i - 1]) < 0) {\n                    dates.sort(comparer);\n                    break;\n                }\n            }\n            return dates;\n        }\n        function uniqueDates(srcDates, comparer) {\n            if (comparer === void 0) {\n                comparer = dataviz.dateComparer;\n            }\n            var dates = sortDates(srcDates, comparer);\n            var length = dates.length;\n            var result = length > 0 ? [dates[0]] : [];\n            for (var i = 1; i < length; i++) {\n                if (comparer(dates[i], last(result)) !== 0) {\n                    result.push(dates[i]);\n                }\n            }\n            return result;\n        }\n        function transpose(rows) {\n            var rowCount = rows.length;\n            var result = [];\n            for (var rowIx = 0; rowIx < rowCount; rowIx++) {\n                var row = rows[rowIx];\n                var colCount = row.length;\n                for (var colIx = 0; colIx < colCount; colIx++) {\n                    result[colIx] = result[colIx] || [];\n                    result[colIx].push(row[colIx]);\n                }\n            }\n            return result;\n        }\n        var DATA_FIELDS = [\n            'data',\n            'categories'\n        ];\n        function clearMissingValues(originalOptions, options) {\n            for (var field in options) {\n                if (!inArray(field, DATA_FIELDS) && options.hasOwnProperty(field)) {\n                    var fieldValue = options[field];\n                    var originalValue = originalOptions[field];\n                    if (defined(originalValue)) {\n                        var nullValue = fieldValue === null;\n                        if (nullValue || !defined(fieldValue)) {\n                            delete originalOptions[field];\n                            if (nullValue) {\n                                delete options[field];\n                            }\n                        } else if (originalValue && isObject(fieldValue)) {\n                            if (isObject(originalValue)) {\n                                clearMissingValues(originalValue, fieldValue);\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        function triggerPaneRender(panes) {\n            for (var idx = 0; idx < panes.length; idx++) {\n                panes[idx].notifyRender();\n            }\n        }\n        setDefaultOptions(Chart, {\n            renderAs: '',\n            chartArea: {},\n            legend: {\n                visible: true,\n                labels: {}\n            },\n            categoryAxis: {},\n            seriesDefaults: {\n                type: COLUMN,\n                data: [],\n                highlight: { visible: true },\n                labels: {},\n                negativeValues: { visible: false }\n            },\n            series: [],\n            seriesColors: null,\n            tooltip: { visible: false },\n            transitions: true,\n            valueAxis: {},\n            plotArea: {},\n            title: {},\n            xAxis: {},\n            yAxis: {},\n            panes: [{}],\n            pannable: false,\n            zoomable: false\n        });\n        kendo.deepExtend(kendo.dataviz, {\n            constants: constants,\n            Aggregates: Aggregates,\n            AreaChart: AreaChart,\n            AreaSegment: AreaSegment,\n            AxisGroupRangeTracker: AxisGroupRangeTracker,\n            Bar: Bar,\n            BarChart: BarChart,\n            BarLabel: BarLabel,\n            BoxPlotChart: BoxPlotChart,\n            BoxPlot: BoxPlot,\n            BubbleChart: BubbleChart,\n            Bullet: Bullet,\n            BulletChart: BulletChart,\n            CandlestickChart: CandlestickChart,\n            Candlestick: Candlestick,\n            CategoricalChart: CategoricalChart,\n            CategoricalErrorBar: CategoricalErrorBar,\n            CategoricalPlotArea: CategoricalPlotArea,\n            Chart: Chart,\n            ChartContainer: ChartContainer,\n            ClipAnimation: ClipAnimation,\n            ClusterLayout: ClusterLayout,\n            Crosshair: Crosshair,\n            CrosshairTooltip: CrosshairTooltip,\n            DefaultAggregates: DefaultAggregates,\n            DonutChart: DonutChart,\n            DonutPlotArea: DonutPlotArea,\n            DonutSegment: DonutSegment,\n            ErrorBarBase: ErrorBarBase,\n            ErrorRangeCalculator: ErrorRangeCalculator,\n            Highlight: Highlight,\n            SharedTooltip: SharedTooltip,\n            Legend: Legend,\n            LegendItem: LegendItem,\n            LegendLayout: LegendLayout,\n            LineChart: LineChart,\n            LinePoint: LinePoint,\n            LineSegment: LineSegment,\n            Pane: Pane,\n            PieAnimation: PieAnimation,\n            PieChart: PieChart,\n            PieChartMixin: PieChartMixin,\n            PiePlotArea: PiePlotArea,\n            PieSegment: PieSegment,\n            PlotAreaBase: PlotAreaBase,\n            PlotAreaEventsMixin: PlotAreaEventsMixin,\n            PlotAreaFactory: PlotAreaFactory,\n            PointEventsMixin: PointEventsMixin,\n            RangeBar: RangeBar,\n            RangeBarChart: RangeBarChart,\n            RangeAreaPoint: RangeAreaPoint,\n            RangeAreaChart: RangeAreaChart,\n            ScatterChart: ScatterChart,\n            ScatterErrorBar: ScatterErrorBar,\n            ScatterLineChart: ScatterLineChart,\n            Selection: Selection,\n            SeriesAggregator: SeriesAggregator,\n            SeriesBinder: SeriesBinder,\n            SplineSegment: SplineSegment,\n            SplineAreaSegment: SplineAreaSegment,\n            StackWrap: StackWrap,\n            Tooltip: Tooltip,\n            OHLCChart: OHLCChart,\n            OHLCPoint: OHLCPoint,\n            WaterfallChart: WaterfallChart,\n            WaterfallSegment: WaterfallSegment,\n            XYPlotArea: XYPlotArea,\n            MousewheelZoom: MousewheelZoom,\n            ZoomSelection: ZoomSelection,\n            Pannable: Pannable,\n            ChartAxis: ChartAxis,\n            ChartPane: ChartPane,\n            ChartPlotArea: ChartPlotArea,\n            findAxisByName: findAxisByName,\n            anyHasZIndex: anyHasZIndex,\n            appendIfNotNull: appendIfNotNull,\n            areNumbers: areNumbers,\n            bindSegments: bindSegments,\n            categoriesCount: categoriesCount,\n            countNumbers: countNumbers,\n            equalsIgnoreCase: equalsIgnoreCase,\n            evalOptions: evalOptions,\n            filterSeriesByType: filterSeriesByType,\n            getDateField: getDateField,\n            getField: getField,\n            hasGradientOverlay: hasGradientOverlay,\n            hasValue: hasValue,\n            isDateAxis: isDateAxis,\n            segmentVisible: segmentVisible,\n            singleItemOrArray: singleItemOrArray,\n            createOutOfRangePoints: createOutOfRangePoints\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/chart/chart', [\n        'dataviz/chart/kendo-chart',\n        'kendo.data',\n        'kendo.dataviz.core',\n        'kendo.dataviz.themes',\n        'kendo.drawing',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var NS = '.kendoChart';\n        var kendo = window.kendo;\n        var Class = kendo.Class;\n        var outerWidth = kendo._outerWidth;\n        var outerHeight = kendo._outerHeight;\n        var dataviz = kendo.dataviz;\n        var constants = dataviz.constants;\n        var KendoChart = dataviz.Chart;\n        var SeriesBinder = dataviz.SeriesBinder;\n        var Widget = kendo.ui.Widget;\n        var DataSource = kendo.data.DataSource;\n        var deepExtend = kendo.deepExtend;\n        var defined = dataviz.defined;\n        var getField = dataviz.getField;\n        var InstanceObserver = dataviz.InstanceObserver;\n        var inArray = dataviz.inArray;\n        var services = dataviz.services;\n        var proxy = $.proxy;\n        var isArray = $.isArray;\n        var extend = $.extend;\n        var template = kendo.template;\n        var MOUSELEAVE_NS = 'mouseleave' + NS;\n        var AXIS_LABEL_CLICK = constants.AXIS_LABEL_CLICK;\n        var LEGEND_ITEM_CLICK = constants.LEGEND_ITEM_CLICK;\n        var LEGEND_ITEM_HOVER = constants.LEGEND_ITEM_HOVER;\n        var LEGEND_ITEM_LEAVE = constants.LEGEND_ITEM_LEAVE;\n        var SERIES_CLICK = constants.SERIES_CLICK;\n        var SERIES_HOVER = constants.SERIES_HOVER;\n        var SERIES_OVER = constants.SERIES_OVER;\n        var SERIES_LEAVE = constants.SERIES_LEAVE;\n        var PANE_RENDER = constants.PANE_RENDER;\n        var PLOT_AREA_CLICK = constants.PLOT_AREA_CLICK;\n        var PLOT_AREA_HOVER = constants.PLOT_AREA_HOVER;\n        var PLOT_AREA_LEAVE = constants.PLOT_AREA_LEAVE;\n        var DRAG = constants.DRAG;\n        var DRAG_END = constants.DRAG_END;\n        var DRAG_START = constants.DRAG_START;\n        var ZOOM_START = constants.ZOOM_START;\n        var ZOOM = constants.ZOOM;\n        var ZOOM_END = constants.ZOOM_END;\n        var SELECT_START = constants.SELECT_START;\n        var SELECT = constants.SELECT;\n        var SELECT_END = constants.SELECT_END;\n        var RENDER = constants.RENDER;\n        var NOTE_CLICK = constants.NOTE_CLICK;\n        var NOTE_HOVER = constants.NOTE_HOVER;\n        var NOTE_LEAVE = constants.NOTE_LEAVE;\n        var CHANGE = 'change';\n        var DATABOUND = 'dataBound';\n        var LEAVE = 'leave';\n        var VALUE = constants.VALUE;\n        var PIE = constants.PIE;\n        var DONUT = constants.DONUT;\n        var FUNNEL = constants.FUNNEL;\n        var Observable = kendo.Observable;\n        var TOOLTIP_ANIMATION_DURATION = 150;\n        var TOOLTIP_SHOW_DELAY = 100;\n        var TOOLTIP_INVERSE = 'k-chart-tooltip-inverse';\n        var SHARED_TOOLTIP_CLASS = 'k-chart-shared-tooltip';\n        var RTL = 'rtl';\n        services.DomEventsBuilder.register({\n            create: function (element, events) {\n                return new kendo.UserEvents(element, deepExtend({\n                    global: true,\n                    multiTouch: true,\n                    fastTap: true\n                }, events));\n            }\n        });\n        var ChartInstanceObserver = InstanceObserver.extend({\n            handlerMap: {\n                showTooltip: '_showTooltip',\n                hideTooltip: '_hideTooltip',\n                legendItemClick: '_onLegendItemClick',\n                render: '_onRender',\n                init: '_onInit'\n            }\n        });\n        var Chart = Widget.extend({\n            init: function (element, userOptions) {\n                var dataSource;\n                kendo.destroy(element);\n                Widget.fn.init.call(this, element);\n                if (userOptions) {\n                    dataSource = userOptions.dataSource;\n                    delete userOptions.dataSource;\n                }\n                this.options = deepExtend({}, this.options, userOptions);\n                this.wrapper = this.element;\n                this._attachEvents();\n                if (userOptions) {\n                    userOptions.dataSource = dataSource;\n                }\n                this._seriesVisibility = new SeriesVisibilityState();\n                this.bind(this.events, this.options);\n                this._initDataSource(userOptions);\n                kendo.notify(this, dataviz.ui);\n            },\n            events: [\n                DATABOUND,\n                SERIES_CLICK,\n                SERIES_HOVER,\n                SERIES_OVER,\n                SERIES_LEAVE,\n                AXIS_LABEL_CLICK,\n                LEGEND_ITEM_CLICK,\n                LEGEND_ITEM_HOVER,\n                LEGEND_ITEM_LEAVE,\n                PANE_RENDER,\n                PLOT_AREA_CLICK,\n                PLOT_AREA_HOVER,\n                PLOT_AREA_LEAVE,\n                DRAG_START,\n                DRAG,\n                DRAG_END,\n                ZOOM_START,\n                ZOOM,\n                ZOOM_END,\n                SELECT_START,\n                SELECT,\n                SELECT_END,\n                NOTE_CLICK,\n                NOTE_HOVER,\n                NOTE_LEAVE,\n                RENDER\n            ],\n            options: {\n                name: 'Chart',\n                renderAs: '',\n                theme: 'default',\n                axisDefaults: {},\n                chartArea: {},\n                legend: {},\n                categoryAxis: {},\n                autoBind: true,\n                seriesDefaults: {},\n                series: [],\n                seriesColors: null,\n                tooltip: {},\n                transitions: true,\n                valueAxis: {},\n                plotArea: {},\n                title: {},\n                xAxis: {},\n                yAxis: {},\n                panes: [{}],\n                pannable: false,\n                zoomable: false\n            },\n            items: function () {\n                return $();\n            },\n            refresh: function () {\n                var chart = this;\n                var instance = chart._instance;\n                instance.applyDefaults(chart.options);\n                instance.applySeriesColors();\n                chart._bindSeries();\n                chart._bindCategories();\n                chart.trigger(DATABOUND);\n                chart._redraw();\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            redraw: function (paneName) {\n                this._size = null;\n                this._instance.redraw(paneName);\n            },\n            setOptions: function (options) {\n                var chart = this, dataSource = options.dataSource;\n                delete options.dataSource;\n                Widget.fn._setEvents.call(chart, options);\n                this._instance.applyOptions(options, this._getThemeOptions(options));\n                this.options = this._instance.options;\n                this._tooltip.setOptions(this.options.tooltip);\n                this._seriesVisibility.setOptions(this.options);\n                this._sourceSeries = null;\n                if (dataSource) {\n                    chart.setDataSource(dataSource);\n                }\n                if (chart._hasDataSource) {\n                    chart._onDataChanged();\n                } else {\n                    chart._bindCategories();\n                    chart.redraw();\n                }\n                chart._instance.updateMouseMoveHandler();\n            },\n            setDataSource: function (dataSource) {\n                var chart = this;\n                chart.dataSource.unbind(CHANGE, chart._dataChangeHandler);\n                chart.dataSource = dataSource = DataSource.create(dataSource);\n                chart._hasDataSource = true;\n                chart._hasData = false;\n                dataSource.bind(CHANGE, chart._dataChangeHandler);\n                if (chart.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            destroy: function () {\n                var chart = this, dataSource = chart.dataSource;\n                chart.element.off(NS);\n                if (dataSource) {\n                    dataSource.unbind(CHANGE, chart._dataChangeHandler);\n                }\n                if (chart._instance) {\n                    chart._instance.destroy();\n                    delete this._instance;\n                }\n                if (this._tooltip) {\n                    this._tooltip.destroy();\n                    delete this._tooltip;\n                }\n                this._destroyCrosshairTooltips();\n                Widget.fn.destroy.call(chart);\n            },\n            findPaneByName: function (name) {\n                var panes = this._plotArea.panes;\n                for (var idx = 0; idx < panes.length; idx++) {\n                    if (panes[idx].options.name === name) {\n                        return new ChartPane(this, panes[idx]);\n                    }\n                }\n            },\n            findPaneByIndex: function (idx) {\n                var panes = this._plotArea.panes;\n                if (panes[idx]) {\n                    return new ChartPane(this, panes[idx]);\n                }\n            },\n            findSeries: function (callback) {\n                var plotArea = this._plotArea;\n                var series = plotArea.srcSeries || plotArea.series;\n                for (var idx = 0; idx < series.length; idx++) {\n                    if (callback(series[idx])) {\n                        return new ChartSeries(this, series[idx]);\n                    }\n                }\n            },\n            findSeriesByName: function (name) {\n                return this._createSeries({ name: name });\n            },\n            findSeriesByIndex: function (index) {\n                return this._createSeries({ index: index });\n            },\n            exportVisual: function (options) {\n                var instance = this._instance;\n                if (!instance) {\n                    return;\n                }\n                var visual;\n                if (options && (options.width || options.height)) {\n                    var chartArea = instance.options.chartArea;\n                    var originalChartArea = instance._originalOptions.chartArea;\n                    deepExtend(chartArea, options);\n                    var model = instance._getModel();\n                    chartArea.width = originalChartArea.width;\n                    chartArea.height = originalChartArea.height;\n                    model.renderVisual();\n                    triggerPaneRender(model._plotArea.panes);\n                    visual = model.visual;\n                } else {\n                    visual = instance.exportVisual();\n                }\n                return visual;\n            },\n            _createSeries: function (options) {\n                var seriesOptions = this._seriesOptions(options);\n                if (seriesOptions) {\n                    return new ChartSeries(this, seriesOptions);\n                }\n            },\n            _seriesOptions: function (options) {\n                var plotArea = this._plotArea;\n                var series = plotArea.srcSeries || plotArea.series;\n                var seriesOptions;\n                if (defined(options.index)) {\n                    seriesOptions = series[options.index];\n                } else if (defined(options.name)) {\n                    for (var idx = 0; idx < series.length; idx++) {\n                        if (series[idx].name === options.name) {\n                            seriesOptions = series[idx];\n                            break;\n                        }\n                    }\n                }\n                return seriesOptions;\n            },\n            _attachEvents: function () {\n                this.element.on(MOUSELEAVE_NS, proxy(this._mouseleave, this));\n            },\n            _mouseleave: function (e) {\n                var instance = this._instance;\n                var tooltip = this._tooltip;\n                var target = e.relatedTarget;\n                if (!(target && $(target).closest(tooltip.element).length) && instance && !instance.handlingTap) {\n                    instance.hideElements();\n                }\n            },\n            _getThemeOptions: function (userOptions) {\n                var themeName = (userOptions || {}).theme;\n                if (themeName && dataviz.SASS_THEMES.indexOf(themeName.toLowerCase()) !== -1) {\n                    return dataviz.autoTheme().chart;\n                }\n                if (defined(themeName)) {\n                    var themes = dataviz.ui.themes || {};\n                    var theme = themes[themeName] || themes[themeName.toLowerCase()] || {};\n                    return theme.chart || {};\n                }\n            },\n            _initChart: function () {\n                this._createChart(this.options, this._getThemeOptions(this.options));\n                this.options = this._instance.options;\n                this._seriesVisibility.setOptions(this.options);\n            },\n            _createChart: function (options, themeOptions) {\n                this._instance = new KendoChart(this.element[0], options, themeOptions, {\n                    observer: new ChartInstanceObserver(this),\n                    sender: this,\n                    rtl: this._isRtl()\n                });\n            },\n            _onInit: function (e) {\n                this._instance = e.sender;\n            },\n            _initDataSource: function (userOptions) {\n                var chart = this, dataSource = (userOptions || {}).dataSource;\n                chart._dataChangeHandler = proxy(chart._onDataChanged, chart);\n                chart.dataSource = DataSource.create(dataSource).bind('change', chart._dataChangeHandler);\n                chart._bindCategories();\n                if (dataSource) {\n                    chart._hasDataSource = true;\n                }\n                this._initChart();\n                this._initTooltip();\n                if (dataSource) {\n                    if (chart.options.autoBind) {\n                        chart.dataSource.fetch();\n                    }\n                }\n            },\n            _destroyCrosshairTooltips: function () {\n                var tooltips = this._crosshairTooltips;\n                if (tooltips) {\n                    for (var key in tooltips) {\n                        tooltips[key].destroy();\n                    }\n                }\n                this._crosshairTooltips = {};\n            },\n            _getCrosshairTooltip: function (name, index) {\n                var tooltips = this._crosshairTooltips = this._crosshairTooltips || {};\n                var key = name + index;\n                var tooltip = tooltips[key];\n                if (!tooltip) {\n                    tooltip = tooltips[key] = new CrosshairTooltip(this.element);\n                }\n                return tooltip;\n            },\n            _showTooltip: function (e) {\n                if (e.crosshair) {\n                    var tooltip = this._getCrosshairTooltip(e.axisName, e.axisIndex);\n                    tooltip.show(e);\n                } else if (this._tooltip) {\n                    this._tooltip.show(e);\n                }\n            },\n            _hideTooltip: function (e) {\n                if (e.crosshair) {\n                    var tooltip = this._getCrosshairTooltip(e.axisName, e.axisIndex);\n                    tooltip.hide();\n                } else if (this._tooltip) {\n                    this._tooltip.hide(e);\n                }\n            },\n            _onRender: function (e) {\n                this._destroyCrosshairTooltips();\n                this._copyMembers(e.sender);\n                if (!this._hasDataSource || this._hasData || !this.options.autoBind) {\n                    this.trigger(RENDER);\n                }\n            },\n            _copyMembers: function (instance) {\n                this.options = instance.options;\n                this._originalOptions = instance._originalOptions;\n                this.surface = instance.surface;\n                this._plotArea = instance._plotArea;\n                this._model = instance._model;\n                this._highlight = instance._highlight;\n                this._selections = instance._selections;\n                this._pannable = instance._pannable;\n                this._zoomSelection = instance._zoomSelection;\n                this._mousewheelZoom = instance._mousewheelZoom;\n            },\n            requiresHandlers: function (names) {\n                var events = this._events;\n                for (var idx = 0; idx < names.length; idx++) {\n                    if (defined(events[names[idx]])) {\n                        return true;\n                    }\n                }\n            },\n            _initTooltip: function () {\n                this._tooltip = this._createTooltip();\n                this._tooltip.bind(LEAVE, proxy(this._tooltipleave, this));\n            },\n            _onLegendItemClick: function (e) {\n                if (!this.trigger(LEGEND_ITEM_CLICK, e)) {\n                    this._legendItemClick(e.seriesIndex, e.pointIndex);\n                }\n            },\n            _legendItemClick: function (seriesIndex, pointIndex) {\n                var chart = this._instance, plotArea = chart._plotArea, currentSeries = (plotArea.srcSeries || plotArea.series)[seriesIndex];\n                if ($.inArray(currentSeries.type, [\n                        PIE,\n                        DONUT,\n                        FUNNEL\n                    ]) >= 0) {\n                    var point = currentSeries.data[pointIndex];\n                    if (point && defined(point.visible)) {\n                        point.visible = !point.visible;\n                    } else {\n                        var pointVisibility = currentSeries.pointVisibility = currentSeries.pointVisibility || {};\n                        var visible = pointVisibility[pointIndex];\n                        pointVisibility[pointIndex] = defined(visible) ? !visible : false;\n                    }\n                } else {\n                    currentSeries.visible = !currentSeries.visible;\n                    this._seriesVisibility.save(currentSeries);\n                }\n                chart._noTransitionsRedraw();\n            },\n            _createTooltip: function () {\n                return new Tooltip(this.element, extend({}, this.options.tooltip, { rtl: this._isRtl() }));\n            },\n            _tooltipleave: function () {\n                if (this._instance) {\n                    this._instance.hideElements();\n                }\n            },\n            _bindData: function (e) {\n                var chart = this, options = chart.options, series = chart._sourceSeries || options.series, seriesIx, seriesLength = series.length, data = chart.dataSource.view(), grouped = (chart.dataSource.group() || []).length > 0, processedSeries = [], seriesVisibility = this._seriesVisibility, currentSeries, groupedSeries;\n                seriesVisibility.read();\n                for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n                    currentSeries = series[seriesIx];\n                    if (chart._isBindable(currentSeries) && grouped) {\n                        groupedSeries = groupSeries(currentSeries, data);\n                        processedSeries = processedSeries.concat(groupedSeries);\n                        seriesVisibility.applyByGroup(groupedSeries, e);\n                    } else {\n                        currentSeries = extend({}, currentSeries);\n                        processedSeries.push(currentSeries);\n                        seriesVisibility.applyByIndex(currentSeries, e);\n                    }\n                }\n                chart._sourceSeries = series;\n                options.series = processedSeries;\n                this._instance.applySeriesColors();\n                chart._bindSeries();\n                chart._bindCategories();\n                this._hasData = true;\n            },\n            _onDataChanged: function (e) {\n                this._bindData(e);\n                this.trigger(DATABOUND);\n                if (this._instance && this._instance.fontLoaded) {\n                    this._redraw();\n                }\n            },\n            _bindSeries: function () {\n                var chart = this, data = chart.dataSource.view(), series = chart.options.series, seriesIx, seriesLength = series.length, currentSeries, groupIx, seriesData;\n                for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n                    currentSeries = series[seriesIx];\n                    if (chart._isBindable(currentSeries)) {\n                        groupIx = currentSeries._groupIx;\n                        seriesData = defined(groupIx) ? (data[groupIx] || {}).items : data;\n                        if (currentSeries.autoBind !== false) {\n                            currentSeries.data = seriesData;\n                        }\n                    }\n                }\n            },\n            _bindCategories: function () {\n                var chart = this, data = chart.dataSource.view() || [], grouped = (chart.dataSource.group() || []).length > 0, categoriesData = data, options = chart.options, definitions = [].concat(options.categoryAxis), axisIx, axis;\n                if (grouped) {\n                    if (data.length) {\n                        categoriesData = data[0].items;\n                    }\n                }\n                for (axisIx = 0; axisIx < definitions.length; axisIx++) {\n                    axis = definitions[axisIx];\n                    if (axis.autoBind !== false) {\n                        chart._bindCategoryAxis(axis, categoriesData, axisIx);\n                    }\n                }\n            },\n            _bindCategoryAxis: function (axis, data, axisIx) {\n                var count = (data || []).length, categoryIx, category, row;\n                if (axis.field) {\n                    axis.categories = [];\n                    for (categoryIx = 0; categoryIx < count; categoryIx++) {\n                        row = data[categoryIx];\n                        category = getField(axis.field, row);\n                        if (categoryIx === 0) {\n                            axis.categories = [category];\n                            axis.dataItems = [row];\n                        } else {\n                            axis.categories.push(category);\n                            axis.dataItems.push(row);\n                        }\n                    }\n                } else if (this._instance) {\n                    this._instance.bindCategoryAxisFromSeries(axis, axisIx);\n                }\n            },\n            _isBindable: function (series) {\n                var valueFields = SeriesBinder.current.valueFields(series), result = true, field, i;\n                for (i = 0; i < valueFields.length; i++) {\n                    field = valueFields[i];\n                    if (field === VALUE) {\n                        field = 'field';\n                    } else {\n                        field = field + 'Field';\n                    }\n                    if (!defined(series[field])) {\n                        result = false;\n                        break;\n                    }\n                }\n                return result;\n            },\n            _isRtl: function () {\n                return kendo.support.isRtl(this.element) && this.element.css('direction') === RTL;\n            }\n        });\n        var proxyMembers = [\n            'getAxis',\n            'findAxisByName',\n            'plotArea',\n            'toggleHighlight',\n            'showTooltip',\n            'hideTooltip',\n            '_resize',\n            '_redraw',\n            '_noTransitionsRedraw',\n            '_legendItemHover',\n            '_eventCoordinates'\n        ];\n        function createProxyMember(name) {\n            Chart.fn[name] = function () {\n                var instance = this._instance;\n                if (instance) {\n                    return instance[name].apply(instance, arguments);\n                }\n            };\n        }\n        for (var idx = 0; idx < proxyMembers.length; idx++) {\n            createProxyMember(proxyMembers[idx]);\n        }\n        function groupSeries(series, data) {\n            var result = [], nameTemplate, legacyTemplate = series.groupNameTemplate, groupIx, dataLength = data.length, seriesClone;\n            if (dataLength === 0) {\n                seriesClone = deepExtend({}, series);\n                seriesClone.visibleInLegend = false;\n                return [seriesClone];\n            }\n            if (defined(legacyTemplate)) {\n                kendo.logToConsole('\\'groupNameTemplate\\' is obsolete and will be removed in future versions. ' + 'Specify the group name template as \\'series.name\\'');\n                if (legacyTemplate) {\n                    nameTemplate = template(legacyTemplate);\n                }\n            } else {\n                nameTemplate = template(series.name || '');\n                if (nameTemplate._slotCount === 0) {\n                    nameTemplate = template(defined(series.name) ? '#= group.value #: #= series.name #' : '#= group.value #');\n                }\n            }\n            for (groupIx = 0; groupIx < dataLength; groupIx++) {\n                seriesClone = deepExtend({}, series);\n                if (!kendo.isFunction(seriesClone.color)) {\n                    seriesClone.color = undefined;\n                }\n                seriesClone._groupIx = groupIx;\n                seriesClone._groupValue = data[groupIx].value;\n                result.push(seriesClone);\n                if (nameTemplate) {\n                    seriesClone.name = nameTemplate({\n                        series: seriesClone,\n                        group: data[groupIx]\n                    });\n                }\n            }\n            return result;\n        }\n        dataviz.ExportMixin.extend(Chart.fn);\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Chart.fn);\n        }\n        dataviz.ui.plugin(Chart);\n        var SeriesVisibilityState = Class.extend({\n            init: function () {\n                this.groups = {};\n                this.index = {};\n                this.options = {};\n            },\n            applyByGroup: function (series, e) {\n                if (e && e.action || this.options.persistSeriesVisibility) {\n                    for (var idx = 0; idx < series.length; idx++) {\n                        if (this.groups[series[idx]._groupValue] === false) {\n                            series[idx].visible = false;\n                        }\n                    }\n                } else {\n                    this.groups = {};\n                }\n            },\n            applyByIndex: function (series, e) {\n                if (e && e.action || this.options.persistSeriesVisibility) {\n                    if (this.index[series.index] === false) {\n                        series.visible = false;\n                    }\n                } else {\n                    this.index = {};\n                }\n            },\n            save: function (series) {\n                if (!series) {\n                    return;\n                }\n                if (this.options.persistSeriesVisibility) {\n                    this.options.series[series.index].visible = series.visible;\n                } else {\n                    this.saveState(series);\n                }\n            },\n            setOptions: function (options) {\n                this.options = options;\n                this.groups = {};\n                this.index = {};\n            },\n            read: function () {\n                var options = this.options;\n                if (options.persistSeriesVisibility) {\n                    var series = options.series;\n                    for (var idx = 0; idx < series.length; idx++) {\n                        this.saveState(series[idx]);\n                    }\n                }\n            },\n            saveState: function (series) {\n                if (defined(series._groupValue)) {\n                    this.groups[series._groupValue] = series.visible;\n                } else {\n                    this.index[series.index] = series.visible;\n                }\n            }\n        });\n        var geom = kendo.geometry;\n        function normalizeStyle(style) {\n            for (var field in style) {\n                if (style[field] === undefined) {\n                    style[field] = '';\n                }\n            }\n            return style;\n        }\n        var Tooltip = Observable.extend({\n            init: function (chartElement, options) {\n                var tooltip = this;\n                Observable.fn.init.call(tooltip);\n                this.setOptions(options);\n                tooltip.chartElement = chartElement;\n                tooltip.template = Tooltip.template;\n                if (!tooltip.template) {\n                    tooltip.template = Tooltip.template = kendo.template('<div class=\\'k-tooltip k-chart-tooltip#= d.rtl ? \" k-rtl\" : \"\"#\\' ' + 'style=\\'display:none; position: absolute; font: #= d.font #;' + '#if (d.border) {# border: #= d.border.width #px solid; #}#' + 'opacity: #= d.opacity #; filter: alpha(opacity=#= d.opacity * 100 #);\\'>' + '</div>', {\n                        useWithBlock: false,\n                        paramName: 'd'\n                    });\n                }\n                tooltip.element = $(tooltip.template(tooltip.options));\n                tooltip.move = proxy(tooltip.move, tooltip);\n                tooltip._mouseleave = proxy(tooltip._mouseleave, tooltip);\n                var mobileScrollerSelector = kendo.format('[{0}=\\'content\\'],[{0}=\\'scroller\\']', kendo.attr('role'));\n                tooltip._mobileScroller = chartElement.closest(mobileScrollerSelector).data('kendoMobileScroller');\n            },\n            destroy: function () {\n                this._clearShowTimeout();\n                if (this.element) {\n                    this.element.off(MOUSELEAVE_NS).remove();\n                    this.element = null;\n                }\n            },\n            setOptions: function (options) {\n                this.options = deepExtend({}, this.options, options);\n            },\n            options: {\n                opacity: 1,\n                animation: { duration: TOOLTIP_ANIMATION_DURATION },\n                sharedTemplate: '<table>' + '<th colspan=\\'#= colspan #\\'>#= categoryText #</th>' + '# for(var i = 0; i < points.length; i++) { #' + '# var point = points[i]; #' + '<tr>' + '# if(colorMarker) { # ' + '<td><span class=\\'k-chart-shared-tooltip-marker\\' style=\\'background-color:#:point.series.color#\\'></span></td>' + '# } #' + '# if(nameColumn) { # ' + '<td> #if (point.series.name) {# #: point.series.name #: #} else {# &nbsp; #}#</td>' + '# } #' + '<td>#= content(point) #</td>' + '</tr>' + '# } #' + '</table>',\n                categoryFormat: '{0:d}'\n            },\n            move: function () {\n                var tooltip = this, options = tooltip.options, element = tooltip.element, offset;\n                if (!tooltip.anchor || !tooltip.element) {\n                    return;\n                }\n                offset = tooltip._offset();\n                if (!tooltip.visible) {\n                    element.css({\n                        top: offset.top,\n                        left: offset.left\n                    });\n                }\n                tooltip.visible = true;\n                tooltip._ensureElement(document.body);\n                element.stop(true, true).show().animate({\n                    left: offset.left,\n                    top: offset.top\n                }, options.animation.duration);\n            },\n            _clearShowTimeout: function () {\n                if (this.showTimeout) {\n                    clearTimeout(this.showTimeout);\n                    this.showTimeout = null;\n                }\n            },\n            getAnchor: function (size) {\n                var anchor = this.anchor;\n                var point = anchor.point;\n                var align = anchor.align;\n                var x = point.left;\n                var y = point.top;\n                if (align.horizontal === 'center') {\n                    x -= size.width / 2;\n                } else if (align.horizontal === 'right') {\n                    x -= size.width;\n                }\n                if (align.vertical === 'center') {\n                    y -= size.height / 2;\n                } else if (align.vertical === 'bottom') {\n                    y -= size.height;\n                }\n                return {\n                    x: x,\n                    y: y\n                };\n            },\n            _offset: function () {\n                var tooltip = this, size = tooltip._measure(), anchor = tooltip.getAnchor(size), top = anchor.y, left = anchor.x, zoomLevel = kendo.support.zoomLevel(), viewport = $(window), scrollTop = window.pageYOffset || document.documentElement.scrollTop || 0, scrollLeft = window.pageXOffset || document.documentElement.scrollLeft || 0, movable = (this._mobileScroller || {}).movable;\n                if (!movable || movable.scale === 1) {\n                    top += tooltip._fit(top - scrollTop, size.height, outerHeight(viewport) / zoomLevel);\n                    left += tooltip._fit(left - scrollLeft, size.width, outerWidth(viewport) / zoomLevel);\n                } else {\n                    var transform = geom.transform().scale(movable.scale, movable.scale, [\n                        movable.x,\n                        movable.y\n                    ]);\n                    var point = new geom.Point(left, top).transform(transform);\n                    left = point.x;\n                    top = point.y;\n                }\n                return {\n                    top: top,\n                    left: left\n                };\n            },\n            show: function (e) {\n                this.anchor = e.anchor;\n                this.element.css(normalizeStyle(e.style));\n                this.element.toggleClass(TOOLTIP_INVERSE, !!e.className);\n                this.element.toggleClass(SHARED_TOOLTIP_CLASS, !!e.shared);\n                var content = e.shared ? this._sharedContent(e) : this._pointContent(e.point);\n                this.element.html(content);\n                this._clearShowTimeout();\n                this.showTimeout = setTimeout(this.move, TOOLTIP_SHOW_DELAY);\n            },\n            hide: function () {\n                var tooltip = this;\n                clearTimeout(tooltip.showTimeout);\n                tooltip._hideElement();\n                if (tooltip.visible) {\n                    tooltip.point = null;\n                    tooltip.visible = false;\n                    tooltip.index = null;\n                }\n            },\n            _sharedContent: function (e) {\n                var points = e.points;\n                var nameColumn = dataviz.grep(points, function (point) {\n                    return defined(point.series.name);\n                }).length;\n                var colorMarker = e.series.length > 1;\n                var colspan = 1;\n                if (nameColumn) {\n                    colspan++;\n                }\n                if (colorMarker) {\n                    colspan++;\n                }\n                var template = kendo.template(this.options.sharedTemplate);\n                var content = template({\n                    points: points,\n                    category: e.category,\n                    categoryText: e.categoryText,\n                    content: this._pointContent,\n                    colorMarker: colorMarker,\n                    nameColumn: nameColumn,\n                    colspan: colspan\n                });\n                return content;\n            },\n            _measure: function () {\n                this._ensureElement();\n                var size = {\n                    width: outerWidth(this.element),\n                    height: outerHeight(this.element)\n                };\n                return size;\n            },\n            _ensureElement: function () {\n                if (this.element) {\n                    this.element.appendTo(document.body).on(MOUSELEAVE_NS, this._mouseleave);\n                }\n            },\n            _mouseleave: function (e) {\n                var target = e.relatedTarget;\n                var chart = this.chartElement[0];\n                if (target && target !== chart && !$.contains(chart, target)) {\n                    this.trigger(LEAVE);\n                }\n            },\n            _hideElement: function () {\n                var tooltip = this;\n                var element = this.element;\n                if (element) {\n                    element.fadeOut({\n                        always: function () {\n                            if (!tooltip.visible) {\n                                element.off(MOUSELEAVE_NS).remove();\n                            }\n                        }\n                    });\n                }\n            },\n            _pointContent: function (point) {\n                var tooltip = this, options = deepExtend({}, tooltip.options, point.options.tooltip), content, tooltipTemplate;\n                if (defined(point.value)) {\n                    content = point.value.toString();\n                }\n                if (options.template) {\n                    tooltipTemplate = template(options.template);\n                    content = tooltipTemplate({\n                        value: point.value,\n                        category: point.category,\n                        series: point.series,\n                        dataItem: point.dataItem,\n                        percentage: point.percentage,\n                        runningTotal: point.runningTotal,\n                        total: point.total,\n                        low: point.low,\n                        high: point.high,\n                        xLow: point.xLow,\n                        xHigh: point.xHigh,\n                        yLow: point.yLow,\n                        yHigh: point.yHigh\n                    });\n                } else if (options.format) {\n                    content = point.formatValue(options.format);\n                }\n                return content;\n            },\n            _fit: function (offset, size, viewPortSize) {\n                var output = 0;\n                if (offset + size > viewPortSize) {\n                    output = viewPortSize - (offset + size);\n                }\n                if (offset < 0) {\n                    output = -offset;\n                }\n                return output;\n            }\n        });\n        var CrosshairTooltip = Tooltip.extend({\n            init: function (chartElement, options) {\n                Tooltip.fn.init.call(this, chartElement, options);\n                this.element.addClass('k-chart-crosshair-tooltip');\n            },\n            show: function (e) {\n                var element = this.element;\n                if (element) {\n                    this.anchor = e.anchor;\n                    this.element.css(e.style);\n                    this.element.html(this.content(e));\n                    this.move();\n                }\n            },\n            move: function () {\n                var tooltip = this, element = tooltip.element, offset = tooltip._offset();\n                tooltip._ensureElement();\n                element.css({\n                    top: offset.top,\n                    left: offset.left\n                }).show();\n            },\n            content: function (e) {\n                var content = e.value, options = e.crosshair.options.tooltip;\n                if (options.template) {\n                    content = template(options.template)({ value: content });\n                }\n                return content;\n            },\n            hide: function () {\n                this.element.hide();\n            }\n        });\n        var ChartPane = Class.extend({\n            init: function (chart, pane) {\n                this._chart = chart;\n                this._pane = pane;\n                this.visual = pane.visual;\n                this.chartsVisual = pane.chartContainer.visual;\n                this.name = pane.options.name;\n            },\n            series: function () {\n                var chart = this._chart;\n                var seriesByPane = chart._plotArea.groupSeriesByPane();\n                var series = seriesByPane[this.name || 'default'];\n                var result = [];\n                if (series) {\n                    for (var idx = 0; idx < series.length; idx++) {\n                        result.push(new ChartSeries(chart, series[idx]));\n                    }\n                }\n                return result;\n            }\n        });\n        var ChartSeries = Class.extend({\n            init: function (chart, options) {\n                this._chart = chart;\n                this._options = options;\n            },\n            points: function (filter) {\n                var points = this._points;\n                if (!points) {\n                    var series = this._seriesOptions();\n                    var plotArea = this._chart._plotArea;\n                    this._points = points = plotArea.pointsBySeriesIndex(series.index);\n                }\n                if (kendo.isFunction(filter)) {\n                    points = this._filterPoints(points, filter);\n                }\n                return points;\n            },\n            data: function (data) {\n                var series = this._seriesOptions();\n                if (data) {\n                    var chart = this._chart;\n                    var plotArea = chart._plotArea;\n                    series.data = data;\n                    if (series.categoryField) {\n                        var axis = plotArea.seriesCategoryAxis(series);\n                        var options = [].concat(chart.options.categoryAxis);\n                        chart._instance.bindCategoryAxisFromSeries(options[axis.axisIndex], axis.axisIndex);\n                    }\n                    chart._noTransitionsRedraw();\n                    this._clearFields();\n                }\n                return series.data;\n            },\n            findPoint: function (filter) {\n                var points = this.points();\n                for (var idx = 0; idx < points.length; idx++) {\n                    if (filter(points[idx])) {\n                        return points[idx];\n                    }\n                }\n            },\n            toggleHighlight: function (show, elements) {\n                if (!elements) {\n                    elements = this.points();\n                } else if (kendo.isFunction(elements)) {\n                    elements = this.points(elements);\n                } else {\n                    elements = isArray(elements) ? elements : [elements];\n                }\n                this._chart._instance.togglePointsHighlight(show, elements);\n            },\n            toggleVisibility: function (visible, filter) {\n                var chart = this._chart;\n                var seriesOptions = this._seriesOptions();\n                var hasFilter = kendo.isFunction(filter);\n                if (!hasFilter) {\n                    seriesOptions.visible = visible;\n                    chart._seriesVisibility.save(seriesOptions);\n                } else {\n                    if (inArray(seriesOptions.type, [\n                            PIE,\n                            DONUT,\n                            FUNNEL\n                        ])) {\n                        var data = this._filterData(filter);\n                        for (var idx = 0; idx < data.length; idx++) {\n                            data[idx].visible = visible;\n                        }\n                    } else {\n                        seriesOptions.visible = function (data) {\n                            return filter(data.dataItem) ? visible : true;\n                        };\n                    }\n                }\n                chart._noTransitionsRedraw();\n                this._clearFields();\n            },\n            _filterData: function (filter) {\n                var data = this._seriesOptions().data;\n                var length = data.length;\n                var result = [];\n                for (var idx = 0; idx < length; idx++) {\n                    if (filter(data[idx])) {\n                        result.push(data[idx]);\n                    }\n                }\n                return result;\n            },\n            _filterPoints: function (points, filter) {\n                var result = [];\n                var length = points.length;\n                for (var idx = 0; idx < length; idx++) {\n                    if (filter(points[idx])) {\n                        result.push(points[idx]);\n                    }\n                }\n                return result;\n            },\n            _seriesOptions: function () {\n                var series = this._series;\n                if (!series) {\n                    series = this._series = this._chart._seriesOptions(this._options);\n                }\n                return series;\n            },\n            _clearFields: function () {\n                delete this._points;\n                delete this._series;\n            }\n        });\n        function triggerPaneRender(panes) {\n            for (var idx = 0; idx < panes.length; idx++) {\n                panes[idx].notifyRender();\n            }\n        }\n        dataviz.Tooltip = Tooltip;\n        dataviz.CrosshairTooltip = CrosshairTooltip;\n        dataviz.ChartInstanceObserver = ChartInstanceObserver;\n        dataviz.ChartPane = ChartPane;\n        dataviz.ChartSeries = ChartSeries;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.chart', [\n        'dataviz/chart/kendo-chart',\n        'dataviz/chart/chart'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.chart',\n        name: 'Chart',\n        category: 'dataviz',\n        description: 'The Chart widget uses modern browser technologies to render high-quality data visualizations in the browser.',\n        depends: [\n            'data',\n            'userevents',\n            'drawing',\n            'dataviz.core',\n            'dataviz.themes'\n        ],\n        features: [{\n                id: 'dataviz.chart-pdf-export',\n                name: 'PDF export',\n                description: 'Export Chart as PDF',\n                depends: ['pdf']\n            }]\n    };\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/gauge/kendo-gauges', [\n        'kendo.core',\n        'kendo.color',\n        'kendo.drawing',\n        'kendo.dataviz.core'\n    ], f);\n}(function () {\n    (function ($) {\n        window.kendo.dataviz = window.kendo.dataviz || {};\n        var dataviz = kendo.dataviz;\n        var getSpacing = dataviz.getSpacing;\n        var defined = dataviz.defined;\n        var constants = dataviz.constants;\n        var BLACK = constants.BLACK;\n        var COORD_PRECISION = constants.COORD_PRECISION;\n        var services = dataviz.services;\n        var deepExtend = dataviz.deepExtend;\n        var isArray = dataviz.isArray;\n        var setDefaultOptions = dataviz.setDefaultOptions;\n        var NumericAxis = dataviz.NumericAxis;\n        var limitValue = dataviz.limitValue;\n        var Box = dataviz.Box;\n        var interpolateValue = dataviz.interpolateValue;\n        var round = dataviz.round;\n        var drawing = kendo.drawing;\n        var DrawingGroup = drawing.Group;\n        var DrawingPath = drawing.Path;\n        var Animation = drawing.Animation;\n        var AnimationFactory = drawing.AnimationFactory;\n        var geometry = kendo.geometry;\n        var Rect = geometry.Rect;\n        var GeometryPoint = geometry.Point;\n        var transform = geometry.transform;\n        var ANGULAR_SPEED = 150;\n        var LINEAR_SPEED = 250;\n        var ARROW = 'arrow';\n        var ARROW_POINTER = 'arrowPointer';\n        var BAR_POINTER = 'barPointer';\n        var DEFAULT_HEIGHT = 200;\n        var DEFAULT_LINE_WIDTH = 0.5;\n        var DEFAULT_WIDTH = 200;\n        var DEGREE = Math.PI / 180;\n        var INSIDE = 'inside';\n        var LINEAR = 'linear';\n        var OUTSIDE = 'outside';\n        var RADIAL_POINTER = 'radialPointer';\n        var RADIAL_RANGE_POINTER = 'radialRangePointer';\n        function pad(bbox, value) {\n            var origin = bbox.getOrigin();\n            var size = bbox.getSize();\n            var spacing = getSpacing(value);\n            bbox.setOrigin([\n                origin.x - spacing.left,\n                origin.y - spacing.top\n            ]);\n            bbox.setSize([\n                size.width + (spacing.left + spacing.right),\n                size.height + (spacing.top + spacing.bottom)\n            ]);\n            return bbox;\n        }\n        var Group = DrawingGroup;\n        var Path$1 = DrawingPath;\n        var Text = drawing.Text;\n        function buildLabelElement(label, options) {\n            var labelBox = label.box;\n            var textBox = label.children[0].box;\n            var border = options.border || {};\n            var background = options.background || '';\n            var wrapper = Path$1.fromRect(new Rect([\n                labelBox.x1,\n                labelBox.y1\n            ], [\n                labelBox.width(),\n                labelBox.height()\n            ]), { stroke: {} });\n            var text = new Text(label.text, new GeometryPoint(textBox.x1, textBox.y1), {\n                font: options.font,\n                fill: { color: options.color }\n            });\n            var styleGeometry = pad(text.bbox().clone(), options.padding);\n            var styleBox = Path$1.fromRect(styleGeometry, {\n                stroke: {\n                    color: border.width ? border.color : '',\n                    width: border.width,\n                    dashType: border.dashType,\n                    lineJoin: 'round',\n                    lineCap: 'round'\n                },\n                fill: { color: background }\n            });\n            var elements = new Group();\n            elements.append(wrapper);\n            elements.append(styleBox);\n            elements.append(text);\n            return elements;\n        }\n        function getRange(range, min, max) {\n            var from = defined(range.from) ? range.from : constants.MIN_VALUE;\n            var to = defined(range.to) ? range.to : constants.MAX_VALUE;\n            range.from = Math.max(Math.min(to, from), min);\n            range.to = Math.min(Math.max(to, from), max);\n            return range;\n        }\n        function unpad(bbox, value) {\n            var spacing = getSpacing(value);\n            spacing.left = -spacing.left;\n            spacing.top = -spacing.top;\n            spacing.right = -spacing.right;\n            spacing.bottom = -spacing.bottom;\n            return pad(bbox, spacing);\n        }\n        var DEFAULT_MARGIN = 5;\n        var Path = DrawingPath;\n        var Surface = drawing.Surface;\n        var Gauge = dataviz.Class.extend({\n            init: function (element, userOptions, theme, context) {\n                if (context === void 0) {\n                    context = {};\n                }\n                this.element = element;\n                this.theme = theme;\n                this.contextService = new services.ChartService(this, context);\n                this._originalOptions = deepExtend({}, this.options, userOptions);\n                this.options = deepExtend({}, this._originalOptions);\n                this._initTheme(theme);\n                this.redraw();\n            },\n            destroy: function () {\n                if (this.surface) {\n                    this.surface.destroy();\n                    this.surface = null;\n                }\n                delete this.element;\n                delete this.surfaceElement;\n            },\n            value: function (pointerValue) {\n                var pointer = this.pointers[0];\n                if (arguments.length === 0) {\n                    return pointer.value();\n                }\n                pointer.value(pointerValue);\n                this._setValueOptions(pointerValue);\n            },\n            _draw: function () {\n                var surface = this.surface;\n                surface.clear();\n                surface.draw(this._visuals);\n            },\n            exportVisual: function () {\n                return this._visuals;\n            },\n            allValues: function (values) {\n                var pointers = this.pointers;\n                var allValues = [];\n                if (arguments.length === 0) {\n                    for (var i = 0; i < pointers.length; i++) {\n                        allValues.push(pointers[i].value());\n                    }\n                    return allValues;\n                }\n                if (isArray(values)) {\n                    for (var i$1 = 0; i$1 < values.length; i$1++) {\n                        if (dataviz.isNumber(values[i$1])) {\n                            pointers[i$1].value(values[i$1]);\n                        }\n                    }\n                }\n                this._setValueOptions(values);\n            },\n            _setValueOptions: function (values) {\n                var pointers = [].concat(this.options.pointer);\n                var arrayValues = [].concat(values);\n                for (var i = 0; i < arrayValues.length; i++) {\n                    pointers[i].value = arrayValues[i];\n                }\n            },\n            resize: function () {\n                this.noTransitionsRedraw();\n            },\n            noTransitionsRedraw: function () {\n                var transitions = this.options.transitions;\n                this._toggleTransitions(false);\n                this.redraw();\n                this._toggleTransitions(transitions);\n            },\n            redraw: function () {\n                var size = this._surfaceSize();\n                var wrapper = new Rect([\n                    0,\n                    0\n                ], [\n                    size.width,\n                    size.height\n                ]);\n                this._initSurface();\n                this.gaugeArea = this._createGaugeArea();\n                this._createModel();\n                var bbox = unpad(wrapper.bbox(), this._gaugeAreaMargin);\n                this.reflow(bbox);\n            },\n            setOptions: function (options, theme) {\n                this._originalOptions = deepExtend(this._originalOptions, options);\n                this.options = deepExtend({}, this._originalOptions);\n                this._initTheme(theme);\n                this.redraw();\n            },\n            setDirection: function (rtl) {\n                this.contextService.rtl = Boolean(rtl);\n                if (this.surface && this.surface.type === 'svg') {\n                    this.surface.destroy();\n                    this.surface = null;\n                }\n            },\n            setIntlService: function (intl) {\n                this.contextService.intl = intl;\n            },\n            _initTheme: function (theme) {\n                var currentTheme = theme || this.theme || {};\n                this.theme = currentTheme;\n                this.options = deepExtend({}, currentTheme, this.options);\n                var options = this.options;\n                var pointer = options.pointer;\n                if (isArray(pointer)) {\n                    var pointers = [];\n                    for (var i = 0; i < pointer.length; i++) {\n                        pointers.push(deepExtend({}, currentTheme.pointer, pointer[i]));\n                    }\n                    options.pointer = pointers;\n                }\n            },\n            _createGaugeArea: function () {\n                var options = this.options.gaugeArea;\n                var size = this.surface.size();\n                var border = options.border || {};\n                var areaGeometry = new Rect([\n                    0,\n                    0\n                ], [\n                    size.width,\n                    size.height\n                ]);\n                this._gaugeAreaMargin = options.margin || DEFAULT_MARGIN;\n                if (border.width > 0) {\n                    areaGeometry = unpad(areaGeometry, border.width);\n                }\n                var gaugeArea = Path.fromRect(areaGeometry, {\n                    stroke: {\n                        color: border.width ? border.color : '',\n                        width: border.width,\n                        dashType: border.dashType,\n                        lineJoin: 'round',\n                        lineCap: 'round'\n                    },\n                    fill: { color: options.background }\n                });\n                return gaugeArea;\n            },\n            _initSurface: function () {\n                var ref = this;\n                var options = ref.options;\n                var surface = ref.surface;\n                var element = this._surfaceElement();\n                var size = this._surfaceSize();\n                dataviz.elementSize(element, size);\n                if (!surface || surface.options.type !== options.renderAs) {\n                    if (surface) {\n                        surface.destroy();\n                    }\n                    this.surface = Surface.create(element, { type: options.renderAs });\n                } else {\n                    this.surface.clear();\n                    this.surface.resize();\n                }\n            },\n            _surfaceSize: function () {\n                var options = this.options;\n                var size = this._getSize();\n                if (options.gaugeArea) {\n                    deepExtend(size, options.gaugeArea);\n                }\n                return size;\n            },\n            _surfaceElement: function () {\n                if (!this.surfaceElement) {\n                    this.surfaceElement = document.createElement('div');\n                    this.element.appendChild(this.surfaceElement);\n                }\n                return this.surfaceElement;\n            },\n            getSize: function () {\n                return this._getSize();\n            },\n            _getSize: function () {\n                var element = this.element;\n                var defaultSize = this._defaultSize();\n                var width = element.offsetWidth;\n                var height = element.offsetHeight;\n                if (!width) {\n                    width = defaultSize.width;\n                }\n                if (!height) {\n                    height = defaultSize.height;\n                }\n                return {\n                    width: width,\n                    height: height\n                };\n            },\n            _defaultSize: function () {\n                return {\n                    width: DEFAULT_WIDTH,\n                    height: DEFAULT_HEIGHT\n                };\n            },\n            _toggleTransitions: function (value) {\n                var this$1 = this;\n                this.options.transitions = value;\n                for (var i = 0; i < this.pointers.length; i++) {\n                    this$1.pointers[i].options.animation.transitions = value;\n                }\n            }\n        });\n        setDefaultOptions(Gauge, {\n            plotArea: {},\n            theme: 'default',\n            renderAs: '',\n            pointer: {},\n            scale: {},\n            gaugeArea: {}\n        });\n        var Path$2 = DrawingPath;\n        var Group$2 = DrawingGroup;\n        var Point = GeometryPoint;\n        function renderAxisTick(tickRenderOptions, tickOptions) {\n            var position = tickRenderOptions.position;\n            var tickX = tickRenderOptions.tickX;\n            var tickY = tickRenderOptions.tickY;\n            var start, end;\n            if (tickRenderOptions.vertical) {\n                start = new Point(tickX, position);\n                end = new Point(tickX + tickOptions.size, position);\n            } else {\n                start = new Point(position, tickY);\n                end = new Point(position, tickY + tickOptions.size);\n            }\n            var tickPath = new Path$2({\n                stroke: {\n                    color: tickOptions.color,\n                    width: tickOptions.width\n                }\n            }).moveTo(start).lineTo(end);\n            return tickPath;\n        }\n        function renderTicks(tickGroup, tickPositions, tickRenderOptions, tickOptions) {\n            var count = tickPositions.length;\n            if (tickOptions.visible) {\n                var mirror = tickRenderOptions.mirror;\n                var lineBox = tickRenderOptions.lineBox;\n                for (var i = tickOptions.skip; i < count; i += tickOptions.step) {\n                    if (i % tickOptions.skipUnit === 0) {\n                        continue;\n                    }\n                    tickRenderOptions.tickX = mirror ? lineBox.x2 : lineBox.x2 - tickOptions.size;\n                    tickRenderOptions.tickY = mirror ? lineBox.y1 - tickOptions.size : lineBox.y1;\n                    tickRenderOptions.position = tickPositions[i];\n                    tickGroup.append(renderAxisTick(tickRenderOptions, tickOptions));\n                }\n            }\n        }\n        var LinearScale = NumericAxis.extend({\n            init: function (options, service) {\n                var scaleOptions = options || {};\n                if (!defined(scaleOptions.reverse) && scaleOptions.vertical === false && (service || {}).rtl) {\n                    scaleOptions = $.extend({}, scaleOptions, { reverse: true });\n                }\n                NumericAxis.fn.init.call(this, 0, 1, scaleOptions, service);\n                this.options.minorUnit = this.options.minorUnit || this.options.majorUnit / 10;\n            },\n            initUserOptions: function (options) {\n                var scaleOptions = deepExtend({}, this.options, options);\n                scaleOptions = deepExtend({}, scaleOptions, { labels: { mirror: scaleOptions.mirror } });\n                scaleOptions.majorUnit = scaleOptions.majorUnit || dataviz.autoMajorUnit(scaleOptions.min, scaleOptions.max);\n                return scaleOptions;\n            },\n            initFields: function () {\n            },\n            render: function () {\n                var elements = this.elements = new Group$2();\n                var labels = this.renderLabels();\n                var scaleLine = this.renderLine();\n                var scaleTicks = this.renderTicks();\n                var ranges = this.renderRanges();\n                elements.append(scaleLine, labels, scaleTicks, ranges);\n                return elements;\n            },\n            renderRanges: function () {\n                var this$1 = this;\n                var options = this.options;\n                var min = options.min;\n                var max = options.max;\n                var vertical = options.vertical;\n                var mirror = options.labels.mirror;\n                var ranges = options.ranges || [];\n                var elements = new Group$2();\n                var count = ranges.length;\n                var rangeSize = options.rangeSize || options.minorTicks.size / 2;\n                for (var i = 0; i < count; i++) {\n                    var range = getRange(ranges[i], min, max);\n                    var slot = this$1.getSlot(range.from, range.to);\n                    var slotX = vertical ? this$1.lineBox() : slot;\n                    var slotY = vertical ? slot : this$1.lineBox();\n                    if (vertical) {\n                        slotX.x1 -= rangeSize * (mirror ? -1 : 1);\n                    } else {\n                        slotY.y2 += rangeSize * (mirror ? -1 : 1);\n                    }\n                    elements.append(Path$2.fromRect(new Rect([\n                        slotX.x1,\n                        slotY.y1\n                    ], [\n                        slotX.x2 - slotX.x1,\n                        slotY.y2 - slotY.y1\n                    ]), {\n                        fill: {\n                            color: range.color,\n                            opacity: range.opacity\n                        },\n                        stroke: {}\n                    }));\n                }\n                return elements;\n            },\n            renderLabels: function () {\n                var ref = this;\n                var labels = ref.labels;\n                var options = ref.options;\n                var elements = new Group$2();\n                for (var i = 0; i < labels.length; i++) {\n                    elements.append(buildLabelElement(labels[i], options.labels));\n                }\n                return elements;\n            },\n            renderLine: function () {\n                var line = this.options.line;\n                var lineBox = this.lineBox();\n                var elements = new Group$2();\n                if (line.width > 0 && line.visible) {\n                    var linePath = new Path$2({\n                        stroke: {\n                            color: line.color,\n                            dashType: line.dashType,\n                            width: line.width\n                        }\n                    });\n                    linePath.moveTo(lineBox.x1, lineBox.y1).lineTo(lineBox.x2, lineBox.y2);\n                    elements.append(linePath);\n                }\n                return elements;\n            },\n            renderTicks: function () {\n                var ticks = new Group$2();\n                var options = this.options;\n                var majorUnit = options.majorTicks.visible ? options.majorUnit : 0;\n                var tickRenderOptions = {\n                    vertical: options.vertical,\n                    mirror: options.labels.mirror,\n                    lineBox: this.lineBox()\n                };\n                renderTicks(ticks, this.getMajorTickPositions(), tickRenderOptions, options.majorTicks);\n                renderTicks(ticks, this.getMinorTickPositions(), tickRenderOptions, deepExtend({}, { skipUnit: majorUnit / options.minorUnit }, options.minorTicks));\n                return ticks;\n            }\n        });\n        setDefaultOptions(LinearScale, {\n            min: 0,\n            max: 50,\n            majorTicks: {\n                size: 15,\n                align: INSIDE,\n                color: BLACK,\n                width: DEFAULT_LINE_WIDTH,\n                visible: true\n            },\n            minorTicks: {\n                size: 10,\n                align: INSIDE,\n                color: BLACK,\n                width: DEFAULT_LINE_WIDTH,\n                visible: true\n            },\n            line: { width: DEFAULT_LINE_WIDTH },\n            labels: {\n                position: INSIDE,\n                padding: 2\n            },\n            mirror: false,\n            _alignLines: false\n        });\n        var Pointer = dataviz.Class.extend({\n            init: function (scale, userOptions) {\n                var ref = scale.options;\n                var min = ref.min;\n                var max = ref.max;\n                var options = this.options = deepExtend({}, this.options, userOptions);\n                options.fill = options.color;\n                this.scale = scale;\n                if (defined(options.value)) {\n                    options.value = limitValue(options.value, min, max);\n                } else {\n                    options.value = min;\n                }\n            },\n            value: function (newValue) {\n                var options = this.options;\n                var value = options.value;\n                if (arguments.length === 0) {\n                    return value;\n                }\n                var ref = this.scale.options;\n                var min = ref.min;\n                var max = ref.max;\n                options._oldValue = defined(options._oldValue) ? options.value : min;\n                options.value = limitValue(newValue, min, max);\n                if (this.elements) {\n                    this.repaint();\n                }\n            }\n        });\n        setDefaultOptions(Pointer, { color: BLACK });\n        var LinearPointer = Pointer.extend({\n            init: function (scale, options) {\n                Pointer.fn.init.call(this, scale, options);\n                this.options = deepExtend({ track: { visible: defined(options.track) } }, this.options);\n            },\n            reflow: function () {\n                var ref = this;\n                var options = ref.options;\n                var scale = ref.scale;\n                var ref$1 = scale.options;\n                var mirror = ref$1.mirror;\n                var vertical = ref$1.vertical;\n                var scaleLine = scale.lineBox();\n                var trackSize = options.track.size || options.size;\n                var pointerHalfSize = options.size / 2;\n                var margin = getSpacing(options.margin);\n                var space = vertical ? margin[mirror ? 'left' : 'right'] : margin[mirror ? 'bottom' : 'top'];\n                var pointerBox, pointerRangeBox, trackBox;\n                space = mirror ? -space : space;\n                if (vertical) {\n                    trackBox = new Box(scaleLine.x1 + space, scaleLine.y1, scaleLine.x1 + space, scaleLine.y2);\n                    if (mirror) {\n                        trackBox.x1 -= trackSize;\n                    } else {\n                        trackBox.x2 += trackSize;\n                    }\n                    if (options.shape !== BAR_POINTER) {\n                        pointerRangeBox = new Box(scaleLine.x2 + space, scaleLine.y1 - pointerHalfSize, scaleLine.x2 + space, scaleLine.y2 + pointerHalfSize);\n                        pointerBox = pointerRangeBox;\n                    }\n                } else {\n                    trackBox = new Box(scaleLine.x1, scaleLine.y1 - space, scaleLine.x2, scaleLine.y1 - space);\n                    if (mirror) {\n                        trackBox.y2 += trackSize;\n                    } else {\n                        trackBox.y1 -= trackSize;\n                    }\n                    if (options.shape !== BAR_POINTER) {\n                        pointerRangeBox = new Box(scaleLine.x1 - pointerHalfSize, scaleLine.y1 - space, scaleLine.x2 + pointerHalfSize, scaleLine.y1 - space);\n                        pointerBox = pointerRangeBox;\n                    }\n                }\n                this.trackBox = trackBox;\n                this.pointerRangeBox = pointerRangeBox;\n                this.box = pointerBox || trackBox.clone().pad(options.border.width);\n            },\n            getElementOptions: function () {\n                var options = this.options;\n                return {\n                    fill: {\n                        color: options.color,\n                        opacity: options.opacity\n                    },\n                    stroke: defined(options.border) ? {\n                        color: options.border.width ? options.border.color || options.color : '',\n                        width: options.border.width,\n                        dashType: options.border.dashType,\n                        opacity: options.opacity\n                    } : null\n                };\n            },\n            _margin: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var ref$1 = scale.options;\n                var mirror = ref$1.mirror;\n                var vertical = ref$1.vertical;\n                var margin = getSpacing(options.margin);\n                var space = vertical ? margin[mirror ? 'left' : 'right'] : margin[mirror ? 'bottom' : 'top'];\n                return space;\n            }\n        });\n        setDefaultOptions(LinearPointer, {\n            shape: BAR_POINTER,\n            track: { border: { width: 1 } },\n            color: BLACK,\n            border: { width: 1 },\n            opacity: 1,\n            margin: getSpacing(3),\n            animation: { type: BAR_POINTER },\n            visible: true\n        });\n        var ArrowLinearPointerAnimation = Animation.extend({\n            setup: function () {\n                var options = this.options;\n                var margin = options.margin;\n                var from = options.from;\n                var to = options.to;\n                var vertical = options.vertical;\n                var axis = vertical ? 'x1' : 'y1';\n                if (options.mirror === vertical) {\n                    from[axis] -= margin;\n                    to[axis] -= margin;\n                } else {\n                    from[axis] += margin;\n                    to[axis] += margin;\n                }\n                var fromScale = this.fromScale = new GeometryPoint(from.x1, from.y1);\n                var toScale = this.toScale = new GeometryPoint(to.x1, to.y1);\n                if (options.duration !== 0) {\n                    options.duration = Math.max(fromScale.distanceTo(toScale) / options.duration * 1000, 1);\n                }\n            },\n            step: function (pos) {\n                var translateX = interpolateValue(this.fromScale.x, this.toScale.x, pos);\n                var translateY = interpolateValue(this.fromScale.y, this.toScale.y, pos);\n                this.element.transform(transform().translate(translateX, translateY));\n            }\n        });\n        setDefaultOptions(ArrowLinearPointerAnimation, {\n            easing: LINEAR,\n            duration: LINEAR_SPEED\n        });\n        AnimationFactory.current.register(ARROW_POINTER, ArrowLinearPointerAnimation);\n        var Point$1 = GeometryPoint;\n        var Path$3 = DrawingPath;\n        var ArrowLinearPointer = LinearPointer.extend({\n            init: function (scale, options) {\n                LinearPointer.fn.init.call(this, scale, options);\n                if (!defined(this.options.size)) {\n                    this.options.size = this.scale.options.majorTicks.size * 0.6;\n                }\n            },\n            pointerShape: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var size = ref.options.size;\n                var halfSize = size / 2;\n                var sign = scale.options.mirror ? -1 : 1;\n                var shape;\n                if (scale.options.vertical) {\n                    shape = [\n                        new Point$1(0, 0 - halfSize),\n                        new Point$1(0 - sign * size, 0),\n                        new Point$1(0, 0 + halfSize)\n                    ];\n                } else {\n                    shape = [\n                        new Point$1(0 - halfSize, 0),\n                        new Point$1(0, 0 + sign * size),\n                        new Point$1(0 + halfSize, 0)\n                    ];\n                }\n                return shape;\n            },\n            repaint: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var animation = new ArrowLinearPointerAnimation(this.elements, deepExtend(options.animation, {\n                    vertical: scale.options.vertical,\n                    mirror: scale.options.mirror,\n                    margin: this._margin(options.margin),\n                    from: scale.getSlot(options._oldValue),\n                    to: scale.getSlot(options.value)\n                }));\n                if (options.animation.transitions === false) {\n                    animation.options.duration = 0;\n                }\n                animation.setup();\n                animation.play();\n            },\n            render: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var elementOptions = this.getElementOptions();\n                var shape = this.pointerShape(options.value);\n                options.animation.type = ARROW_POINTER;\n                var elements = new Path$3({\n                    stroke: elementOptions.stroke,\n                    fill: elementOptions.fill\n                }).moveTo(shape[0]).lineTo(shape[1]).lineTo(shape[2]).close();\n                var slot = scale.getSlot(options.value);\n                elements.transform(transform().translate(slot.x1, slot.y1));\n                this.elements = elements;\n                return elements;\n            }\n        });\n        var BarLinearPointerAnimation = Animation.extend({\n            setup: function () {\n                var options = this.options;\n                var axis = this.axis = options.vertical ? constants.Y : constants.X;\n                var to = this.to = options.newPoints[0][axis];\n                var from = this.from = options.oldPoints[0][axis];\n                if (options.duration !== 0) {\n                    options.duration = Math.max(Math.abs(to - from) / options.speed * 1000, 1);\n                }\n                this._set(from);\n            },\n            step: function (pos) {\n                var value = interpolateValue(this.from, this.to, pos);\n                this._set(value);\n            },\n            _set: function (value) {\n                var setter = 'set' + this.axis.toUpperCase();\n                var points = this.options.newPoints;\n                points[0][setter](value);\n                points[1][setter](value);\n            }\n        });\n        setDefaultOptions(BarLinearPointerAnimation, {\n            easing: LINEAR,\n            speed: LINEAR_SPEED\n        });\n        AnimationFactory.current.register(BAR_POINTER, BarLinearPointerAnimation);\n        var Group$3 = DrawingGroup;\n        var Path$4 = DrawingPath;\n        var BarLinearPointer = LinearPointer.extend({\n            init: function (scale, options) {\n                LinearPointer.fn.init.call(this, scale, options);\n                if (!defined(this.options.size)) {\n                    this.options.size = this.scale.options.majorTicks.size * 0.3;\n                }\n            },\n            pointerShape: function (value) {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var ref$1 = scale.options;\n                var mirror = ref$1.mirror;\n                var vertical = ref$1.vertical;\n                var dir = mirror === vertical ? -1 : 1;\n                var size = options.size * dir;\n                var minSlot = scale.getSlot(scale.options.min);\n                var slot = scale.getSlot(value);\n                var axis = vertical ? constants.Y : constants.X;\n                var sizeAxis = vertical ? constants.X : constants.Y;\n                var margin = this._margin() * dir;\n                var p1 = new GeometryPoint();\n                p1[axis] = minSlot[axis + '1'];\n                p1[sizeAxis] = minSlot[sizeAxis + '1'];\n                var p2 = new GeometryPoint();\n                p2[axis] = slot[axis + '1'];\n                p2[sizeAxis] = slot[sizeAxis + '1'];\n                if (vertical) {\n                    p1.translate(margin, 0);\n                    p2.translate(margin, 0);\n                } else {\n                    p1.translate(0, margin);\n                    p2.translate(0, margin);\n                }\n                var p3 = p2.clone();\n                var p4 = p1.clone();\n                if (vertical) {\n                    p3.translate(size, 0);\n                    p4.translate(size, 0);\n                } else {\n                    p3.translate(0, size);\n                    p4.translate(0, size);\n                }\n                return [\n                    p1,\n                    p2,\n                    p3,\n                    p4\n                ];\n            },\n            repaint: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var shape = this.pointerShape(options.value);\n                var pointerPath = this.pointerPath;\n                var oldShape = this.pointerShape(options._oldValue);\n                pointerPath.moveTo(shape[0]).lineTo(shape[1]).lineTo(shape[2]).lineTo(shape[3]).close();\n                var animation = new BarLinearPointerAnimation(pointerPath, deepExtend(options.animation, {\n                    reverse: scale.options.reverse,\n                    vertical: scale.options.vertical,\n                    oldPoints: [\n                        oldShape[1],\n                        oldShape[2]\n                    ],\n                    newPoints: [\n                        shape[1],\n                        shape[2]\n                    ]\n                }));\n                if (options.animation.transitions === false) {\n                    animation.options.duration = 0;\n                }\n                animation.setup();\n                animation.play();\n            },\n            render: function () {\n                var group = new Group$3();\n                var elementOptions = this.getElementOptions();\n                if (this.options.track.visible) {\n                    group.append(this.renderTrack());\n                }\n                var pointer = this.pointerPath = new Path$4({\n                    stroke: elementOptions.stroke,\n                    fill: elementOptions.fill\n                });\n                group.append(pointer);\n                this.elements = group;\n                return group;\n            },\n            renderTrack: function () {\n                var trackOptions = this.options.track;\n                var border = trackOptions.border || {};\n                var trackBox = this.trackBox.clone().pad(border.width || 0);\n                return new Path$4.fromRect(trackBox.toRect(), {\n                    fill: {\n                        color: trackOptions.color,\n                        opacity: trackOptions.opacity\n                    },\n                    stroke: {\n                        color: border.width ? border.color || trackOptions.color : '',\n                        width: border.width,\n                        dashType: border.dashType\n                    }\n                });\n            }\n        });\n        var DEFAULT_MIN_WIDTH = 60;\n        var DEFAULT_MIN_HEIGHT = 60;\n        var Group$1 = DrawingGroup;\n        var LinearGauge = Gauge.extend({\n            reflow: function (bbox) {\n                var pointers = this.pointers;\n                var bboxX = bbox.origin.x;\n                var bboxY = bbox.origin.y;\n                var box = new Box(bboxX, bboxY, bboxX + bbox.width(), bboxY + bbox.height());\n                this.scale.reflow(box);\n                this._shrinkScaleWidth(box);\n                for (var i = 0; i < pointers.length; i++) {\n                    pointers[i].reflow();\n                }\n                this.bbox = this._getBox(box);\n                this._alignElements();\n                this._shrinkElements();\n                this._buildVisual();\n                this._draw();\n            },\n            _buildVisual: function () {\n                var visuals = new Group$1();\n                var scaleElements = this.scale.render();\n                var pointers = this.pointers;\n                visuals.append(this.gaugeArea);\n                visuals.append(scaleElements);\n                for (var i = 0; i < pointers.length; i++) {\n                    var current = pointers[i];\n                    visuals.append(current.render());\n                    current.value(current.options.value);\n                }\n                this._visuals = visuals;\n            },\n            _createModel: function () {\n                var this$1 = this;\n                var options = this.options;\n                var scale = this.scale = new LinearScale(options.scale, this.contextService);\n                this.pointers = [];\n                var pointers = options.pointer;\n                pointers = isArray(pointers) ? pointers : [pointers];\n                for (var i = 0; i < pointers.length; i++) {\n                    var currentOptions = deepExtend({}, pointers[i], { animation: { transitions: options.transitions } });\n                    var pointerType = currentOptions.shape === ARROW ? ArrowLinearPointer : BarLinearPointer;\n                    this$1.pointers.push(new pointerType(scale, currentOptions));\n                }\n            },\n            _defaultSize: function () {\n                var vertical = this.options.scale.vertical;\n                return {\n                    width: vertical ? DEFAULT_MIN_WIDTH : DEFAULT_WIDTH,\n                    height: vertical ? DEFAULT_HEIGHT : DEFAULT_MIN_HEIGHT\n                };\n            },\n            _getBox: function (box) {\n                var ref = this;\n                var scale = ref.scale;\n                var pointers = ref.pointers;\n                var boxCenter = box.center();\n                var plotAreaBox = pointers[0].box.clone().wrap(scale.box);\n                for (var i = 0; i < pointers.length; i++) {\n                    plotAreaBox.wrap(pointers[i].box.clone());\n                }\n                var size;\n                if (scale.options.vertical) {\n                    size = plotAreaBox.width() / 2;\n                    plotAreaBox = new Box(boxCenter.x - size, box.y1, boxCenter.x + size, box.y2);\n                } else {\n                    size = plotAreaBox.height() / 2;\n                    plotAreaBox = new Box(box.x1, boxCenter.y - size, box.x2, boxCenter.y + size);\n                }\n                return plotAreaBox;\n            },\n            _alignElements: function () {\n                var this$1 = this;\n                var ref = this;\n                var scale = ref.scale;\n                var pointers = ref.pointers;\n                var scaleBox = scale.box;\n                var box = pointers[0].box.clone().wrap(scale.box);\n                var plotAreaBox = this.bbox;\n                for (var i = 0; i < pointers.length; i++) {\n                    box.wrap(pointers[i].box.clone());\n                }\n                var diff;\n                if (scale.options.vertical) {\n                    diff = plotAreaBox.center().x - box.center().x;\n                    scale.reflow(new Box(scaleBox.x1 + diff, plotAreaBox.y1, scaleBox.x2 + diff, plotAreaBox.y2));\n                } else {\n                    diff = plotAreaBox.center().y - box.center().y;\n                    scale.reflow(new Box(scaleBox.x1, scaleBox.y1 + diff, scaleBox.x2, scaleBox.y2 + diff));\n                }\n                for (var i$1 = 0; i$1 < pointers.length; i$1++) {\n                    pointers[i$1].reflow(this$1.bbox);\n                }\n            },\n            _shrinkScaleWidth: function (bbox) {\n                var ref = this;\n                var scale = ref.scale;\n                if (!scale.options.vertical) {\n                    var overflow = scale.contentBox().width() - bbox.width();\n                    if (overflow > 0) {\n                        scale.box.shrink(overflow, 0);\n                        scale.box.alignTo(bbox, 'center');\n                        scale.reflow(scale.box);\n                    }\n                }\n            },\n            _shrinkElements: function () {\n                var this$1 = this;\n                var ref = this;\n                var scale = ref.scale;\n                var pointers = ref.pointers;\n                var scaleBox = scale.box.clone();\n                var pos = scale.options.vertical ? 'y' : 'x';\n                var pointerBox = pointers[0].box;\n                for (var i = 0; i < pointers.length; i++) {\n                    pointerBox.wrap(pointers[i].box.clone());\n                }\n                scaleBox[pos + 1] += Math.max(scaleBox[pos + 1] - pointerBox[pos + 1], 0);\n                scaleBox[pos + 2] -= Math.max(pointerBox[pos + 2] - scaleBox[pos + 2], 0);\n                scale.reflow(scaleBox);\n                for (var i$1 = 0; i$1 < pointers.length; i$1++) {\n                    pointers[i$1].reflow(this$1.bbox);\n                }\n            }\n        });\n        setDefaultOptions(LinearGauge, {\n            transitions: true,\n            gaugeArea: { background: '' },\n            scale: { vertical: true }\n        });\n        var GEO_ARC_ADJUST_ANGLE = 180;\n        var Arc = drawing.Arc;\n        var Path$5 = DrawingPath;\n        var Group$5 = DrawingGroup;\n        function drawTicks(arc, tickAngles, unit, tickOptions) {\n            var ticks = new Group$5();\n            var center = arc.center;\n            var radius = arc.getRadiusX();\n            if (tickOptions.visible) {\n                for (var i = 0; i < tickAngles.length; i++) {\n                    var tickStart = arc.pointAt(tickAngles[i]);\n                    var tickEnd = new GeometryPoint(center.x + radius - tickOptions.size, center.y).rotate(tickAngles[i], center);\n                    ticks.append(new Path$5({\n                        stroke: {\n                            color: tickOptions.color,\n                            width: tickOptions.width\n                        }\n                    }).moveTo(tickStart).lineTo(tickEnd));\n                }\n            }\n            return ticks;\n        }\n        function rangeSegment(from, to, color, opacity) {\n            return {\n                from: from,\n                to: to,\n                color: color,\n                opacity: opacity\n            };\n        }\n        var RadialScale = NumericAxis.extend({\n            init: function (options, service) {\n                NumericAxis.fn.init.call(this, 0, 1, options, service);\n            },\n            initUserOptions: function (options) {\n                var scaleOptions = deepExtend({}, this.options, options);\n                scaleOptions.majorUnit = scaleOptions.majorUnit || dataviz.autoMajorUnit(scaleOptions.min, scaleOptions.max);\n                scaleOptions.minorUnit = scaleOptions.minorUnit || scaleOptions.majorUnit / 10;\n                return scaleOptions;\n            },\n            initFields: function () {\n            },\n            render: function (center, radius) {\n                var arc = this.renderArc(center, radius);\n                this.bbox = arc.bbox();\n                this.labelElements = this.renderLabels();\n                this.ticks = this.renderTicks();\n                this.ranges = this.renderRanges();\n            },\n            reflow: function (bbox) {\n                var center = bbox.center();\n                var radius = Math.min(bbox.height(), bbox.width()) / 2;\n                if (defined(this.bbox)) {\n                    this.bbox = this.arc.bbox();\n                    this.radius(this.arc.getRadiusX());\n                    this.repositionRanges();\n                    this.renderLabels();\n                } else {\n                    return this.render(center, radius);\n                }\n            },\n            slotAngle: function (value) {\n                var ref = this.options;\n                var min = ref.min;\n                var max = ref.max;\n                var reverse = ref.reverse;\n                var startAngle = ref.startAngle;\n                var endAngle = ref.endAngle;\n                var angle = endAngle - startAngle;\n                var result;\n                if (reverse) {\n                    result = endAngle - (value - min) / (max - min) * angle;\n                } else {\n                    result = (value - min) / (max - min) * angle + startAngle;\n                }\n                return result + GEO_ARC_ADJUST_ANGLE;\n            },\n            hasRanges: function () {\n                var ranges = this.options.ranges;\n                return ranges && ranges.length;\n            },\n            ticksSize: function () {\n                var ref = this.options;\n                var majorTicks = ref.majorTicks;\n                var minorTicks = ref.minorTicks;\n                var size = 0;\n                if (majorTicks.visible) {\n                    size = majorTicks.size;\n                }\n                if (minorTicks.visible) {\n                    size = Math.max(minorTicks.size, size);\n                }\n                return size;\n            },\n            renderLabels: function () {\n                var this$1 = this;\n                var options = this.options;\n                var arc = this.arc.clone();\n                var radius = arc.getRadiusX();\n                var tickAngles = this.tickAngles(arc, options.majorUnit);\n                var rangeSize = options.rangeSize = options.rangeSize || radius * 0.1;\n                var labelsGroup = new Group$5();\n                var rangeDistance = radius * 0.05;\n                if (defined(options.rangeDistance)) {\n                    rangeDistance = options.rangeDistance;\n                } else {\n                    options.rangeDistance = rangeDistance;\n                }\n                var labelsOptions = options.labels;\n                var isInside = labelsOptions.position === INSIDE;\n                var hasLabelElements = defined(this.labelElements);\n                if (isInside) {\n                    radius -= this.ticksSize();\n                    if (this.hasRanges() && !hasLabelElements) {\n                        radius -= rangeSize + rangeDistance;\n                    }\n                    arc.setRadiusX(radius).setRadiusY(radius);\n                }\n                var labels = this.labels;\n                var count = labels.length;\n                var padding = labelsOptions.padding;\n                for (var i = 0; i < count; i++) {\n                    var label = labels[i];\n                    var halfWidth = label.box.width() / 2;\n                    var halfHeight = label.box.height() / 2;\n                    var angle = tickAngles[i];\n                    var labelAngle = (angle - GEO_ARC_ADJUST_ANGLE) * DEGREE;\n                    var lp = arc.pointAt(angle);\n                    var cx = lp.x + Math.cos(labelAngle) * (halfWidth + padding) * (isInside ? 1 : -1);\n                    var cy = lp.y + Math.sin(labelAngle) * (halfHeight + padding) * (isInside ? 1 : -1);\n                    label.reflow(new Box(cx - halfWidth, cy - halfHeight, cx + halfWidth, cy + halfHeight));\n                    var labelPos = new GeometryPoint(label.box.x1, label.box.y1);\n                    var labelElement = void 0;\n                    if (!hasLabelElements) {\n                        labelElement = buildLabelElement(label, options.labels);\n                        labelsGroup.append(labelElement);\n                    } else {\n                        labelElement = this$1.labelElements.children[i];\n                        var prevLabelPos = labelElement.bbox().origin;\n                        var labelTransform = labelElement.transform() || transform();\n                        labelTransform.translate(labelPos.x - prevLabelPos.x, labelPos.y - prevLabelPos.y);\n                        labelElement.transform(labelTransform);\n                    }\n                    this$1.bbox = Rect.union(this$1.bbox, labelElement.bbox());\n                }\n                return labelsGroup;\n            },\n            repositionRanges: function () {\n                var ranges = this.ranges.children;\n                if (ranges.length > 0) {\n                    var ref = this.options;\n                    var rangeDistance = ref.rangeDistance;\n                    var rangeSize = ref.rangeSize;\n                    var rangeRadius = this.getRangeRadius();\n                    if (this.options.labels.position === INSIDE) {\n                        rangeRadius += rangeSize + rangeDistance;\n                    }\n                    var newRadius = rangeRadius + rangeSize / 2;\n                    for (var i = 0; i < ranges.length; i++) {\n                        ranges[i]._geometry.setRadiusX(newRadius).setRadiusY(newRadius);\n                    }\n                    this.bbox = Rect.union(this.bbox, this.ranges.bbox());\n                }\n            },\n            renderRanges: function () {\n                var this$1 = this;\n                var segments = this.rangeSegments();\n                var segmentsCount = segments.length;\n                var result = new Group$5();\n                if (segmentsCount) {\n                    var ref = this.options;\n                    var rangeSize = ref.rangeSize;\n                    var reverse = ref.reverse;\n                    var rangeDistance = ref.rangeDistance;\n                    var rangeRadius = this.getRangeRadius();\n                    this.radius(this.radius() - rangeSize - rangeDistance);\n                    for (var i = 0; i < segmentsCount; i++) {\n                        var segment = segments[i];\n                        var from = this$1.slotAngle(segment[reverse ? 'to' : 'from']);\n                        var to = this$1.slotAngle(segment[!reverse ? 'to' : 'from']);\n                        if (to - from !== 0) {\n                            result.append(this$1.createRange(from, to, rangeRadius, segment));\n                        }\n                    }\n                }\n                return result;\n            },\n            createRange: function (startAngle, endAngle, rangeRadius, options) {\n                var rangeSize = this.options.rangeSize;\n                var rangeGeom = new geometry.Arc(this.arc.center, {\n                    radiusX: rangeRadius + rangeSize / 2,\n                    radiusY: rangeRadius + rangeSize / 2,\n                    startAngle: startAngle,\n                    endAngle: endAngle\n                });\n                return new Arc(rangeGeom, {\n                    stroke: {\n                        width: rangeSize,\n                        color: options.color,\n                        opacity: options.opacity,\n                        lineCap: options.lineCap\n                    }\n                });\n            },\n            rangeSegments: function () {\n                var options = this.options;\n                var ranges = options.ranges || [];\n                var count = ranges.length;\n                var segments = [];\n                if (count) {\n                    var min = options.min;\n                    var max = options.max;\n                    var defaultColor = options.rangePlaceholderColor;\n                    segments.push(rangeSegment(min, max, defaultColor));\n                    for (var i = 0; i < count; i++) {\n                        var range = getRange(ranges[i], min, max);\n                        var segmentsCount = segments.length;\n                        for (var j = 0; j < segmentsCount; j++) {\n                            var segment = segments[j];\n                            if (segment.from <= range.from && range.from <= segment.to) {\n                                segments.push(rangeSegment(range.from, range.to, range.color, range.opacity));\n                                if (segment.from <= range.to && range.to <= segment.to) {\n                                    segments.push(rangeSegment(range.to, segment.to, defaultColor, range.opacity));\n                                }\n                                segment.to = range.from;\n                                break;\n                            }\n                        }\n                    }\n                }\n                return segments;\n            },\n            getRangeRadius: function () {\n                var ref = this;\n                var arc = ref.arc;\n                var options = ref.options;\n                var rangeSize = options.rangeSize;\n                var rangeDistance = options.rangeDistance;\n                var majorTickSize = options.majorTicks.size;\n                var radius;\n                if (options.labels.position === OUTSIDE) {\n                    radius = arc.getRadiusX() - majorTickSize - rangeDistance - rangeSize;\n                } else {\n                    radius = arc.getRadiusX() - rangeSize;\n                }\n                return radius;\n            },\n            renderArc: function (center, radius) {\n                var options = this.options;\n                var arc = this.arc = new geometry.Arc(center, {\n                    radiusX: radius,\n                    radiusY: radius,\n                    startAngle: options.startAngle + GEO_ARC_ADJUST_ANGLE,\n                    endAngle: options.endAngle + GEO_ARC_ADJUST_ANGLE\n                });\n                return arc;\n            },\n            renderTicks: function () {\n                var ref = this;\n                var arc = ref.arc;\n                var options = ref.options;\n                var tickArc = arc.clone();\n                this.majorTickAngles = this.tickAngles(arc, options.majorUnit);\n                this.majorTicks = drawTicks(tickArc, this.majorTickAngles, options.majorUnit, options.majorTicks);\n                var allTicks = new Group$5();\n                allTicks.append(this.majorTicks);\n                var majorTickSize = options.majorTicks.size;\n                var minorTickSize = options.minorTicks.size;\n                this._tickDifference = majorTickSize - minorTickSize;\n                if (options.labels.position === OUTSIDE) {\n                    var radius = tickArc.getRadiusX();\n                    tickArc.setRadiusX(radius - majorTickSize + minorTickSize).setRadiusY(radius - majorTickSize + minorTickSize);\n                }\n                this.minorTickAngles = this.normalizeTickAngles(this.tickAngles(arc, options.minorUnit));\n                this.minorTicks = drawTicks(tickArc, this.minorTickAngles, options.minorUnit, options.minorTicks);\n                allTicks.append(this.minorTicks);\n                return allTicks;\n            },\n            normalizeTickAngles: function (angles) {\n                var options = this.options;\n                var skip = options.majorUnit / options.minorUnit;\n                for (var i = angles.length - 1; i >= 0; i--) {\n                    if (i % skip === 0) {\n                        angles.splice(i, 1);\n                    }\n                }\n                return angles;\n            },\n            tickAngles: function (ring, stepValue) {\n                var options = this.options;\n                var reverse = options.reverse;\n                var range = options.max - options.min;\n                var angle = ring.endAngle - ring.startAngle;\n                var tickCount = range / stepValue;\n                var pos = ring.startAngle;\n                var step = angle / tickCount;\n                if (reverse) {\n                    pos += angle;\n                    step = -step;\n                }\n                var positions = [];\n                for (var i = 0; i < tickCount; i++) {\n                    positions.push(round(pos, COORD_PRECISION));\n                    pos += step;\n                }\n                if (round(pos) <= ring.endAngle) {\n                    positions.push(pos);\n                }\n                return positions;\n            },\n            radius: function (value) {\n                if (value) {\n                    this.arc.setRadiusX(value).setRadiusY(value);\n                    this.repositionTicks(this.majorTicks.children, this.majorTickAngles);\n                    this.repositionTicks(this.minorTicks.children, this.minorTickAngles, true);\n                } else {\n                    return this.arc.getRadiusX();\n                }\n            },\n            repositionTicks: function (ticks, tickAngles, minor) {\n                var diff = minor ? this._tickDifference || 0 : 0;\n                var tickArc = this.arc;\n                var radius = tickArc.getRadiusX();\n                if (minor && this.options.labels.position === OUTSIDE && diff !== 0) {\n                    tickArc = this.arc.clone();\n                    tickArc.setRadiusX(radius - diff).setRadiusY(radius - diff);\n                }\n                for (var i = 0; i < ticks.length; i++) {\n                    var newPoint = tickArc.pointAt(tickAngles[i]);\n                    var segments = ticks[i].segments;\n                    var xDiff = newPoint.x - segments[0].anchor().x;\n                    var yDiff = newPoint.y - segments[0].anchor().y;\n                    ticks[i].transform(new transform().translate(xDiff, yDiff));\n                }\n            }\n        });\n        setDefaultOptions(RadialScale, {\n            min: 0,\n            max: 100,\n            majorTicks: {\n                size: 15,\n                align: INSIDE,\n                color: BLACK,\n                width: DEFAULT_LINE_WIDTH,\n                visible: true\n            },\n            minorTicks: {\n                size: 10,\n                align: INSIDE,\n                color: BLACK,\n                width: DEFAULT_LINE_WIDTH,\n                visible: true\n            },\n            startAngle: -30,\n            endAngle: 210,\n            labels: {\n                position: INSIDE,\n                padding: 2\n            }\n        });\n        var RadialPointerAnimation = Animation.extend({\n            init: function (element, options) {\n                Animation.fn.init.call(this, element, options);\n                var animationOptions = this.options;\n                animationOptions.duration = Math.max(Math.abs(animationOptions.newAngle - animationOptions.oldAngle) / animationOptions.duration * 1000, 1);\n            },\n            step: function (pos) {\n                var options = this.options;\n                var angle = interpolateValue(options.oldAngle, options.newAngle, pos);\n                this.element.transform(transform().rotate(angle, options.center));\n            }\n        });\n        setDefaultOptions(RadialPointerAnimation, {\n            easing: LINEAR,\n            duration: ANGULAR_SPEED\n        });\n        AnimationFactory.current.register(RADIAL_POINTER, RadialPointerAnimation);\n        var CAP_SIZE = 0.05;\n        var Circle = drawing.Circle;\n        var Group$6 = DrawingGroup;\n        var Path$6 = DrawingPath;\n        var RadialPointer = Pointer.extend({\n            setAngle: function (angle) {\n                this.elements.transform(transform().rotate(angle, this.center));\n            },\n            repaint: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var oldAngle = scale.slotAngle(options._oldValue);\n                var newAngle = scale.slotAngle(options.value);\n                if (options.animation.transitions === false) {\n                    this.setAngle(newAngle);\n                } else {\n                    new RadialPointerAnimation(this.elements, deepExtend(options.animation, {\n                        oldAngle: oldAngle,\n                        newAngle: newAngle\n                    })).play();\n                }\n            },\n            render: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var elements = new Group$6();\n                if (options.animation !== false) {\n                    deepExtend(options.animation, {\n                        startAngle: 0,\n                        center: scale.arc.center,\n                        reverse: scale.options.reverse\n                    });\n                }\n                elements.append(this._renderNeedle(), this._renderCap());\n                this.elements = elements;\n                this.setAngle(DEGREE);\n                return elements;\n            },\n            reflow: function (arc) {\n                var center = this.center = arc.center;\n                var length = limitValue(this.options.length || 1, 0.1, 1.5);\n                var radius = this.radius = arc.getRadiusX() * length;\n                var capSize = this.capSize = Math.round(radius * this.options.cap.size);\n                this.bbox = Rect.fromPoints(new GeometryPoint(center.x - capSize, center.y - capSize), new GeometryPoint(center.x + capSize, center.y + capSize));\n            },\n            _renderNeedle: function () {\n                var minorTickSize = this.scale.options.minorTicks.size;\n                var center = this.center;\n                var needleColor = this.options.color;\n                var needlePath = new Path$6({\n                    fill: { color: needleColor },\n                    stroke: {\n                        color: needleColor,\n                        width: DEFAULT_LINE_WIDTH\n                    }\n                });\n                needlePath.moveTo(center.x + this.radius - minorTickSize, center.y).lineTo(center.x, center.y - this.capSize / 2).lineTo(center.x, center.y + this.capSize / 2).close();\n                return needlePath;\n            },\n            _renderCap: function () {\n                var options = this.options;\n                var capColor = options.cap.color || options.color;\n                var circle = new geometry.Circle(this.center, this.capSize);\n                var cap = new Circle(circle, {\n                    fill: { color: capColor },\n                    stroke: { color: capColor }\n                });\n                return cap;\n            }\n        });\n        setDefaultOptions(RadialPointer, {\n            cap: { size: CAP_SIZE },\n            arrow: {\n                width: 16,\n                height: 14\n            },\n            animation: {\n                type: RADIAL_POINTER,\n                duration: ANGULAR_SPEED\n            }\n        });\n        var Group$4 = DrawingGroup;\n        var RadialGauge = Gauge.extend({\n            reflow: function (bbox) {\n                var this$1 = this;\n                var pointers = this.pointers;\n                this.scale.reflow(bbox);\n                this._initialPlotArea = this.scale.bbox;\n                for (var i = 0; i < pointers.length; i++) {\n                    pointers[i].reflow(this$1.scale.arc);\n                    this$1._initialPlotArea = Rect.union(this$1._initialPlotArea, pointers[i].bbox);\n                }\n                this.fitScale(bbox);\n                this.alignScale(bbox);\n                this._buildVisual(this.gaugeArea, pointers, this.scale);\n                this._draw();\n            },\n            _buildVisual: function (gaugeArea, pointers, scale) {\n                var visuals = this._visuals = new Group$4();\n                visuals.append(gaugeArea);\n                visuals.append(scale.ticks);\n                visuals.append(scale.ranges);\n                this._buildPointers(pointers);\n                visuals.append(scale.labelElements);\n            },\n            _buildPointers: function (pointers) {\n                var this$1 = this;\n                for (var i = 0; i < pointers.length; i++) {\n                    var current = pointers[i];\n                    current.render();\n                    this$1._visuals.append(current.elements);\n                    current.value(current.options.value);\n                }\n            },\n            fitScale: function (bbox) {\n                var this$1 = this;\n                var arc = this.scale.arc;\n                var plotAreaBox = this._initialPlotArea;\n                var step = Math.abs(this.getDiff(plotAreaBox, bbox));\n                var min = round(step, COORD_PRECISION);\n                var max = round(-step, COORD_PRECISION);\n                var minDiff, midDiff, maxDiff, mid, oldDiff;\n                var staleFlag = 0;\n                var i = 0;\n                while (i++ < 100) {\n                    staleFlag = oldDiff === maxDiff ? staleFlag + 1 : 0;\n                    if (staleFlag > 5) {\n                        break;\n                    }\n                    if (min !== mid) {\n                        minDiff = this$1.getPlotBox(min, bbox, arc);\n                        if (0 <= minDiff && minDiff <= 2) {\n                            break;\n                        }\n                    }\n                    if (max !== mid) {\n                        maxDiff = this$1.getPlotBox(max, bbox, arc);\n                        if (0 <= maxDiff && maxDiff <= 2) {\n                            break;\n                        }\n                    }\n                    if (minDiff > 0 && maxDiff > 0) {\n                        mid = min * 2;\n                    } else if (minDiff < 0 && maxDiff < 0) {\n                        mid = max * 2;\n                    } else {\n                        mid = round((min + max) / 2 || 1, COORD_PRECISION);\n                    }\n                    midDiff = this$1.getPlotBox(mid, bbox, arc);\n                    if (0 <= midDiff && midDiff <= 2) {\n                        break;\n                    }\n                    oldDiff = maxDiff;\n                    if (midDiff > 0) {\n                        max = mid;\n                        maxDiff = midDiff;\n                    } else {\n                        min = mid;\n                        minDiff = midDiff;\n                    }\n                }\n            },\n            getPlotBox: function (step, bbox, arc) {\n                var this$1 = this;\n                var scale = this.scale;\n                var pointers = this.pointers;\n                var radius = arc.getRadiusX();\n                var scaleArc = arc.clone();\n                scaleArc.setRadiusX(radius + step).setRadiusY(radius + step);\n                scale.arc = scaleArc;\n                scale.reflow(bbox);\n                this.plotBbox = scale.bbox;\n                for (var i = 0; i < pointers.length; i++) {\n                    pointers[i].reflow(scaleArc);\n                    this$1.plotBbox = Rect.union(this$1.plotBbox, pointers[i].bbox);\n                }\n                return this.getDiff(this.plotBbox, bbox);\n            },\n            getDiff: function (plotBox, box) {\n                return Math.min(box.width() - plotBox.width(), box.height() - plotBox.height());\n            },\n            alignScale: function (bbox) {\n                var this$1 = this;\n                var plotBoxCenter = this.plotBbox.center();\n                var boxCenter = bbox.center();\n                var paddingX = plotBoxCenter.x - boxCenter.x;\n                var paddingY = plotBoxCenter.y - boxCenter.y;\n                var ref = this;\n                var scale = ref.scale;\n                var pointers = ref.pointers;\n                scale.arc.center.x -= paddingX;\n                scale.arc.center.y -= paddingY;\n                scale.reflow(bbox);\n                for (var i = 0; i < pointers.length; i++) {\n                    pointers[i].reflow(scale.arc);\n                    this$1.plotBbox = Rect.union(scale.bbox, pointers[i].bbox);\n                }\n            },\n            _createModel: function () {\n                var this$1 = this;\n                var options = this.options;\n                var pointers = options.pointer;\n                var scale = this.scale = new RadialScale(options.scale, this.contextService);\n                this.pointers = [];\n                var pointersArr = isArray(pointers) ? pointers : [pointers];\n                for (var i = 0; i < pointersArr.length; i++) {\n                    var current = new RadialPointer(scale, deepExtend({}, pointersArr[i], { animation: { transitions: options.transitions } }));\n                    this$1.pointers.push(current);\n                }\n            }\n        });\n        setDefaultOptions(RadialGauge, {\n            transitions: true,\n            gaugeArea: { background: '' }\n        });\n        var ArcScale = RadialScale.extend({\n            rangeSegments: function () {\n                var ref = this.options;\n                var min = ref.min;\n                var max = ref.max;\n                var rangePlaceholderColor = ref.rangePlaceholderColor;\n                var rangeLineCap = ref.rangeLineCap;\n                return [{\n                        from: min,\n                        to: max,\n                        color: rangePlaceholderColor,\n                        lineCap: rangeLineCap\n                    }];\n            },\n            hasRanges: function () {\n                return true;\n            },\n            placeholderRangeAngle: function (angle) {\n                var geometry$$1 = this.ranges.children[0].geometry();\n                if (this.options.reverse) {\n                    geometry$$1.setEndAngle(angle);\n                } else {\n                    geometry$$1.setStartAngle(angle);\n                }\n            },\n            addRange: function (from, to, options) {\n                var reverse = this.options.reverse;\n                var startAngle = this.slotAngle(reverse ? to : from);\n                var endAngle = this.slotAngle(reverse ? from : to);\n                var range = this.createRange(startAngle, endAngle, this.getRangeRadius(), options);\n                this.ranges.append(range);\n                return range;\n            }\n        });\n        setDefaultOptions(ArcScale, {\n            min: 0,\n            max: 100,\n            majorTicks: { visible: false },\n            minorTicks: { visible: false },\n            labels: { visible: false },\n            startAngle: 0,\n            endAngle: 180,\n            rangeLineCap: 'round'\n        });\n        var MAX_DURATION = 800;\n        var RangePointerAnimation = Animation.extend({\n            init: function (element, options) {\n                Animation.fn.init.call(this, element, options);\n                var animationOptions = this.options;\n                var duration = Math.abs(animationOptions.newAngle - animationOptions.oldAngle) / animationOptions.duration * 1000;\n                animationOptions.duration = limitValue(duration, ANGULAR_SPEED, MAX_DURATION);\n                var startColor = element.elements.options.get('stroke.color');\n                var color = element.currentColor();\n                if (startColor !== color) {\n                    this.startColor = new kendo.Color(startColor);\n                    this.color = new kendo.Color(color);\n                }\n            },\n            step: function (pos) {\n                var ref = this;\n                var options = ref.options;\n                var startColor = ref.startColor;\n                var color = ref.color;\n                var angle = interpolateValue(options.oldAngle, options.newAngle, pos);\n                this.element.angle(angle);\n                if (color) {\n                    var r = round(interpolateValue(startColor.r, color.r, pos));\n                    var g = round(interpolateValue(startColor.g, color.g, pos));\n                    var b = round(interpolateValue(startColor.b, color.b, pos));\n                    this.element.stroke(new kendo.Color(r, g, b).toHex());\n                }\n            }\n        });\n        setDefaultOptions(RangePointerAnimation, {\n            easing: LINEAR,\n            duration: ANGULAR_SPEED\n        });\n        AnimationFactory.current.register(RADIAL_RANGE_POINTER, RangePointerAnimation);\n        var RangePointer = Pointer.extend({\n            repaint: function () {\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                var oldAngle = scale.slotAngle(options._oldValue);\n                var newAngle = scale.slotAngle(options.value);\n                if (this.animation) {\n                    this.animation.abort();\n                }\n                if (options.animation.transitions === false) {\n                    this.angle(newAngle);\n                    this.stroke(this.currentColor());\n                } else {\n                    this.animation = new RangePointerAnimation(this, deepExtend(options.animation, {\n                        oldAngle: oldAngle,\n                        newAngle: newAngle\n                    }));\n                    this.animation.play();\n                }\n            },\n            angle: function (value) {\n                var geometry$$1 = this.elements.geometry();\n                if (this.scale.options.reverse) {\n                    geometry$$1.setStartAngle(value);\n                } else {\n                    geometry$$1.setEndAngle(value);\n                }\n                this.scale.placeholderRangeAngle(value);\n            },\n            stroke: function (value) {\n                this.elements.stroke(value);\n            },\n            render: function () {\n                if (this.elements) {\n                    return;\n                }\n                var ref = this;\n                var scale = ref.scale;\n                var options = ref.options;\n                if (options.animation !== false) {\n                    deepExtend(options.animation, {\n                        startAngle: 0,\n                        center: scale.arc.center,\n                        reverse: scale.options.reverse\n                    });\n                }\n                this.elements = scale.addRange(scale.options.min, this.options.value, {\n                    color: this.currentColor(),\n                    opacity: options.opacity,\n                    lineCap: scale.options.rangeLineCap\n                });\n            },\n            currentColor: function () {\n                var ref = this.scale.options;\n                var min = ref.min;\n                var max = ref.max;\n                var ref$1 = this.options;\n                var colors = ref$1.colors;\n                var color = ref$1.color;\n                var value = ref$1.value;\n                var currentValue = dataviz.isNumber(value) ? value : min;\n                if (colors) {\n                    for (var idx = 0; idx < colors.length; idx++) {\n                        var ref$2 = colors[idx];\n                        var rangeColor = ref$2.color;\n                        var from = ref$2.from;\n                        if (from === void 0) {\n                            from = min;\n                        }\n                        var to = ref$2.to;\n                        if (to === void 0) {\n                            to = max;\n                        }\n                        if (from <= currentValue && currentValue <= to) {\n                            return rangeColor;\n                        }\n                    }\n                }\n                return color;\n            },\n            reflow: function () {\n                this.render();\n                this.bbox = this.elements.bbox();\n            }\n        });\n        setDefaultOptions(RangePointer, {\n            animation: {\n                type: RADIAL_RANGE_POINTER,\n                duration: ANGULAR_SPEED\n            }\n        });\n        var ArcGauge = RadialGauge.extend({\n            _initTheme: function (theme) {\n                RadialGauge.fn._initTheme.call(this, theme);\n                this.options.color = this.options.color || (this.theme.pointer || {}).color;\n            },\n            _createModel: function () {\n                var options = this.options;\n                var scale = this.scale = new ArcScale(options.scale, this.contextService);\n                var pointer = new RangePointer(scale, deepExtend({}, {\n                    colors: options.colors,\n                    color: options.color,\n                    value: options.value,\n                    opacity: options.opacity,\n                    animation: { transitions: options.transitions }\n                }));\n                this.pointers = [pointer];\n            },\n            _buildPointers: function (pointers) {\n                for (var i = 0; i < pointers.length; i++) {\n                    var current = pointers[i];\n                    current.render();\n                    current.value(current.options.value);\n                }\n            },\n            _setValueOptions: function (value) {\n                this.options.value = value;\n            },\n            currentColor: function () {\n                var pointer = this.pointers[0];\n                if (pointer) {\n                    return pointer.currentColor();\n                }\n            },\n            centerLabelPosition: function (width, height) {\n                var size = this.getSize();\n                var center = this.scale.arc.center;\n                var left = center.x - width / 2;\n                var top = center.y - height / 2;\n                if (width < size.width) {\n                    var right = left + width;\n                    left = Math.max(left, 0);\n                    if (right > size.width) {\n                        left -= right - size.width;\n                    }\n                }\n                if (height < size.height) {\n                    var bbox = this.scale.bbox;\n                    var yLimit = bbox.bottomRight().y;\n                    var bottom = top + height;\n                    top = Math.max(top, bbox.origin.y);\n                    if (bottom > yLimit) {\n                        top -= bottom - yLimit;\n                    }\n                }\n                return {\n                    left: left,\n                    top: top\n                };\n            }\n        });\n        kendo.deepExtend(kendo.dataviz, {\n            Gauge: Gauge,\n            LinearGauge: LinearGauge,\n            LinearPointer: LinearPointer,\n            ArrowLinearPointer: ArrowLinearPointer,\n            BarLinearPointer: BarLinearPointer,\n            LinearScale: LinearScale,\n            RadialGauge: RadialGauge,\n            RadialPointer: RadialPointer,\n            RadialScale: RadialScale,\n            ArcGauge: ArcGauge,\n            RangePointer: RangePointer,\n            ArcScale: ArcScale\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/gauge/main', ['dataviz/gauge/kendo-gauges'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var Widget = kendo.ui.Widget;\n        var dataviz = kendo.dataviz;\n        var LinearGauge = dataviz.LinearGauge;\n        var RadialGauge = dataviz.RadialGauge;\n        var ArcGauge = dataviz.ArcGauge;\n        var draw = kendo.drawing;\n        function themeOptions(options) {\n            var themes = dataviz.ui.themes || {};\n            var themeName = options.theme || '';\n            var lowerName = themeName.toLowerCase();\n            if (dataviz.SASS_THEMES.indexOf(lowerName) != -1) {\n                return dataviz.autoTheme().gauge;\n            }\n            return (themes[themeName] || themes[lowerName] || {}).gauge;\n        }\n        var Gauge = Widget.extend({\n            init: function (element, userOptions) {\n                kendo.destroy(element);\n                $(element).empty();\n                Widget.fn.init.call(this, element);\n                this.options = kendo.deepExtend(this.options, userOptions);\n                this.wrapper = this.element;\n                this._createInstance();\n                this.element.addClass('k-gauge');\n                kendo.notify(this, dataviz.ui);\n            },\n            options: {\n                theme: 'default',\n                renderAs: '',\n                pointer: {},\n                scale: {},\n                gaugeArea: { background: '' },\n                transitions: true\n            },\n            setOptions: function (options) {\n                this._instance.setOptions(options, themeOptions(options));\n                this._copyFields();\n            },\n            redraw: function () {\n                this._instance.redraw();\n                this._copyFields();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this._instance.destroy();\n            },\n            _createInstance: function () {\n                var gaugeType = this._gaugeType();\n                this._instance = new gaugeType(this.element[0], this.options, themeOptions(this.options));\n                this._copyFields();\n            },\n            _copyFields: function () {\n                this._originalOptions = this._instance._originalOptions;\n                this.options = this._instance.options;\n                this.surface = this._instance.surface;\n                this.bbox = this._instance.bbox;\n                this.gaugeArea = this._instance.gaugeArea;\n                this.pointers = this._instance.pointers;\n                this.scale = this._instance.scale;\n            },\n            _resize: function () {\n                this._instance.resize();\n            }\n        });\n        var proxyMembers = [\n            'getSize',\n            'value',\n            'allValues',\n            'exportVisual'\n        ];\n        function createProxyMember(name) {\n            Gauge.fn[name] = function () {\n                return this._instance[name].apply(this._instance, arguments);\n            };\n        }\n        for (var idx = 0; idx < proxyMembers.length; idx++) {\n            createProxyMember(proxyMembers[idx]);\n        }\n        dataviz.ExportMixin.extend(Gauge.fn);\n        var RadialGaugeWidget = Gauge.extend({\n            options: { name: 'RadialGauge' },\n            _gaugeType: function () {\n                return RadialGauge;\n            }\n        });\n        var LinearGaugeWidget = Gauge.extend({\n            options: {\n                name: 'LinearGauge',\n                scale: { vertical: true }\n            },\n            _gaugeType: function () {\n                return LinearGauge;\n            }\n        });\n        var ArcGaugeWidget = Gauge.extend({\n            init: function (element, userOptions) {\n                Gauge.fn.init.call(this, element, userOptions);\n                this.element.css('position', 'relative');\n                this.element.addClass('k-arcgauge');\n                this._centerTemplate();\n            },\n            options: { name: 'ArcGauge' },\n            setOptions: function (options) {\n                Gauge.fn.setOptions.call(this, options);\n                this._centerTemplate();\n            },\n            redraw: function () {\n                Gauge.fn.redraw.call(this);\n                this._centerTemplate();\n            },\n            value: function (value) {\n                var instance = this._instance;\n                if (arguments.length === 0) {\n                    return instance.value();\n                }\n                instance.value(value);\n                this._centerTemplate();\n            },\n            destroy: function () {\n                Gauge.fn.destroy.call(this);\n                delete this._centerElement;\n            },\n            exportVisual: function () {\n                if (this._centerElement) {\n                    return false;\n                }\n                return Gauge.fn.exportVisual.call(this);\n            },\n            _resize: function () {\n                this._instance.resize();\n                this._centerTemplate();\n            },\n            _centerTemplate: function () {\n                if (this.options.centerTemplate) {\n                    var template = kendo.template(this.options.centerTemplate);\n                    var instance = this._instance;\n                    var centerElement = this._getCenterElement();\n                    centerElement.html(template({\n                        color: instance.currentColor(),\n                        value: instance.value()\n                    }));\n                    var position = instance.centerLabelPosition(centerElement.width(), centerElement.height());\n                    centerElement.css(position);\n                } else if (this._centerElement) {\n                    this._centerElement.remove();\n                    this._centerElement = null;\n                }\n            },\n            _getCenterElement: function () {\n                var centerElement = this._centerElement;\n                if (!centerElement) {\n                    centerElement = this._centerElement = $('<div></div>').addClass('k-arcgauge-label');\n                    this.element.append(centerElement);\n                }\n                return centerElement;\n            },\n            _gaugeType: function () {\n                return ArcGauge;\n            }\n        });\n        function createExportMethod(name) {\n            ArcGaugeWidget.fn[name] = function (options) {\n                var gauge = this;\n                var method = draw[name];\n                if (!gauge._centerElement) {\n                    return method(gauge.exportVisual(), options);\n                }\n                return draw.drawDOM(gauge.element).then(function (visual) {\n                    return method(visual, options);\n                });\n            };\n        }\n        var exportMethods = [\n            'exportSVG',\n            'exportImage',\n            'exportPDF'\n        ];\n        for (idx = 0; idx < exportMethods.length; idx++) {\n            createExportMethod(exportMethods[idx]);\n        }\n        dataviz.ui.plugin(LinearGaugeWidget);\n        dataviz.ui.plugin(RadialGaugeWidget);\n        dataviz.ui.plugin(ArcGaugeWidget);\n        kendo.deepExtend(dataviz, {\n            Gauge: Gauge,\n            LinearGauge: LinearGaugeWidget,\n            RadialGauge: RadialGaugeWidget,\n            ArcGauge: ArcGaugeWidget\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.gauge', [\n        'dataviz/gauge/main',\n        'kendo.dataviz.themes'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.gauge',\n        name: 'Gauge',\n        category: 'dataviz',\n        description: 'Linear, Radial and Arc gauges.',\n        depends: [\n            'dataviz.core',\n            'dataviz.themes'\n        ]\n    };\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.barcode', [\n        'kendo.dataviz.core',\n        'kendo.drawing'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.barcode',\n        name: 'Barcode',\n        category: 'dataviz',\n        description: 'Barcode widget',\n        depends: ['dataviz.core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, extend = $.extend, deepExtend = kendo.deepExtend, inArray = $.inArray, isPlainObject = $.isPlainObject, draw = kendo.drawing, geom = kendo.geometry, util = kendo.drawing.util, defined = util.defined, dataviz = kendo.dataviz, Box2D = dataviz.Box2D, TextBox = dataviz.TextBox, DEFAULT_WIDTH = 300, DEFAULT_HEIGHT = 100, DEFAULT_QUIETZONE_LENGTH = 10, numberRegex = /^\\d+$/, alphanumericRegex = /^[a-z0-9]+$/i, InvalidCharacterErrorTemplate = 'Character \\'{0}\\' is not valid for symbology {1}';\n        function getNext(value, index, count) {\n            return value.substring(index, index + count);\n        }\n        var Encoding = kendo.Class.extend({\n            init: function (options) {\n                this.setOptions(options);\n            },\n            setOptions: function (options) {\n                var that = this;\n                that.options = extend({}, that.options, options);\n                that.quietZoneLength = that.options.addQuietZone ? 2 * that.options.quietZoneLength : 0;\n            },\n            encode: function (value, width, height) {\n                var that = this;\n                if (defined(value)) {\n                    value += '';\n                }\n                that.initValue(value, width, height);\n                if (that.options.addQuietZone) {\n                    that.addQuietZone();\n                }\n                that.addData();\n                if (that.options.addQuietZone) {\n                    that.addQuietZone();\n                }\n                return {\n                    baseUnit: that.baseUnit,\n                    pattern: that.pattern\n                };\n            },\n            options: {\n                quietZoneLength: DEFAULT_QUIETZONE_LENGTH,\n                addQuietZone: true,\n                addCheckSum: true\n            },\n            initValue: function () {\n            },\n            addQuietZone: function () {\n                this.pattern.push(this.options.quietZoneLength || DEFAULT_QUIETZONE_LENGTH);\n            },\n            addData: function () {\n            },\n            invalidCharacterError: function (character) {\n                throw new Error(kendo.format(InvalidCharacterErrorTemplate, character, this.name));\n            }\n        });\n        var encodings = {};\n        var code39Base = Encoding.extend({\n            minBaseUnitLength: 0.7,\n            addData: function () {\n                var that = this, value = that.value;\n                that.addStart();\n                for (var idx = 0; idx < value.length; idx++) {\n                    that.addCharacter(value.charAt(idx));\n                }\n                if (that.options.addCheckSum) {\n                    that.pushCheckSum();\n                }\n                that.addStop();\n                that.prepareValues();\n            },\n            addCharacter: function (character) {\n                var that = this, charData = that.characterMap[character];\n                if (!charData) {\n                    that.invalidCharacterError(character);\n                }\n                that.addBase(charData);\n            },\n            addBase: function () {\n            }\n        });\n        var code39ExtendedBase = {\n            addCharacter: function (character) {\n                var that = this;\n                if (that.characterMap[character]) {\n                    that.addBase(that.characterMap[character]);\n                } else if (character.charCodeAt(0) > 127) {\n                    that.invalidCharacterError(character);\n                } else {\n                    that.addExtended(character.charCodeAt(0));\n                }\n            },\n            addExtended: function (code) {\n                var that = this, patterns;\n                for (var i = 0; i < that.extendedMappings.length; i++) {\n                    if (patterns = that.extendedMappings[i].call(that, code)) {\n                        for (var j = 0; j < patterns.length; j++) {\n                            that.addBase(patterns[j]);\n                        }\n                        that.dataLength += patterns.length - 1;\n                        return;\n                    }\n                }\n            },\n            extendedMappings: [\n                function (code) {\n                    if (97 <= code && code <= 122) {\n                        var that = this;\n                        return [\n                            that.characterMap[that.shiftCharacters[0]],\n                            that.characterMap[String.fromCharCode(code - 32)]\n                        ];\n                    }\n                },\n                function (code) {\n                    if (33 <= code && code <= 58) {\n                        var that = this;\n                        return [\n                            that.characterMap[that.shiftCharacters[1]],\n                            that.characterMap[String.fromCharCode(code + 32)]\n                        ];\n                    }\n                },\n                function (code) {\n                    if (1 <= code && code <= 26) {\n                        var that = this;\n                        return [\n                            that.characterMap[that.shiftCharacters[2]],\n                            that.characterMap[String.fromCharCode(code + 64)]\n                        ];\n                    }\n                },\n                function (code) {\n                    var that = this, result, dataCharacter;\n                    if (!that.specialAsciiCodes[code]) {\n                        dataCharacter = Math.floor(code / 32) * 6 + (code - 27) % 32 + 64;\n                        result = [\n                            that.characterMap[that.shiftCharacters[3]],\n                            that.characterMap[String.fromCharCode(dataCharacter)]\n                        ];\n                    } else {\n                        result = [];\n                        for (var i = 0; i < that.specialAsciiCodes[code].length; i++) {\n                            result.push(that.characterMap[that.shiftCharacters[3]]);\n                            result.push(that.characterMap[that.specialAsciiCodes[code][i]]);\n                        }\n                    }\n                    return result;\n                }\n            ],\n            specialAsciiCodes: {\n                '0': ['U'],\n                '64': ['V'],\n                '96': ['W'],\n                '127': [\n                    'T',\n                    'X',\n                    'Y',\n                    'Z'\n                ]\n            },\n            shiftValuesAsciiCodes: {\n                '39': 36,\n                '40': 47,\n                '41': 43,\n                '42': 37\n            },\n            characterMap: {\n                '+': false,\n                '/': false,\n                '$': false,\n                '%': false\n            },\n            shiftCharacters: [\n                'SHIFT0',\n                'SHIFT1',\n                'SHIFT2',\n                'SHIFT3'\n            ]\n        };\n        encodings.code39 = code39Base.extend({\n            name: 'Code 39',\n            checkSumMod: 43,\n            minRatio: 2.5,\n            maxRatio: 3,\n            gapWidth: 1,\n            splitCharacter: '|',\n            initValue: function (value, width, height) {\n                var that = this;\n                that.width = width;\n                that.height = height;\n                that.value = value;\n                that.dataLength = value.length;\n                that.pattern = [];\n                that.patternString = '';\n            },\n            prepareValues: function () {\n                var that = this, baseUnit, minBaseUnit = that.minBaseUnitLength, ratio = that.maxRatio, minRatio = that.minRatio, minHeight = Math.max(0.15 * that.width, 24);\n                if (that.height < minHeight) {\n                    throw new Error('Insufficient Height. The minimum height for value: ' + that.value + ' is: ' + minHeight);\n                }\n                while ((baseUnit = that.getBaseUnit(ratio)) < minBaseUnit && ratio > minRatio) {\n                    ratio = parseFloat((ratio - 0.1).toFixed(1));\n                }\n                if (baseUnit < minBaseUnit) {\n                    var minWidth = Math.ceil(that.getBaseWidth(minRatio) * minBaseUnit);\n                    throw new Error('Insufficient width. The minimum width for value: ' + that.value + ' is: ' + minWidth);\n                }\n                that.ratio = ratio;\n                that.baseUnit = baseUnit;\n                that.patternString = that.patternString.substring(0, that.patternString.length - 1);\n                that.pattern = that.pattern.concat(that.patternString.replace(/ratio/g, ratio).split(that.splitCharacter));\n            },\n            getBaseUnit: function (ratio) {\n                return this.width / this.getBaseWidth(ratio);\n            },\n            getBaseWidth: function (ratio) {\n                var that = this, characterLength = 3 * (ratio + 2);\n                return that.quietZoneLength + characterLength * (that.dataLength + 2) + that.gapWidth * (that.dataLength + 1);\n            },\n            addStart: function () {\n                var that = this;\n                that.addPattern(that.characterMap.START.pattern);\n                that.addCharacterGap();\n            },\n            addBase: function (character) {\n                this.addPattern(character.pattern);\n                this.addCharacterGap();\n            },\n            addStop: function () {\n                this.addPattern(this.characterMap.START.pattern);\n            },\n            addPattern: function (pattern) {\n                for (var i = 0; i < pattern.length; i++) {\n                    this.patternString += this.patternMappings[pattern.charAt(i)];\n                }\n            },\n            addCharacterGap: function () {\n                var that = this;\n                that.patternString += that.gapWidth + that.splitCharacter;\n            },\n            patternMappings: {\n                'b': '1|',\n                'w': '1|',\n                'B': 'ratio|',\n                'W': 'ratio|'\n            },\n            characterMap: {\n                '0': {\n                    'pattern': 'bwbWBwBwb',\n                    'value': 0\n                },\n                '1': {\n                    'pattern': 'BwbWbwbwB',\n                    'value': 1\n                },\n                '2': {\n                    'pattern': 'bwBWbwbwB',\n                    'value': 2\n                },\n                '3': {\n                    'pattern': 'BwBWbwbwb',\n                    'value': 3\n                },\n                '4': {\n                    'pattern': 'bwbWBwbwB',\n                    'value': 4\n                },\n                '5': {\n                    'pattern': 'BwbWBwbwb',\n                    'value': 5\n                },\n                '6': {\n                    'pattern': 'bwBWBwbwb',\n                    'value': 6\n                },\n                '7': {\n                    'pattern': 'bwbWbwBwB',\n                    'value': 7\n                },\n                '8': {\n                    'pattern': 'BwbWbwBwb',\n                    'value': 8\n                },\n                '9': {\n                    'pattern': 'bwBWbwBwb',\n                    'value': 9\n                },\n                'A': {\n                    'pattern': 'BwbwbWbwB',\n                    'value': 10\n                },\n                'B': {\n                    'pattern': 'bwBwbWbwB',\n                    'value': 11\n                },\n                'C': {\n                    'pattern': 'BwBwbWbwb',\n                    'value': 12\n                },\n                'D': {\n                    'pattern': 'bwbwBWbwB',\n                    'value': 13\n                },\n                'E': {\n                    'pattern': 'BwbwBWbwb',\n                    'value': 14\n                },\n                'F': {\n                    'pattern': 'bwBwBWbwb',\n                    'value': 15\n                },\n                'G': {\n                    'pattern': 'bwbwbWBwB',\n                    'value': 16\n                },\n                'H': {\n                    'pattern': 'BwbwbWBwb',\n                    'value': 17\n                },\n                'I': {\n                    'pattern': 'bwBwbWBwb',\n                    'value': 18\n                },\n                'J': {\n                    'pattern': 'bwbwBWBwb',\n                    'value': 19\n                },\n                'K': {\n                    'pattern': 'BwbwbwbWB',\n                    'value': 20\n                },\n                'L': {\n                    'pattern': 'bwBwbwbWB',\n                    'value': 21\n                },\n                'M': {\n                    'pattern': 'BwBwbwbWb',\n                    'value': 22\n                },\n                'N': {\n                    'pattern': 'bwbwBwbWB',\n                    'value': 23\n                },\n                'O': {\n                    'pattern': 'BwbwBwbWb',\n                    'value': 24\n                },\n                'P': {\n                    'pattern': 'bwBwBwbWb',\n                    'value': 25\n                },\n                'Q': {\n                    'pattern': 'bwbwbwBWB',\n                    'value': 26\n                },\n                'R': {\n                    'pattern': 'BwbwbwBWb',\n                    'value': 27\n                },\n                'S': {\n                    'pattern': 'bwBwbwBWb',\n                    'value': 28\n                },\n                'T': {\n                    'pattern': 'bwbwBwBWb',\n                    'value': 29\n                },\n                'U': {\n                    'pattern': 'BWbwbwbwB',\n                    'value': 30\n                },\n                'V': {\n                    'pattern': 'bWBwbwbwB',\n                    'value': 31\n                },\n                'W': {\n                    'pattern': 'BWBwbwbwb',\n                    'value': 32\n                },\n                'X': {\n                    'pattern': 'bWbwBwbwB',\n                    'value': 33\n                },\n                'Y': {\n                    'pattern': 'BWbwBwbwb',\n                    'value': 34\n                },\n                'Z': {\n                    'pattern': 'bWBwBwbwb',\n                    'value': 35\n                },\n                '-': {\n                    'pattern': 'bWbwbwBwB',\n                    'value': 36\n                },\n                '.': {\n                    'pattern': 'BWbwbwBwb',\n                    'value': 37\n                },\n                ' ': {\n                    'pattern': 'bWBwbwBwb',\n                    'value': 38\n                },\n                '$': {\n                    'pattern': 'bWbWbWbwb',\n                    'value': 39\n                },\n                '/': {\n                    'pattern': 'bWbWbwbWb',\n                    'value': 40\n                },\n                '+': {\n                    'pattern': 'bWbwbWbWb',\n                    'value': 41\n                },\n                '%': {\n                    'pattern': 'bwbWbWbWb',\n                    'value': 42\n                },\n                START: { pattern: 'bWbwBwBwb' }\n            },\n            options: { addCheckSum: false }\n        });\n        encodings.code39extended = encodings.code39.extend(deepExtend({}, code39ExtendedBase, {\n            name: 'Code 39 extended',\n            characterMap: {\n                SHIFT0: {\n                    'pattern': 'bWbwbWbWb',\n                    'value': 41\n                },\n                SHIFT1: {\n                    'pattern': 'bWbWbwbWb',\n                    'value': 40\n                },\n                SHIFT2: {\n                    'pattern': 'bWbWbWbwb',\n                    'value': 39\n                },\n                SHIFT3: {\n                    'pattern': 'bwbWbWbWb',\n                    'value': 42\n                }\n            }\n        }));\n        encodings.code93 = code39Base.extend({\n            name: 'Code 93',\n            cCheckSumTotal: 20,\n            kCheckSumTotal: 15,\n            checkSumMod: 47,\n            initValue: function (value, width, height) {\n                var that = this;\n                that.value = value;\n                that.width = width;\n                that.height = height;\n                that.pattern = [];\n                that.values = [];\n                that.dataLength = value.length;\n            },\n            prepareValues: function () {\n                var that = this, minHeight = Math.max(0.15 * that.width, 24);\n                if (that.height < minHeight) {\n                    throw new Error('Insufficient Height');\n                }\n                that.setBaseUnit();\n                if (that.baseUnit < that.minBaseUnitLength) {\n                    throw new Error('Insufficient Width');\n                }\n            },\n            setBaseUnit: function () {\n                var that = this, checkSumLength = 2;\n                that.baseUnit = that.width / (9 * (that.dataLength + 2 + checkSumLength) + that.quietZoneLength + 1);\n            },\n            addStart: function () {\n                var pattern = this.characterMap.START.pattern;\n                this.addPattern(pattern);\n            },\n            addStop: function () {\n                var that = this;\n                that.addStart();\n                that.pattern.push(that.characterMap.TERMINATION_BAR);\n            },\n            addBase: function (charData) {\n                this.addPattern(charData.pattern);\n                this.values.push(charData.value);\n            },\n            pushCheckSum: function () {\n                var that = this, checkValues = that._getCheckValues(), charData;\n                that.checksum = checkValues.join('');\n                for (var i = 0; i < checkValues.length; i++) {\n                    charData = that.characterMap[that._findCharacterByValue(checkValues[i])];\n                    that.addPattern(charData.pattern);\n                }\n            },\n            _getCheckValues: function () {\n                var that = this, values = that.values, length = values.length, wightedSum = 0, cValue, kValue, idx;\n                for (idx = length - 1; idx >= 0; idx--) {\n                    wightedSum += that.weightedValue(values[idx], length - idx, that.cCheckSumTotal);\n                }\n                cValue = wightedSum % that.checkSumMod;\n                wightedSum = that.weightedValue(cValue, 1, that.kCheckSumTotal);\n                for (idx = length - 1; idx >= 0; idx--) {\n                    wightedSum += that.weightedValue(values[idx], length - idx + 1, that.kCheckSumTotal);\n                }\n                kValue = wightedSum % that.checkSumMod;\n                return [\n                    cValue,\n                    kValue\n                ];\n            },\n            _findCharacterByValue: function (value) {\n                for (var character in this.characterMap) {\n                    if (this.characterMap[character].value === value) {\n                        return character;\n                    }\n                }\n            },\n            weightedValue: function (value, index, total) {\n                return (index % total || total) * value;\n            },\n            addPattern: function (pattern) {\n                var value;\n                for (var i = 0; i < pattern.length; i++) {\n                    value = parseInt(pattern.charAt(i), 10);\n                    this.pattern.push(value);\n                }\n            },\n            characterMap: {\n                '0': {\n                    'pattern': '131112',\n                    'value': 0\n                },\n                '1': {\n                    'pattern': '111213',\n                    'value': 1\n                },\n                '2': {\n                    'pattern': '111312',\n                    'value': 2\n                },\n                '3': {\n                    'pattern': '111411',\n                    'value': 3\n                },\n                '4': {\n                    'pattern': '121113',\n                    'value': 4\n                },\n                '5': {\n                    'pattern': '121212',\n                    'value': 5\n                },\n                '6': {\n                    'pattern': '121311',\n                    'value': 6\n                },\n                '7': {\n                    'pattern': '111114',\n                    'value': 7\n                },\n                '8': {\n                    'pattern': '131211',\n                    'value': 8\n                },\n                '9': {\n                    'pattern': '141111',\n                    'value': 9\n                },\n                'A': {\n                    'pattern': '211113',\n                    'value': 10\n                },\n                'B': {\n                    'pattern': '211212',\n                    'value': 11\n                },\n                'C': {\n                    'pattern': '211311',\n                    'value': 12\n                },\n                'D': {\n                    'pattern': '221112',\n                    'value': 13\n                },\n                'E': {\n                    'pattern': '221211',\n                    'value': 14\n                },\n                'F': {\n                    'pattern': '231111',\n                    'value': 15\n                },\n                'G': {\n                    'pattern': '112113',\n                    'value': 16\n                },\n                'H': {\n                    'pattern': '112212',\n                    'value': 17\n                },\n                'I': {\n                    'pattern': '112311',\n                    'value': 18\n                },\n                'J': {\n                    'pattern': '122112',\n                    'value': 19\n                },\n                'K': {\n                    'pattern': '132111',\n                    'value': 20\n                },\n                'L': {\n                    'pattern': '111123',\n                    'value': 21\n                },\n                'M': {\n                    'pattern': '111222',\n                    'value': 22\n                },\n                'N': {\n                    'pattern': '111321',\n                    'value': 23\n                },\n                'O': {\n                    'pattern': '121122',\n                    'value': 24\n                },\n                'P': {\n                    'pattern': '131121',\n                    'value': 25\n                },\n                'Q': {\n                    'pattern': '212112',\n                    'value': 26\n                },\n                'R': {\n                    'pattern': '212211',\n                    'value': 27\n                },\n                'S': {\n                    'pattern': '211122',\n                    'value': 28\n                },\n                'T': {\n                    'pattern': '211221',\n                    'value': 29\n                },\n                'U': {\n                    'pattern': '221121',\n                    'value': 30\n                },\n                'V': {\n                    'pattern': '222111',\n                    'value': 31\n                },\n                'W': {\n                    'pattern': '112122',\n                    'value': 32\n                },\n                'X': {\n                    'pattern': '112221',\n                    'value': 33\n                },\n                'Y': {\n                    'pattern': '122121',\n                    'value': 34\n                },\n                'Z': {\n                    'pattern': '123111',\n                    'value': 35\n                },\n                '-': {\n                    'pattern': '121131',\n                    'value': 36\n                },\n                '.': {\n                    'pattern': '311112',\n                    'value': 37\n                },\n                ' ': {\n                    'pattern': '311211',\n                    'value': 38\n                },\n                '$': {\n                    'pattern': '321111',\n                    'value': 39\n                },\n                '/': {\n                    'pattern': '112131',\n                    'value': 40\n                },\n                '+': {\n                    'pattern': '113121',\n                    'value': 41\n                },\n                '%': {\n                    'pattern': '211131',\n                    'value': 42\n                },\n                SHIFT0: {\n                    'pattern': '122211',\n                    'value': 46\n                },\n                SHIFT1: {\n                    'pattern': '311121',\n                    'value': 45\n                },\n                SHIFT2: {\n                    'pattern': '121221',\n                    'value': 43\n                },\n                SHIFT3: {\n                    'pattern': '312111',\n                    'value': 44\n                },\n                START: { 'pattern': '111141' },\n                TERMINATION_BAR: '1'\n            }\n        });\n        encodings.code93extended = encodings.code93.extend(deepExtend({}, code39ExtendedBase, {\n            name: 'Code 93 extended',\n            pushCheckSum: function () {\n                var that = this, checkValues = that._getCheckValues(), value;\n                that.checksum = checkValues.join('');\n                for (var i = 0; i < checkValues.length; i++) {\n                    value = checkValues[i];\n                    if (that.shiftValuesAsciiCodes[value]) {\n                        that.addExtended(that.shiftValuesAsciiCodes[value]);\n                    } else {\n                        that.addPattern(that.characterMap[that._findCharacterByValue(value)].pattern);\n                    }\n                }\n            }\n        }));\n        var state128 = kendo.Class.extend({\n            init: function (encoding) {\n                this.encoding = encoding;\n            },\n            addStart: function () {\n            },\n            is: function () {\n            },\n            move: function () {\n            },\n            pushState: function () {\n            }\n        });\n        var state128AB = state128.extend({\n            FNC4: 'FNC4',\n            init: function (encoding, states) {\n                var that = this;\n                that.encoding = encoding;\n                that.states = states;\n                that._initMoves(states);\n            },\n            addStart: function () {\n                this.encoding.addPattern(this.START);\n            },\n            is: function (value, index) {\n                var code = value.charCodeAt(index);\n                return this.isCode(code);\n            },\n            move: function (encodingState) {\n                var that = this, idx = 0;\n                while (!that._moves[idx].call(that, encodingState) && idx < that._moves.length) {\n                    idx++;\n                }\n            },\n            pushState: function (encodingState) {\n                var that = this, states = that.states, value = encodingState.value, maxLength = value.length, code;\n                if (inArray('C', states) >= 0) {\n                    var numberMatch = value.substr(encodingState.index).match(/\\d{4,}/g);\n                    if (numberMatch) {\n                        maxLength = value.indexOf(numberMatch[0], encodingState.index);\n                    }\n                }\n                while ((code = encodingState.value.charCodeAt(encodingState.index)) >= 0 && that.isCode(code) && encodingState.index < maxLength) {\n                    that.encoding.addPattern(that.getValue(code));\n                    encodingState.index++;\n                }\n            },\n            _initMoves: function (states) {\n                var that = this;\n                that._moves = [];\n                if (inArray(that.FNC4, states) >= 0) {\n                    that._moves.push(that._moveFNC);\n                }\n                if (inArray(that.shiftKey, states) >= 0) {\n                    that._moves.push(that._shiftState);\n                }\n                that._moves.push(that._moveState);\n            },\n            _moveFNC: function (encodingState) {\n                if (encodingState.fnc) {\n                    encodingState.fnc = false;\n                    return encodingState.previousState == this.key;\n                }\n            },\n            _shiftState: function (encodingState) {\n                var that = this;\n                if (encodingState.previousState == that.shiftKey && (encodingState.index + 1 >= encodingState.value.length || that.encoding[that.shiftKey].is(encodingState.value, encodingState.index + 1))) {\n                    that.encoding.addPattern(that.SHIFT);\n                    encodingState.shifted = true;\n                    return true;\n                }\n            },\n            _moveState: function () {\n                this.encoding.addPattern(this.MOVE);\n                return true;\n            },\n            SHIFT: 98\n        });\n        var states128 = {};\n        states128.A = state128AB.extend({\n            key: 'A',\n            shiftKey: 'B',\n            isCode: function (code) {\n                return 0 <= code && code < 96;\n            },\n            getValue: function (code) {\n                if (code < 32) {\n                    return code + 64;\n                }\n                return code - 32;\n            },\n            MOVE: 101,\n            START: 103\n        });\n        states128.B = state128AB.extend({\n            key: 'B',\n            shiftKey: 'A',\n            isCode: function (code) {\n                return 32 <= code && code < 128;\n            },\n            getValue: function (code) {\n                return code - 32;\n            },\n            MOVE: 100,\n            START: 104\n        });\n        states128.C = state128.extend({\n            key: 'C',\n            addStart: function () {\n                this.encoding.addPattern(this.START);\n            },\n            is: function (value, index) {\n                var next4 = getNext(value, index, 4);\n                return (index + 4 <= value.length || value.length == 2) && numberRegex.test(next4);\n            },\n            move: function () {\n                this.encoding.addPattern(this.MOVE);\n            },\n            pushState: function (encodingState) {\n                var code;\n                while ((code = getNext(encodingState.value, encodingState.index, 2)) && numberRegex.test(code) && code.length == 2) {\n                    this.encoding.addPattern(parseInt(code, 10));\n                    encodingState.index += 2;\n                }\n            },\n            getValue: function (code) {\n                return code;\n            },\n            MOVE: 99,\n            START: 105\n        });\n        states128.FNC4 = state128.extend({\n            key: 'FNC4',\n            dependentStates: [\n                'A',\n                'B'\n            ],\n            init: function (encoding, states) {\n                this.encoding = encoding;\n                this._initSubStates(states);\n            },\n            addStart: function (encodingState) {\n                var code = encodingState.value.charCodeAt(0) - 128, subState = this._getSubState(code);\n                this.encoding[subState].addStart();\n            },\n            is: function (value, index) {\n                var code = value.charCodeAt(index);\n                return this.isCode(code);\n            },\n            isCode: function (code) {\n                return 128 <= code && code < 256;\n            },\n            pushState: function (encodingState) {\n                var that = this, subState = that._initSubState(encodingState), encoding = that.encoding, length = subState.value.length;\n                encodingState.index += length;\n                if (length < 3) {\n                    var code;\n                    for (; subState.index < length; subState.index++) {\n                        code = subState.value.charCodeAt(subState.index);\n                        subState.state = that._getSubState(code);\n                        if (subState.previousState != subState.state) {\n                            subState.previousState = subState.state;\n                            encoding[subState.state].move(subState);\n                        }\n                        encoding.addPattern(encoding[subState.state].MOVE);\n                        encoding.addPattern(encoding[subState.state].getValue(code));\n                    }\n                } else {\n                    if (subState.state != subState.previousState) {\n                        encoding[subState.state].move(subState);\n                    }\n                    that._pushStart(subState);\n                    encoding.pushData(subState, that.subStates);\n                    if (encodingState.index < encodingState.value.length) {\n                        that._pushStart(subState);\n                    }\n                }\n                encodingState.fnc = true;\n                encodingState.state = subState.state;\n            },\n            _pushStart: function (subState) {\n                var that = this;\n                that.encoding.addPattern(that.encoding[subState.state].MOVE);\n                that.encoding.addPattern(that.encoding[subState.state].MOVE);\n            },\n            _initSubState: function (encodingState) {\n                var that = this, subState = {\n                        value: that._getAll(encodingState.value, encodingState.index),\n                        index: 0\n                    };\n                subState.state = that._getSubState(subState.value.charCodeAt(0));\n                subState.previousState = encodingState.previousState == that.key ? subState.state : encodingState.previousState;\n                return subState;\n            },\n            _initSubStates: function (states) {\n                var that = this;\n                that.subStates = [];\n                for (var i = 0; i < states.length; i++) {\n                    if (inArray(states[i], that.dependentStates) >= 0) {\n                        that.subStates.push(states[i]);\n                    }\n                }\n            },\n            _getSubState: function (code) {\n                var that = this;\n                for (var i = 0; i < that.subStates.length; i++) {\n                    if (that.encoding[that.subStates[i]].isCode(code)) {\n                        return that.subStates[i];\n                    }\n                }\n            },\n            _getAll: function (value, index) {\n                var code, result = '';\n                while ((code = value.charCodeAt(index++)) && this.isCode(code)) {\n                    result += String.fromCharCode(code - 128);\n                }\n                return result;\n            }\n        });\n        states128.FNC1 = state128.extend({\n            key: 'FNC1',\n            startState: 'C',\n            dependentStates: [\n                'C',\n                'B'\n            ],\n            startAI: '(',\n            endAI: ')',\n            init: function (encoding, states) {\n                this.encoding = encoding;\n                this.states = states;\n            },\n            addStart: function () {\n                this.encoding[this.startState].addStart();\n            },\n            is: function () {\n                return inArray(this.key, this.states) >= 0;\n            },\n            pushState: function (encodingState) {\n                var that = this, encoding = that.encoding, value = encodingState.value.replace(/\\s/g, ''), regexSeparators = new RegExp('[' + that.startAI + that.endAI + ']', 'g'), index = encodingState.index, subState = { state: that.startState }, current, nextStart, separatorLength;\n                encoding.addPattern(that.START);\n                while (true) {\n                    subState.index = 0;\n                    separatorLength = value.charAt(index) === that.startAI ? 2 : 0;\n                    current = separatorLength > 0 ? that.getBySeparator(value, index) : that.getByLength(value, index);\n                    if (current.ai.length) {\n                        nextStart = index + separatorLength + current.id.length + current.ai.length;\n                    } else {\n                        nextStart = value.indexOf(that.startAI, index + 1);\n                        if (nextStart < 0) {\n                            if (index + current.ai.max + current.id.length + separatorLength < value.length) {\n                                throw new Error('Separators are required after variable length identifiers');\n                            }\n                            nextStart = value.length;\n                        }\n                    }\n                    subState.value = value.substring(index, nextStart).replace(regexSeparators, '');\n                    that.validate(current, subState.value);\n                    encoding.pushData(subState, that.dependentStates);\n                    if (nextStart >= value.length) {\n                        break;\n                    }\n                    index = nextStart;\n                    if (subState.state != that.startState) {\n                        encoding[that.startState].move(subState);\n                        subState.state = that.startState;\n                    }\n                    if (!current.ai.length) {\n                        encoding.addPattern(that.START);\n                    }\n                }\n                encodingState.index = encodingState.value.length;\n            },\n            validate: function (current, value) {\n                var code = value.substr(current.id.length), ai = current.ai;\n                if (!ai.type && !numberRegex.test(code)) {\n                    throw new Error('Application identifier ' + current.id + ' is numeric only but contains non numeric character(s).');\n                }\n                if (ai.type == 'alphanumeric' && !alphanumericRegex.test(code)) {\n                    throw new Error('Application identifier ' + current.id + ' is alphanumeric only but contains non alphanumeric character(s).');\n                }\n                if (ai.length && ai.length !== code.length) {\n                    throw new Error('Application identifier ' + current.id + ' must be ' + ai.length + ' characters long.');\n                }\n                if (ai.min && ai.min > code.length) {\n                    throw new Error('Application identifier ' + current.id + ' must be at least ' + ai.min + ' characters long.');\n                }\n                if (ai.max && ai.max < code.length) {\n                    throw new Error('Application identifier ' + current.id + ' must be at most ' + ai.max + ' characters long.');\n                }\n            },\n            getByLength: function (value, index) {\n                var that = this, id, ai;\n                for (var i = 2; i <= 4; i++) {\n                    id = getNext(value, index, i);\n                    ai = that.getAI(id) || that.getAI(id.substring(0, id.length - 1));\n                    if (ai) {\n                        return {\n                            id: id,\n                            ai: ai\n                        };\n                    }\n                }\n                that.unsupportedAIError(id);\n            },\n            unsupportedAIError: function (id) {\n                throw new Error(kendo.format('\\'{0}\\' is not a supported Application Identifier'), id);\n            },\n            getBySeparator: function (value, index) {\n                var that = this, start = value.indexOf(that.startAI, index), end = value.indexOf(that.endAI, start), id = value.substring(start + 1, end), ai = that.getAI(id) || that.getAI(id.substr(id.length - 1));\n                if (!ai) {\n                    that.unsupportedAIError(id);\n                }\n                return {\n                    ai: ai,\n                    id: id\n                };\n            },\n            getAI: function (id) {\n                var ai = this.applicationIdentifiers, multiKey = ai.multiKey;\n                if (ai[id]) {\n                    return ai[id];\n                }\n                for (var i = 0; i < multiKey.length; i++) {\n                    if (multiKey[i].ids && inArray(id, multiKey[i].ids) >= 0) {\n                        return multiKey[i].type;\n                    } else if (multiKey[i].ranges) {\n                        var ranges = multiKey[i].ranges;\n                        for (var j = 0; j < ranges.length; j++) {\n                            if (ranges[j][0] <= id && id <= ranges[j][1]) {\n                                return multiKey[i].type;\n                            }\n                        }\n                    }\n                }\n            },\n            applicationIdentifiers: {\n                '22': {\n                    max: 29,\n                    type: 'alphanumeric'\n                },\n                '402': { length: 17 },\n                '7004': {\n                    max: 4,\n                    type: 'alphanumeric'\n                },\n                '242': {\n                    max: 6,\n                    type: 'alphanumeric'\n                },\n                '8020': {\n                    max: 25,\n                    type: 'alphanumeric'\n                },\n                '703': {\n                    min: 3,\n                    max: 30,\n                    type: 'alphanumeric'\n                },\n                '8008': {\n                    min: 8,\n                    max: 12,\n                    type: 'alphanumeric'\n                },\n                '253': {\n                    min: 13,\n                    max: 17,\n                    type: 'alphanumeric'\n                },\n                '8003': {\n                    min: 14,\n                    max: 30,\n                    type: 'alphanumeric'\n                },\n                multiKey: [\n                    {\n                        ids: [\n                            '15',\n                            '17',\n                            '8005',\n                            '8100'\n                        ],\n                        ranges: [\n                            [\n                                11,\n                                13\n                            ],\n                            [\n                                310,\n                                316\n                            ],\n                            [\n                                320,\n                                336\n                            ],\n                            [\n                                340,\n                                369\n                            ]\n                        ],\n                        type: { length: 6 }\n                    },\n                    {\n                        ids: [\n                            '240',\n                            '241',\n                            '250',\n                            '251',\n                            '400',\n                            '401',\n                            '403',\n                            '7002',\n                            '8004',\n                            '8007',\n                            '8110'\n                        ],\n                        ranges: [[90 - 99]],\n                        type: {\n                            max: 30,\n                            type: 'alphanumeric'\n                        }\n                    },\n                    {\n                        ids: ['7001'],\n                        ranges: [[\n                                410,\n                                414\n                            ]],\n                        type: { length: 13 }\n                    },\n                    {\n                        ids: [\n                            '10',\n                            '21',\n                            '254',\n                            '420',\n                            '8002'\n                        ],\n                        type: {\n                            max: 20,\n                            type: 'alphanumeric'\n                        }\n                    },\n                    {\n                        ids: [\n                            '00',\n                            '8006',\n                            '8017',\n                            '8018'\n                        ],\n                        type: { length: 18 }\n                    },\n                    {\n                        ids: [\n                            '01',\n                            '02',\n                            '8001'\n                        ],\n                        type: { length: 14 }\n                    },\n                    {\n                        ids: ['422'],\n                        ranges: [[\n                                424,\n                                426\n                            ]],\n                        type: { length: 3 }\n                    },\n                    {\n                        ids: [\n                            '20',\n                            '8102'\n                        ],\n                        type: { length: 2 }\n                    },\n                    {\n                        ids: [\n                            '30',\n                            '37'\n                        ],\n                        type: {\n                            max: 8,\n                            type: 'alphanumeric'\n                        }\n                    },\n                    {\n                        ids: [\n                            '390',\n                            '392'\n                        ],\n                        type: {\n                            max: 15,\n                            type: 'alphanumeric'\n                        }\n                    },\n                    {\n                        ids: [\n                            '421',\n                            '423'\n                        ],\n                        type: {\n                            min: 3,\n                            max: 15,\n                            type: 'alphanumeric'\n                        }\n                    },\n                    {\n                        ids: [\n                            '391',\n                            '393'\n                        ],\n                        type: {\n                            min: 3,\n                            max: 18,\n                            type: 'alphanumeric'\n                        }\n                    },\n                    {\n                        ids: [\n                            '7003',\n                            '8101'\n                        ],\n                        type: { length: 10 }\n                    }\n                ]\n            },\n            START: 102\n        });\n        var code128Base = Encoding.extend({\n            init: function (options) {\n                Encoding.fn.init.call(this, options);\n                this._initStates();\n            },\n            _initStates: function () {\n                var that = this;\n                for (var i = 0; i < that.states.length; i++) {\n                    that[that.states[i]] = new states128[that.states[i]](that, that.states);\n                }\n            },\n            initValue: function (value, width, height) {\n                var that = this;\n                that.pattern = [];\n                that.value = value;\n                that.width = width;\n                that.height = height;\n                that.checkSum = 0;\n                that.totalUnits = 0;\n                that.index = 0;\n                that.position = 1;\n            },\n            addData: function () {\n                var that = this, encodingState = {\n                        value: that.value,\n                        index: 0,\n                        state: ''\n                    };\n                if (that.value.length === 0) {\n                    return;\n                }\n                encodingState.state = encodingState.previousState = that.getNextState(encodingState, that.states);\n                that.addStart(encodingState);\n                that.pushData(encodingState, that.states);\n                that.addCheckSum();\n                that.addStop();\n                that.setBaseUnit();\n            },\n            pushData: function (encodingState, states) {\n                var that = this;\n                while (true) {\n                    that[encodingState.state].pushState(encodingState);\n                    if (encodingState.index >= encodingState.value.length) {\n                        break;\n                    }\n                    if (!encodingState.shifted) {\n                        encodingState.previousState = encodingState.state;\n                        encodingState.state = that.getNextState(encodingState, states);\n                        that[encodingState.state].move(encodingState);\n                    } else {\n                        var temp = encodingState.state;\n                        encodingState.state = encodingState.previousState;\n                        encodingState.previousState = temp;\n                        encodingState.shifted = false;\n                    }\n                }\n            },\n            addStart: function (encodingState) {\n                this[encodingState.state].addStart(encodingState);\n                this.position = 1;\n            },\n            addCheckSum: function () {\n                var that = this;\n                that.checksum = that.checkSum % 103;\n                that.addPattern(that.checksum);\n            },\n            addStop: function () {\n                this.addPattern(this.STOP);\n            },\n            setBaseUnit: function () {\n                var that = this;\n                that.baseUnit = that.width / (that.totalUnits + that.quietZoneLength);\n            },\n            addPattern: function (code) {\n                var that = this, pattern = that.characterMap[code].toString(), value;\n                for (var i = 0; i < pattern.length; i++) {\n                    value = parseInt(pattern.charAt(i), 10);\n                    that.pattern.push(value);\n                    that.totalUnits += value;\n                }\n                that.checkSum += code * that.position++;\n            },\n            getNextState: function (encodingState, states) {\n                for (var i = 0; i < states.length; i++) {\n                    if (this[states[i]].is(encodingState.value, encodingState.index)) {\n                        return states[i];\n                    }\n                }\n                this.invalidCharacterError(encodingState.value.charAt(encodingState.index));\n            },\n            characterMap: [\n                212222,\n                222122,\n                222221,\n                121223,\n                121322,\n                131222,\n                122213,\n                122312,\n                132212,\n                221213,\n                221312,\n                231212,\n                112232,\n                122132,\n                122231,\n                113222,\n                123122,\n                123221,\n                223211,\n                221132,\n                221231,\n                213212,\n                223112,\n                312131,\n                311222,\n                321122,\n                321221,\n                312212,\n                322112,\n                322211,\n                212123,\n                212321,\n                232121,\n                111323,\n                131123,\n                131321,\n                112313,\n                132113,\n                132311,\n                211313,\n                231113,\n                231311,\n                112133,\n                112331,\n                132131,\n                113123,\n                113321,\n                133121,\n                313121,\n                211331,\n                231131,\n                213113,\n                213311,\n                213131,\n                311123,\n                311321,\n                331121,\n                312113,\n                312311,\n                332111,\n                314111,\n                221411,\n                431111,\n                111224,\n                111422,\n                121124,\n                121421,\n                141122,\n                141221,\n                112214,\n                112412,\n                122114,\n                122411,\n                142112,\n                142211,\n                241211,\n                221114,\n                413111,\n                241112,\n                134111,\n                111242,\n                121142,\n                121241,\n                114212,\n                124112,\n                124211,\n                411212,\n                421112,\n                421211,\n                212141,\n                214121,\n                412121,\n                111143,\n                111341,\n                131141,\n                114113,\n                114311,\n                411113,\n                411311,\n                113141,\n                114131,\n                311141,\n                411131,\n                211412,\n                211214,\n                211232,\n                2331112\n            ],\n            STOP: 106\n        });\n        encodings.code128a = code128Base.extend({\n            name: 'Code 128 A',\n            states: ['A']\n        });\n        encodings.code128b = code128Base.extend({\n            name: 'Code 128 B',\n            states: ['B']\n        });\n        encodings.code128c = code128Base.extend({\n            name: 'Code 128 C',\n            states: ['C']\n        });\n        encodings.code128 = code128Base.extend({\n            name: 'Code 128',\n            states: [\n                'C',\n                'B',\n                'A',\n                'FNC4'\n            ]\n        });\n        encodings['gs1-128'] = code128Base.extend({\n            name: 'Code GS1-128',\n            states: [\n                'FNC1',\n                'C',\n                'B'\n            ]\n        });\n        var msiBase = Encoding.extend({\n            initValue: function (value, width) {\n                var that = this;\n                that.pattern = [];\n                that.value = value;\n                that.checkSumLength = 0;\n                that.width = width;\n            },\n            setBaseUnit: function () {\n                var that = this, startStopLength = 7;\n                that.baseUnit = that.width / (12 * (that.value.length + that.checkSumLength) + that.quietZoneLength + startStopLength);\n            },\n            addData: function () {\n                var that = this, value = that.value;\n                that.addPattern(that.START);\n                for (var i = 0; i < value.length; i++) {\n                    that.addCharacter(value.charAt(i));\n                }\n                if (that.options.addCheckSum) {\n                    that.addCheckSum();\n                }\n                that.addPattern(that.STOP);\n                that.setBaseUnit();\n            },\n            addCharacter: function (character) {\n                var that = this, pattern = that.characterMap[character];\n                if (!pattern) {\n                    that.invalidCharacterError(character);\n                }\n                that.addPattern(pattern);\n            },\n            addPattern: function (pattern) {\n                for (var i = 0; i < pattern.length; i++) {\n                    this.pattern.push(parseInt(pattern.charAt(i), 10));\n                }\n            },\n            addCheckSum: function () {\n                var that = this, checkSumFunction = that.checkSums[that.checkSumType], checkValues;\n                checkValues = checkSumFunction.call(that.checkSums, that.value);\n                that.checksum = checkValues.join('');\n                for (var i = 0; i < checkValues.length; i++) {\n                    that.checkSumLength++;\n                    that.addPattern(that.characterMap[checkValues[i]]);\n                }\n            },\n            checkSums: {\n                Modulo10: function (value) {\n                    var checkValues = [\n                            0,\n                            ''\n                        ], odd = value.length % 2, idx, evenSum, oddSum;\n                    for (idx = 0; idx < value.length; idx++) {\n                        checkValues[(idx + odd) % 2] += parseInt(value.charAt(idx), 10);\n                    }\n                    oddSum = checkValues[0];\n                    evenSum = (checkValues[1] * 2).toString();\n                    for (idx = 0; idx < evenSum.length; idx++) {\n                        oddSum += parseInt(evenSum.charAt(idx), 10);\n                    }\n                    return [(10 - oddSum % 10) % 10];\n                },\n                Modulo11: function (value) {\n                    var weightedSum = 0, mod = 11, length = value.length, weight, checkValue;\n                    for (var i = 0; i < length; i++) {\n                        weight = ((length - i) % 6 || 6) + 1;\n                        weightedSum += weight * value.charAt(i);\n                    }\n                    checkValue = (mod - weightedSum % mod) % mod;\n                    if (checkValue != 10) {\n                        return [checkValue];\n                    }\n                    return [\n                        1,\n                        0\n                    ];\n                },\n                Modulo11Modulo10: function (value) {\n                    var checkValues = this.Modulo11(value), mod11Value;\n                    mod11Value = value + checkValues[0];\n                    return checkValues.concat(this.Modulo10(mod11Value));\n                },\n                Modulo10Modulo10: function (value) {\n                    var checkValues = this.Modulo10(value), mod10Value;\n                    mod10Value = value + checkValues[0];\n                    return checkValues.concat(this.Modulo10(mod10Value));\n                }\n            },\n            characterMap: [\n                '12121212',\n                '12121221',\n                '12122112',\n                '12122121',\n                '12211212',\n                '12211221',\n                '12212112',\n                '12212121',\n                '21121212',\n                '21121221'\n            ],\n            START: '21',\n            STOP: '121',\n            checkSumType: ''\n        });\n        encodings.msimod10 = msiBase.extend({\n            name: 'MSI Modulo10',\n            checkSumType: 'Modulo10'\n        });\n        encodings.msimod11 = msiBase.extend({\n            name: 'MSI Modulo11',\n            checkSumType: 'Modulo11'\n        });\n        encodings.msimod1110 = msiBase.extend({\n            name: 'MSI Modulo11 Modulo10',\n            checkSumType: 'Modulo11Modulo10'\n        });\n        encodings.msimod1010 = msiBase.extend({\n            name: 'MSI Modulo10 Modulo10',\n            checkSumType: 'Modulo10Modulo10'\n        });\n        encodings.code11 = Encoding.extend({\n            name: 'Code 11',\n            cCheckSumTotal: 10,\n            kCheckSumTotal: 9,\n            kCheckSumMinLength: 10,\n            checkSumMod: 11,\n            DASH_VALUE: 10,\n            DASH: '-',\n            START: '112211',\n            STOP: '11221',\n            initValue: function (value, width) {\n                var that = this;\n                that.pattern = [];\n                that.value = value;\n                that.width = width;\n                that.totalUnits = 0;\n            },\n            addData: function () {\n                var that = this;\n                var value = that.value;\n                that.addPattern(that.START);\n                for (var i = 0; i < value.length; i++) {\n                    that.addCharacter(value.charAt(i));\n                }\n                if (that.options.addCheckSum) {\n                    that.addCheckSum();\n                }\n                that.addPattern(that.STOP);\n                that.setBaseUnit();\n            },\n            setBaseUnit: function () {\n                var that = this;\n                that.baseUnit = that.width / (that.totalUnits + that.quietZoneLength);\n            },\n            addCheckSum: function () {\n                var that = this, value = that.value, length = value.length, cValue;\n                cValue = that.getWeightedSum(value, length, that.cCheckSumTotal) % that.checkSumMod;\n                that.checksum = cValue + '';\n                that.addPattern(that.characterMap[cValue]);\n                length++;\n                if (length >= that.kCheckSumMinLength) {\n                    var kValue = (cValue + that.getWeightedSum(value, length, that.kCheckSumTotal)) % that.checkSumMod;\n                    that.checksum += kValue;\n                    that.addPattern(that.characterMap[kValue]);\n                }\n            },\n            getWeightedSum: function (value, length, total) {\n                var weightedSum = 0;\n                for (var i = 0; i < value.length; i++) {\n                    weightedSum += this.weightedValue(this.getValue(value.charAt(i)), length, i, total);\n                }\n                return weightedSum;\n            },\n            weightedValue: function (value, length, index, total) {\n                var weight = (length - index) % total || total;\n                return weight * value;\n            },\n            getValue: function (character) {\n                var that = this;\n                if (!isNaN(character)) {\n                    return parseInt(character, 10);\n                } else if (character !== that.DASH) {\n                    that.invalidCharacterError(character);\n                }\n                return that.DASH_VALUE;\n            },\n            addCharacter: function (character) {\n                var that = this, value = that.getValue(character), pattern = that.characterMap[value];\n                that.addPattern(pattern);\n            },\n            addPattern: function (pattern) {\n                var value;\n                for (var i = 0; i < pattern.length; i++) {\n                    value = parseInt(pattern.charAt(i), 10);\n                    this.pattern.push(value);\n                    this.totalUnits += value;\n                }\n            },\n            characterMap: [\n                '111121',\n                '211121',\n                '121121',\n                '221111',\n                '112121',\n                '212111',\n                '122111',\n                '111221',\n                '211211',\n                '211111',\n                '112111'\n            ],\n            options: { addCheckSum: true }\n        });\n        encodings.postnet = Encoding.extend({\n            name: 'Postnet',\n            START: '2',\n            VALID_CODE_LENGTHS: [\n                5,\n                9,\n                11\n            ],\n            DIGIT_SEPARATOR: '-',\n            initValue: function (value, width, height) {\n                var that = this;\n                that.height = height;\n                that.width = width;\n                that.baseHeight = height / 2;\n                that.value = value.replace(new RegExp(that.DIGIT_SEPARATOR, 'g'), '');\n                that.pattern = [];\n                that.validate(that.value);\n                that.checkSum = 0;\n                that.setBaseUnit();\n            },\n            addData: function () {\n                var that = this, value = that.value;\n                that.addPattern(that.START);\n                for (var i = 0; i < value.length; i++) {\n                    that.addCharacter(value.charAt(i));\n                }\n                if (that.options.addCheckSum) {\n                    that.addCheckSum();\n                }\n                that.addPattern(that.START);\n                that.pattern.pop();\n            },\n            addCharacter: function (character) {\n                var that = this, pattern = that.characterMap[character];\n                that.checkSum += parseInt(character, 10);\n                that.addPattern(pattern);\n            },\n            addCheckSum: function () {\n                var that = this;\n                that.checksum = (10 - that.checkSum % 10) % 10;\n                that.addCharacter(that.checksum);\n            },\n            setBaseUnit: function () {\n                var that = this, startStopLength = 3;\n                that.baseUnit = that.width / ((that.value.length + 1) * 10 + startStopLength + that.quietZoneLength);\n            },\n            validate: function (value) {\n                var that = this;\n                if (!numberRegex.test(value)) {\n                    that.invalidCharacterError(value.match(/[^0-9]/)[0]);\n                }\n                if (inArray(value.length, that.VALID_CODE_LENGTHS) < 0) {\n                    throw new Error('Invalid value length. Valid lengths for the Postnet symbology are ' + that.VALID_CODE_LENGTHS.join(','));\n                }\n            },\n            addPattern: function (pattern) {\n                var that = this, y1;\n                for (var i = 0; i < pattern.length; i++) {\n                    y1 = that.height - that.baseHeight * pattern.charAt(i);\n                    that.pattern.push({\n                        width: 1,\n                        y1: y1,\n                        y2: that.height\n                    });\n                    that.pattern.push(1);\n                }\n            },\n            characterMap: [\n                '22111',\n                '11122',\n                '11212',\n                '11221',\n                '12112',\n                '12121',\n                '12211',\n                '21112',\n                '21121',\n                '21211'\n            ]\n        });\n        encodings.ean13 = Encoding.extend({\n            initValue: function (value, width, height) {\n                value += '';\n                if (value.length != 12 || /\\D/.test(value)) {\n                    throw new Error('The value of the \"EAN13\" encoding should be 12 symbols');\n                }\n                var that = this;\n                that.pattern = [];\n                that.options.height = height;\n                that.baseUnit = width / (95 + that.quietZoneLength);\n                that.value = value;\n                that.checksum = that.calculateChecksum();\n                that.leftKey = value[0];\n                that.leftPart = value.substr(1, 6);\n                that.rightPart = value.substr(7) + that.checksum;\n            },\n            addData: function () {\n                var that = this;\n                that.addPieces(that.characterMap.start);\n                that.addSide(that.leftPart, that.leftKey);\n                that.addPieces(that.characterMap.middle);\n                that.addSide(that.rightPart);\n                that.addPieces(that.characterMap.start);\n            },\n            addSide: function (leftPart, key) {\n                var that = this;\n                for (var i = 0; i < leftPart.length; i++) {\n                    if (key && parseInt(that.keyTable[key].charAt(i), 10)) {\n                        that.addPieces(Array.prototype.slice.call(that.characterMap.digits[leftPart.charAt(i)]).reverse(), true);\n                    } else {\n                        that.addPieces(that.characterMap.digits[leftPart.charAt(i)], true);\n                    }\n                }\n            },\n            addPieces: function (arrToAdd, limitedHeight) {\n                var that = this;\n                for (var i = 0; i < arrToAdd.length; i++) {\n                    if (limitedHeight) {\n                        that.pattern.push({\n                            y1: 0,\n                            y2: that.options.height * 0.95,\n                            width: arrToAdd[i]\n                        });\n                    } else {\n                        that.pattern.push(arrToAdd[i]);\n                    }\n                }\n            },\n            calculateChecksum: function () {\n                var odd = 0, even = 0, value = this.value.split('').reverse().join('');\n                for (var i = 0; i < value.length; i++) {\n                    if (i % 2) {\n                        even += parseInt(value.charAt(i), 10);\n                    } else {\n                        odd += parseInt(value.charAt(i), 10);\n                    }\n                }\n                var checksum = (10 - (3 * odd + even) % 10) % 10;\n                return checksum;\n            },\n            keyTable: [\n                '000000',\n                '001011',\n                '001101',\n                '001110',\n                '010011',\n                '011001',\n                '011100',\n                '010101',\n                '010110',\n                '011010'\n            ],\n            characterMap: {\n                digits: [\n                    [\n                        3,\n                        2,\n                        1,\n                        1\n                    ],\n                    [\n                        2,\n                        2,\n                        2,\n                        1\n                    ],\n                    [\n                        2,\n                        1,\n                        2,\n                        2\n                    ],\n                    [\n                        1,\n                        4,\n                        1,\n                        1\n                    ],\n                    [\n                        1,\n                        1,\n                        3,\n                        2\n                    ],\n                    [\n                        1,\n                        2,\n                        3,\n                        1\n                    ],\n                    [\n                        1,\n                        1,\n                        1,\n                        4\n                    ],\n                    [\n                        1,\n                        3,\n                        1,\n                        2\n                    ],\n                    [\n                        1,\n                        2,\n                        1,\n                        3\n                    ],\n                    [\n                        3,\n                        1,\n                        1,\n                        2\n                    ]\n                ],\n                start: [\n                    1,\n                    1,\n                    1\n                ],\n                middle: [\n                    1,\n                    1,\n                    1,\n                    1,\n                    1\n                ]\n            }\n        });\n        encodings.ean8 = encodings.ean13.extend({\n            initValue: function (value, width, height) {\n                var that = this;\n                if (value.length != 7 || /\\D/.test(value)) {\n                    throw new Error('Invalid value provided');\n                }\n                that.value = value;\n                that.options.height = height;\n                that.checksum = that.calculateChecksum(that.value);\n                that.leftPart = that.value.substr(0, 4);\n                that.rightPart = that.value.substr(4) + that.checksum;\n                that.pattern = [];\n                that.baseUnit = width / (67 + that.quietZoneLength);\n            }\n        });\n        var Barcode = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.element = $(element);\n                that.wrapper = that.element;\n                that.element.addClass('k-barcode').css('display', 'block');\n                that.surfaceWrap = $('<div />').css('position', 'relative').appendTo(this.element);\n                that.surface = draw.Surface.create(that.surfaceWrap, { type: that.options.renderAs });\n                that._setOptions(options);\n                if (options && defined(options.value)) {\n                    that.redraw();\n                }\n            },\n            setOptions: function (options) {\n                this._setOptions(options);\n                this.redraw();\n            },\n            redraw: function () {\n                var size = this._getSize();\n                this.surface.clear();\n                this.surface.setSize({\n                    width: size.width,\n                    height: size.height\n                });\n                this.createVisual();\n                this.surface.draw(this.visual);\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            _resize: function () {\n                this.redraw();\n            },\n            createVisual: function () {\n                this.visual = this._render();\n            },\n            _render: function () {\n                var that = this, options = that.options, value = options.value, textOptions = options.text, textMargin = dataviz.getSpacing(textOptions.margin), size = that._getSize(), border = options.border || {}, encoding = that.encoding, contentBox = new Box2D(0, 0, size.width, size.height).unpad(border.width).unpad(options.padding), barHeight = contentBox.height(), result, textToDisplay, textHeight;\n                var visual = new draw.Group();\n                that.contentBox = contentBox;\n                visual.append(that._getBackground(size));\n                if (textOptions.visible) {\n                    textHeight = draw.util.measureText(value, { font: textOptions.font }).height;\n                    barHeight -= textHeight + textMargin.top + textMargin.bottom;\n                }\n                result = encoding.encode(value, contentBox.width(), barHeight);\n                if (textOptions.visible) {\n                    textToDisplay = value;\n                    if (options.checksum && defined(encoding.checksum)) {\n                        textToDisplay += ' ' + encoding.checksum;\n                    }\n                    visual.append(that._getText(textToDisplay));\n                }\n                that.barHeight = barHeight;\n                this._bandsGroup = this._getBands(result.pattern, result.baseUnit);\n                visual.append(this._bandsGroup);\n                return visual;\n            },\n            exportVisual: function () {\n                return this._render();\n            },\n            _getSize: function () {\n                var that = this, element = that.element, size = new geom.Size(DEFAULT_WIDTH, DEFAULT_HEIGHT);\n                if (element.width() > 0) {\n                    size.width = element.width();\n                }\n                if (element.height() > 0) {\n                    size.height = element.height();\n                }\n                if (that.options.width) {\n                    size.width = that.options.width;\n                }\n                if (that.options.height) {\n                    size.height = that.options.height;\n                }\n                return size;\n            },\n            value: function (value) {\n                var that = this;\n                if (!defined(value)) {\n                    return that.options.value;\n                }\n                that.options.value = value + '';\n                that.redraw();\n            },\n            _getBands: function (pattern, baseUnit) {\n                var that = this, contentBox = that.contentBox, position = contentBox.x1, step, item;\n                var group = new draw.Group();\n                for (var i = 0; i < pattern.length; i++) {\n                    item = isPlainObject(pattern[i]) ? pattern[i] : {\n                        width: pattern[i],\n                        y1: 0,\n                        y2: that.barHeight\n                    };\n                    step = item.width * baseUnit;\n                    if (i % 2) {\n                        var rect = geom.Rect.fromPoints(new geom.Point(position, item.y1 + contentBox.y1), new geom.Point(position + step, item.y2 + contentBox.y1));\n                        var path = draw.Path.fromRect(rect, {\n                            fill: { color: that.options.color },\n                            stroke: null\n                        });\n                        group.append(path);\n                    }\n                    position += step;\n                }\n                return group;\n            },\n            _getBackground: function (size) {\n                var that = this, options = that.options, border = options.border || {};\n                var box = new Box2D(0, 0, size.width, size.height).unpad(border.width / 2);\n                var path = draw.Path.fromRect(box.toRect(), {\n                    fill: { color: options.background },\n                    stroke: {\n                        color: border.width ? border.color : '',\n                        width: border.width,\n                        dashType: border.dashType\n                    }\n                });\n                return path;\n            },\n            _getText: function (value) {\n                var that = this, textOptions = that.options.text, text = that._textbox = new TextBox(value, {\n                        font: textOptions.font,\n                        color: textOptions.color,\n                        align: 'center',\n                        vAlign: 'bottom',\n                        margin: textOptions.margin\n                    });\n                text.reflow(that.contentBox);\n                text.renderVisual();\n                return text.visual;\n            },\n            _setOptions: function (options) {\n                var that = this;\n                that.type = (options.type || that.options.type).toLowerCase();\n                if (that.type == 'upca') {\n                    that.type = 'ean13';\n                    options.value = '0' + options.value;\n                }\n                if (that.type == 'upce') {\n                    that.type = 'ean8';\n                    options.value = '0' + options.value;\n                }\n                if (!encodings[that.type]) {\n                    throw new Error('Encoding ' + that.type + 'is not supported.');\n                }\n                that.encoding = new encodings[that.type]();\n                that.options = extend(true, that.options, options);\n            },\n            options: {\n                name: 'Barcode',\n                renderAs: 'svg',\n                value: '',\n                type: 'code39',\n                checksum: false,\n                width: 0,\n                height: 0,\n                color: 'black',\n                background: 'white',\n                text: {\n                    visible: true,\n                    font: '16px Consolas, Monaco, Sans Mono, monospace, sans-serif',\n                    color: 'black',\n                    margin: {\n                        top: 0,\n                        bottom: 0,\n                        left: 0,\n                        right: 0\n                    }\n                },\n                border: {\n                    width: 0,\n                    dashType: 'solid',\n                    color: 'black'\n                },\n                padding: {\n                    top: 0,\n                    bottom: 0,\n                    left: 0,\n                    right: 0\n                }\n            }\n        });\n        dataviz.ExportMixin.extend(Barcode.fn);\n        dataviz.ui.plugin(Barcode);\n        kendo.deepExtend(dataviz, {\n            encodings: encodings,\n            Encoding: Encoding\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.qrcode', [\n        'kendo.dataviz.core',\n        'kendo.drawing'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.qrcode',\n        name: 'QRCode',\n        category: 'dataviz',\n        description: 'QRCode widget.',\n        depends: [\n            'dataviz.core',\n            'drawing'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, extend = $.extend, draw = kendo.drawing, dataviz = kendo.dataviz, Widget = kendo.ui.Widget, Box2D = dataviz.Box2D, terminator = '0000', NUMERIC = 'numeric', ALPHA_NUMERIC = 'alphanumeric', BYTE = 'byte', powersOfTwo = { '1': 0 }, powersOfTwoResult = { '0': 1 }, generatorPolynomials = [\n                [\n                    1,\n                    0\n                ],\n                [\n                    1,\n                    25,\n                    0\n                ]\n            ], irregularAlignmentPatternsStartDistance = {\n                15: 20,\n                16: 20,\n                18: 24,\n                19: 24,\n                22: 20,\n                24: 22,\n                26: 24,\n                28: 20,\n                30: 20,\n                31: 24,\n                32: 28,\n                33: 24,\n                36: 18,\n                37: 22,\n                39: 20,\n                40: 24\n            }, versionsCodewordsInformation = [\n                {\n                    L: {\n                        groups: [[\n                                1,\n                                19\n                            ]],\n                        totalDataCodewords: 19,\n                        errorCodewordsPerBlock: 7\n                    },\n                    M: {\n                        groups: [[\n                                1,\n                                16\n                            ]],\n                        totalDataCodewords: 16,\n                        errorCodewordsPerBlock: 10\n                    },\n                    Q: {\n                        groups: [[\n                                1,\n                                13\n                            ]],\n                        totalDataCodewords: 13,\n                        errorCodewordsPerBlock: 13\n                    },\n                    H: {\n                        groups: [[\n                                1,\n                                9\n                            ]],\n                        totalDataCodewords: 9,\n                        errorCodewordsPerBlock: 17\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                1,\n                                34\n                            ]],\n                        totalDataCodewords: 34,\n                        errorCodewordsPerBlock: 10\n                    },\n                    M: {\n                        groups: [[\n                                1,\n                                28\n                            ]],\n                        totalDataCodewords: 28,\n                        errorCodewordsPerBlock: 16\n                    },\n                    Q: {\n                        groups: [[\n                                1,\n                                22\n                            ]],\n                        totalDataCodewords: 22,\n                        errorCodewordsPerBlock: 22\n                    },\n                    H: {\n                        groups: [[\n                                1,\n                                16\n                            ]],\n                        totalDataCodewords: 16,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                1,\n                                55\n                            ]],\n                        totalDataCodewords: 55,\n                        errorCodewordsPerBlock: 15\n                    },\n                    M: {\n                        groups: [[\n                                1,\n                                44\n                            ]],\n                        totalDataCodewords: 44,\n                        errorCodewordsPerBlock: 26\n                    },\n                    Q: {\n                        groups: [[\n                                2,\n                                17\n                            ]],\n                        totalDataCodewords: 34,\n                        errorCodewordsPerBlock: 18\n                    },\n                    H: {\n                        groups: [[\n                                2,\n                                13\n                            ]],\n                        totalDataCodewords: 26,\n                        errorCodewordsPerBlock: 22\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                1,\n                                80\n                            ]],\n                        totalDataCodewords: 80,\n                        errorCodewordsPerBlock: 20\n                    },\n                    M: {\n                        groups: [[\n                                2,\n                                32\n                            ]],\n                        totalDataCodewords: 64,\n                        errorCodewordsPerBlock: 18\n                    },\n                    Q: {\n                        groups: [[\n                                2,\n                                24\n                            ]],\n                        totalDataCodewords: 48,\n                        errorCodewordsPerBlock: 26\n                    },\n                    H: {\n                        groups: [[\n                                4,\n                                9\n                            ]],\n                        totalDataCodewords: 36,\n                        errorCodewordsPerBlock: 16\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                1,\n                                108\n                            ]],\n                        totalDataCodewords: 108,\n                        errorCodewordsPerBlock: 26\n                    },\n                    M: {\n                        groups: [[\n                                2,\n                                43\n                            ]],\n                        totalDataCodewords: 86,\n                        errorCodewordsPerBlock: 24\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                2,\n                                15\n                            ],\n                            [\n                                2,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 62,\n                        errorCodewordsPerBlock: 18\n                    },\n                    H: {\n                        groups: [\n                            [\n                                2,\n                                11\n                            ],\n                            [\n                                2,\n                                12\n                            ]\n                        ],\n                        totalDataCodewords: 46,\n                        errorCodewordsPerBlock: 22\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                2,\n                                68\n                            ]],\n                        totalDataCodewords: 136,\n                        errorCodewordsPerBlock: 18\n                    },\n                    M: {\n                        groups: [[\n                                4,\n                                27\n                            ]],\n                        totalDataCodewords: 108,\n                        errorCodewordsPerBlock: 16\n                    },\n                    Q: {\n                        groups: [[\n                                4,\n                                19\n                            ]],\n                        totalDataCodewords: 76,\n                        errorCodewordsPerBlock: 24\n                    },\n                    H: {\n                        groups: [[\n                                4,\n                                15\n                            ]],\n                        totalDataCodewords: 60,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                2,\n                                78\n                            ]],\n                        totalDataCodewords: 156,\n                        errorCodewordsPerBlock: 20\n                    },\n                    M: {\n                        groups: [[\n                                4,\n                                31\n                            ]],\n                        totalDataCodewords: 124,\n                        errorCodewordsPerBlock: 18\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                2,\n                                14\n                            ],\n                            [\n                                4,\n                                15\n                            ]\n                        ],\n                        totalDataCodewords: 88,\n                        errorCodewordsPerBlock: 18\n                    },\n                    H: {\n                        groups: [\n                            [\n                                4,\n                                13\n                            ],\n                            [\n                                1,\n                                14\n                            ]\n                        ],\n                        totalDataCodewords: 66,\n                        errorCodewordsPerBlock: 26\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                2,\n                                97\n                            ]],\n                        totalDataCodewords: 194,\n                        errorCodewordsPerBlock: 24\n                    },\n                    M: {\n                        groups: [\n                            [\n                                2,\n                                38\n                            ],\n                            [\n                                2,\n                                39\n                            ]\n                        ],\n                        totalDataCodewords: 154,\n                        errorCodewordsPerBlock: 22\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                4,\n                                18\n                            ],\n                            [\n                                2,\n                                19\n                            ]\n                        ],\n                        totalDataCodewords: 110,\n                        errorCodewordsPerBlock: 22\n                    },\n                    H: {\n                        groups: [\n                            [\n                                4,\n                                14\n                            ],\n                            [\n                                2,\n                                15\n                            ]\n                        ],\n                        totalDataCodewords: 86,\n                        errorCodewordsPerBlock: 26\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                2,\n                                116\n                            ]],\n                        totalDataCodewords: 232,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                3,\n                                36\n                            ],\n                            [\n                                2,\n                                37\n                            ]\n                        ],\n                        totalDataCodewords: 182,\n                        errorCodewordsPerBlock: 22\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                4,\n                                16\n                            ],\n                            [\n                                4,\n                                17\n                            ]\n                        ],\n                        totalDataCodewords: 132,\n                        errorCodewordsPerBlock: 20\n                    },\n                    H: {\n                        groups: [\n                            [\n                                4,\n                                12\n                            ],\n                            [\n                                4,\n                                13\n                            ]\n                        ],\n                        totalDataCodewords: 100,\n                        errorCodewordsPerBlock: 24\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                2,\n                                68\n                            ],\n                            [\n                                2,\n                                69\n                            ]\n                        ],\n                        totalDataCodewords: 274,\n                        errorCodewordsPerBlock: 18\n                    },\n                    M: {\n                        groups: [\n                            [\n                                4,\n                                43\n                            ],\n                            [\n                                1,\n                                44\n                            ]\n                        ],\n                        totalDataCodewords: 216,\n                        errorCodewordsPerBlock: 26\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                6,\n                                19\n                            ],\n                            [\n                                2,\n                                20\n                            ]\n                        ],\n                        totalDataCodewords: 154,\n                        errorCodewordsPerBlock: 24\n                    },\n                    H: {\n                        groups: [\n                            [\n                                6,\n                                15\n                            ],\n                            [\n                                2,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 122,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                4,\n                                81\n                            ]],\n                        totalDataCodewords: 324,\n                        errorCodewordsPerBlock: 20\n                    },\n                    M: {\n                        groups: [\n                            [\n                                1,\n                                50\n                            ],\n                            [\n                                4,\n                                51\n                            ]\n                        ],\n                        totalDataCodewords: 254,\n                        errorCodewordsPerBlock: 30\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                4,\n                                22\n                            ],\n                            [\n                                4,\n                                23\n                            ]\n                        ],\n                        totalDataCodewords: 180,\n                        errorCodewordsPerBlock: 28\n                    },\n                    H: {\n                        groups: [\n                            [\n                                3,\n                                12\n                            ],\n                            [\n                                8,\n                                13\n                            ]\n                        ],\n                        totalDataCodewords: 140,\n                        errorCodewordsPerBlock: 24\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                2,\n                                92\n                            ],\n                            [\n                                2,\n                                93\n                            ]\n                        ],\n                        totalDataCodewords: 370,\n                        errorCodewordsPerBlock: 24\n                    },\n                    M: {\n                        groups: [\n                            [\n                                6,\n                                36\n                            ],\n                            [\n                                2,\n                                37\n                            ]\n                        ],\n                        totalDataCodewords: 290,\n                        errorCodewordsPerBlock: 22\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                4,\n                                20\n                            ],\n                            [\n                                6,\n                                21\n                            ]\n                        ],\n                        totalDataCodewords: 206,\n                        errorCodewordsPerBlock: 26\n                    },\n                    H: {\n                        groups: [\n                            [\n                                7,\n                                14\n                            ],\n                            [\n                                4,\n                                15\n                            ]\n                        ],\n                        totalDataCodewords: 158,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                4,\n                                107\n                            ]],\n                        totalDataCodewords: 428,\n                        errorCodewordsPerBlock: 26\n                    },\n                    M: {\n                        groups: [\n                            [\n                                8,\n                                37\n                            ],\n                            [\n                                1,\n                                38\n                            ]\n                        ],\n                        totalDataCodewords: 334,\n                        errorCodewordsPerBlock: 22\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                8,\n                                20\n                            ],\n                            [\n                                4,\n                                21\n                            ]\n                        ],\n                        totalDataCodewords: 244,\n                        errorCodewordsPerBlock: 24\n                    },\n                    H: {\n                        groups: [\n                            [\n                                12,\n                                11\n                            ],\n                            [\n                                4,\n                                12\n                            ]\n                        ],\n                        totalDataCodewords: 180,\n                        errorCodewordsPerBlock: 22\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                3,\n                                115\n                            ],\n                            [\n                                1,\n                                116\n                            ]\n                        ],\n                        totalDataCodewords: 461,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                4,\n                                40\n                            ],\n                            [\n                                5,\n                                41\n                            ]\n                        ],\n                        totalDataCodewords: 365,\n                        errorCodewordsPerBlock: 24\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                11,\n                                16\n                            ],\n                            [\n                                5,\n                                17\n                            ]\n                        ],\n                        totalDataCodewords: 261,\n                        errorCodewordsPerBlock: 20\n                    },\n                    H: {\n                        groups: [\n                            [\n                                11,\n                                12\n                            ],\n                            [\n                                5,\n                                13\n                            ]\n                        ],\n                        totalDataCodewords: 197,\n                        errorCodewordsPerBlock: 24\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                5,\n                                87\n                            ],\n                            [\n                                1,\n                                88\n                            ]\n                        ],\n                        totalDataCodewords: 523,\n                        errorCodewordsPerBlock: 22\n                    },\n                    M: {\n                        groups: [\n                            [\n                                5,\n                                41\n                            ],\n                            [\n                                5,\n                                42\n                            ]\n                        ],\n                        totalDataCodewords: 415,\n                        errorCodewordsPerBlock: 24\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                5,\n                                24\n                            ],\n                            [\n                                7,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 295,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                11,\n                                12\n                            ],\n                            [\n                                7,\n                                13\n                            ]\n                        ],\n                        totalDataCodewords: 223,\n                        errorCodewordsPerBlock: 24\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                5,\n                                98\n                            ],\n                            [\n                                1,\n                                99\n                            ]\n                        ],\n                        totalDataCodewords: 589,\n                        errorCodewordsPerBlock: 24\n                    },\n                    M: {\n                        groups: [\n                            [\n                                7,\n                                45\n                            ],\n                            [\n                                3,\n                                46\n                            ]\n                        ],\n                        totalDataCodewords: 453,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                15,\n                                19\n                            ],\n                            [\n                                2,\n                                20\n                            ]\n                        ],\n                        totalDataCodewords: 325,\n                        errorCodewordsPerBlock: 24\n                    },\n                    H: {\n                        groups: [\n                            [\n                                3,\n                                15\n                            ],\n                            [\n                                13,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 253,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                1,\n                                107\n                            ],\n                            [\n                                5,\n                                108\n                            ]\n                        ],\n                        totalDataCodewords: 647,\n                        errorCodewordsPerBlock: 28\n                    },\n                    M: {\n                        groups: [\n                            [\n                                10,\n                                46\n                            ],\n                            [\n                                1,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 507,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                1,\n                                22\n                            ],\n                            [\n                                15,\n                                23\n                            ]\n                        ],\n                        totalDataCodewords: 367,\n                        errorCodewordsPerBlock: 28\n                    },\n                    H: {\n                        groups: [\n                            [\n                                2,\n                                14\n                            ],\n                            [\n                                17,\n                                15\n                            ]\n                        ],\n                        totalDataCodewords: 283,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                5,\n                                120\n                            ],\n                            [\n                                1,\n                                121\n                            ]\n                        ],\n                        totalDataCodewords: 721,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                9,\n                                43\n                            ],\n                            [\n                                4,\n                                44\n                            ]\n                        ],\n                        totalDataCodewords: 563,\n                        errorCodewordsPerBlock: 26\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                17,\n                                22\n                            ],\n                            [\n                                1,\n                                23\n                            ]\n                        ],\n                        totalDataCodewords: 397,\n                        errorCodewordsPerBlock: 28\n                    },\n                    H: {\n                        groups: [\n                            [\n                                2,\n                                14\n                            ],\n                            [\n                                19,\n                                15\n                            ]\n                        ],\n                        totalDataCodewords: 313,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                3,\n                                113\n                            ],\n                            [\n                                4,\n                                114\n                            ]\n                        ],\n                        totalDataCodewords: 795,\n                        errorCodewordsPerBlock: 28\n                    },\n                    M: {\n                        groups: [\n                            [\n                                3,\n                                44\n                            ],\n                            [\n                                11,\n                                45\n                            ]\n                        ],\n                        totalDataCodewords: 627,\n                        errorCodewordsPerBlock: 26\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                17,\n                                21\n                            ],\n                            [\n                                4,\n                                22\n                            ]\n                        ],\n                        totalDataCodewords: 445,\n                        errorCodewordsPerBlock: 26\n                    },\n                    H: {\n                        groups: [\n                            [\n                                9,\n                                13\n                            ],\n                            [\n                                16,\n                                14\n                            ]\n                        ],\n                        totalDataCodewords: 341,\n                        errorCodewordsPerBlock: 26\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                3,\n                                107\n                            ],\n                            [\n                                5,\n                                108\n                            ]\n                        ],\n                        totalDataCodewords: 861,\n                        errorCodewordsPerBlock: 28\n                    },\n                    M: {\n                        groups: [\n                            [\n                                3,\n                                41\n                            ],\n                            [\n                                13,\n                                42\n                            ]\n                        ],\n                        totalDataCodewords: 669,\n                        errorCodewordsPerBlock: 26\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                15,\n                                24\n                            ],\n                            [\n                                5,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 485,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                15,\n                                15\n                            ],\n                            [\n                                10,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 385,\n                        errorCodewordsPerBlock: 28\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                4,\n                                116\n                            ],\n                            [\n                                4,\n                                117\n                            ]\n                        ],\n                        totalDataCodewords: 932,\n                        errorCodewordsPerBlock: 28\n                    },\n                    M: {\n                        groups: [[\n                                17,\n                                42\n                            ]],\n                        totalDataCodewords: 714,\n                        errorCodewordsPerBlock: 26\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                17,\n                                22\n                            ],\n                            [\n                                6,\n                                23\n                            ]\n                        ],\n                        totalDataCodewords: 512,\n                        errorCodewordsPerBlock: 28\n                    },\n                    H: {\n                        groups: [\n                            [\n                                19,\n                                16\n                            ],\n                            [\n                                6,\n                                17\n                            ]\n                        ],\n                        totalDataCodewords: 406,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                2,\n                                111\n                            ],\n                            [\n                                7,\n                                112\n                            ]\n                        ],\n                        totalDataCodewords: 1006,\n                        errorCodewordsPerBlock: 28\n                    },\n                    M: {\n                        groups: [[\n                                17,\n                                46\n                            ]],\n                        totalDataCodewords: 782,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                7,\n                                24\n                            ],\n                            [\n                                16,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 568,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [[\n                                34,\n                                13\n                            ]],\n                        totalDataCodewords: 442,\n                        errorCodewordsPerBlock: 24\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                4,\n                                121\n                            ],\n                            [\n                                5,\n                                122\n                            ]\n                        ],\n                        totalDataCodewords: 1094,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                4,\n                                47\n                            ],\n                            [\n                                14,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 860,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                11,\n                                24\n                            ],\n                            [\n                                14,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 614,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                16,\n                                15\n                            ],\n                            [\n                                14,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 464,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                6,\n                                117\n                            ],\n                            [\n                                4,\n                                118\n                            ]\n                        ],\n                        totalDataCodewords: 1174,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                6,\n                                45\n                            ],\n                            [\n                                14,\n                                46\n                            ]\n                        ],\n                        totalDataCodewords: 914,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                11,\n                                24\n                            ],\n                            [\n                                16,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 664,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                30,\n                                16\n                            ],\n                            [\n                                2,\n                                17\n                            ]\n                        ],\n                        totalDataCodewords: 514,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                8,\n                                106\n                            ],\n                            [\n                                4,\n                                107\n                            ]\n                        ],\n                        totalDataCodewords: 1276,\n                        errorCodewordsPerBlock: 26\n                    },\n                    M: {\n                        groups: [\n                            [\n                                8,\n                                47\n                            ],\n                            [\n                                13,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 1000,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                7,\n                                24\n                            ],\n                            [\n                                22,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 718,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                22,\n                                15\n                            ],\n                            [\n                                13,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 538,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                10,\n                                114\n                            ],\n                            [\n                                2,\n                                115\n                            ]\n                        ],\n                        totalDataCodewords: 1370,\n                        errorCodewordsPerBlock: 28\n                    },\n                    M: {\n                        groups: [\n                            [\n                                19,\n                                46\n                            ],\n                            [\n                                4,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 1062,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                28,\n                                22\n                            ],\n                            [\n                                6,\n                                23\n                            ]\n                        ],\n                        totalDataCodewords: 754,\n                        errorCodewordsPerBlock: 28\n                    },\n                    H: {\n                        groups: [\n                            [\n                                33,\n                                16\n                            ],\n                            [\n                                4,\n                                17\n                            ]\n                        ],\n                        totalDataCodewords: 596,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                8,\n                                122\n                            ],\n                            [\n                                4,\n                                123\n                            ]\n                        ],\n                        totalDataCodewords: 1468,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                22,\n                                45\n                            ],\n                            [\n                                3,\n                                46\n                            ]\n                        ],\n                        totalDataCodewords: 1128,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                8,\n                                23\n                            ],\n                            [\n                                26,\n                                24\n                            ]\n                        ],\n                        totalDataCodewords: 808,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                12,\n                                15\n                            ],\n                            [\n                                28,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 628,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                3,\n                                117\n                            ],\n                            [\n                                10,\n                                118\n                            ]\n                        ],\n                        totalDataCodewords: 1531,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                3,\n                                45\n                            ],\n                            [\n                                23,\n                                46\n                            ]\n                        ],\n                        totalDataCodewords: 1193,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                4,\n                                24\n                            ],\n                            [\n                                31,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 871,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                11,\n                                15\n                            ],\n                            [\n                                31,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 661,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                7,\n                                116\n                            ],\n                            [\n                                7,\n                                117\n                            ]\n                        ],\n                        totalDataCodewords: 1631,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                21,\n                                45\n                            ],\n                            [\n                                7,\n                                46\n                            ]\n                        ],\n                        totalDataCodewords: 1267,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                1,\n                                23\n                            ],\n                            [\n                                37,\n                                24\n                            ]\n                        ],\n                        totalDataCodewords: 911,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                19,\n                                15\n                            ],\n                            [\n                                26,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 701,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                5,\n                                115\n                            ],\n                            [\n                                10,\n                                116\n                            ]\n                        ],\n                        totalDataCodewords: 1735,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                19,\n                                47\n                            ],\n                            [\n                                10,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 1373,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                15,\n                                24\n                            ],\n                            [\n                                25,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 985,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                23,\n                                15\n                            ],\n                            [\n                                25,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 745,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                13,\n                                115\n                            ],\n                            [\n                                3,\n                                116\n                            ]\n                        ],\n                        totalDataCodewords: 1843,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                2,\n                                46\n                            ],\n                            [\n                                29,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 1455,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                42,\n                                24\n                            ],\n                            [\n                                1,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1033,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                23,\n                                15\n                            ],\n                            [\n                                28,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 793,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [[\n                                17,\n                                115\n                            ]],\n                        totalDataCodewords: 1955,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                10,\n                                46\n                            ],\n                            [\n                                23,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 1541,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                10,\n                                24\n                            ],\n                            [\n                                35,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1115,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                19,\n                                15\n                            ],\n                            [\n                                35,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 845,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                17,\n                                115\n                            ],\n                            [\n                                1,\n                                116\n                            ]\n                        ],\n                        totalDataCodewords: 2071,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                14,\n                                46\n                            ],\n                            [\n                                21,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 1631,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                29,\n                                24\n                            ],\n                            [\n                                19,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1171,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                11,\n                                15\n                            ],\n                            [\n                                46,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 901,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                13,\n                                115\n                            ],\n                            [\n                                6,\n                                116\n                            ]\n                        ],\n                        totalDataCodewords: 2191,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                14,\n                                46\n                            ],\n                            [\n                                23,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 1725,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                44,\n                                24\n                            ],\n                            [\n                                7,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1231,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                59,\n                                16\n                            ],\n                            [\n                                1,\n                                17\n                            ]\n                        ],\n                        totalDataCodewords: 961,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                12,\n                                121\n                            ],\n                            [\n                                7,\n                                122\n                            ]\n                        ],\n                        totalDataCodewords: 2306,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                12,\n                                47\n                            ],\n                            [\n                                26,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 1812,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                39,\n                                24\n                            ],\n                            [\n                                14,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1286,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                22,\n                                15\n                            ],\n                            [\n                                41,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 986,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                6,\n                                121\n                            ],\n                            [\n                                14,\n                                122\n                            ]\n                        ],\n                        totalDataCodewords: 2434,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                6,\n                                47\n                            ],\n                            [\n                                34,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 1914,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                46,\n                                24\n                            ],\n                            [\n                                10,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1354,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                2,\n                                15\n                            ],\n                            [\n                                64,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 1054,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                17,\n                                122\n                            ],\n                            [\n                                4,\n                                123\n                            ]\n                        ],\n                        totalDataCodewords: 2566,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                29,\n                                46\n                            ],\n                            [\n                                14,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 1992,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                49,\n                                24\n                            ],\n                            [\n                                10,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1426,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                24,\n                                15\n                            ],\n                            [\n                                46,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 1096,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                4,\n                                122\n                            ],\n                            [\n                                18,\n                                123\n                            ]\n                        ],\n                        totalDataCodewords: 2702,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                13,\n                                46\n                            ],\n                            [\n                                32,\n                                47\n                            ]\n                        ],\n                        totalDataCodewords: 2102,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                48,\n                                24\n                            ],\n                            [\n                                14,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1502,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                42,\n                                15\n                            ],\n                            [\n                                32,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 1142,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                20,\n                                117\n                            ],\n                            [\n                                4,\n                                118\n                            ]\n                        ],\n                        totalDataCodewords: 2812,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                40,\n                                47\n                            ],\n                            [\n                                7,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 2216,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                43,\n                                24\n                            ],\n                            [\n                                22,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1582,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                10,\n                                15\n                            ],\n                            [\n                                67,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 1222,\n                        errorCodewordsPerBlock: 30\n                    }\n                },\n                {\n                    L: {\n                        groups: [\n                            [\n                                19,\n                                118\n                            ],\n                            [\n                                6,\n                                119\n                            ]\n                        ],\n                        totalDataCodewords: 2956,\n                        errorCodewordsPerBlock: 30\n                    },\n                    M: {\n                        groups: [\n                            [\n                                18,\n                                47\n                            ],\n                            [\n                                31,\n                                48\n                            ]\n                        ],\n                        totalDataCodewords: 2334,\n                        errorCodewordsPerBlock: 28\n                    },\n                    Q: {\n                        groups: [\n                            [\n                                34,\n                                24\n                            ],\n                            [\n                                34,\n                                25\n                            ]\n                        ],\n                        totalDataCodewords: 1666,\n                        errorCodewordsPerBlock: 30\n                    },\n                    H: {\n                        groups: [\n                            [\n                                20,\n                                15\n                            ],\n                            [\n                                61,\n                                16\n                            ]\n                        ],\n                        totalDataCodewords: 1276,\n                        errorCodewordsPerBlock: 30\n                    }\n                }\n            ], finderPattern = [\n                1,\n                0,\n                1,\n                1,\n                1\n            ], alignmentPattern = [\n                1,\n                0,\n                1\n            ], errorCorrectionPatterns = {\n                L: '01',\n                M: '00',\n                Q: '11',\n                H: '10'\n            }, formatMaskPattern = '101010000010010', formatGeneratorPolynomial = '10100110111', versionGeneratorPolynomial = '1111100100101', paddingCodewords = [\n                '11101100',\n                '00010001'\n            ], finderPatternValue = 93, maskPatternConditions = [\n                function (row, column) {\n                    return (row + column) % 2 === 0;\n                },\n                function (row) {\n                    return row % 2 === 0;\n                },\n                function (row, column) {\n                    return column % 3 === 0;\n                },\n                function (row, column) {\n                    return (row + column) % 3 === 0;\n                },\n                function (row, column) {\n                    return (Math.floor(row / 2) + Math.floor(column / 3)) % 2 === 0;\n                },\n                function (row, column) {\n                    return row * column % 2 + row * column % 3 === 0;\n                },\n                function (row, column) {\n                    return (row * column % 2 + row * column % 3) % 2 === 0;\n                },\n                function (row, column) {\n                    return ((row + column) % 2 + row * column % 3) % 2 === 0;\n                }\n            ], numberRegex = /^\\d+/, alphaPattern = 'A-Z0-9 $%*+./:-', alphaExclusiveSet = 'A-Z $%*+./:-', alphaRegex = new RegExp('^[' + alphaExclusiveSet + ']+'), alphaNumericRegex = new RegExp('^[' + alphaPattern + ']+'), byteRegex = new RegExp('^[^' + alphaPattern + ']+'), initMinNumericBeforeAlpha = 8, initMinNumericBeforeByte = 5, initMinAlphaBeforeByte = 8, minNumericBeforeAlpha = 17, minNumericBeforeByte = 9, minAlphaBeforeByte = 16, round = Math.round;\n        function toDecimal(value) {\n            return parseInt(value, 2);\n        }\n        function toBitsString(value, length) {\n            var result = Number(value).toString(2);\n            if (result.length < length) {\n                result = new Array(length - result.length + 1).join(0) + result;\n            }\n            return result;\n        }\n        function splitInto(str, n) {\n            var result = [], idx = 0;\n            while (idx < str.length) {\n                result.push(str.substring(idx, idx + n));\n                idx += n;\n            }\n            return result;\n        }\n        var QRDataMode = kendo.Class.extend({\n            getVersionIndex: function (version) {\n                if (version < 10) {\n                    return 0;\n                } else if (version > 26) {\n                    return 2;\n                }\n                return 1;\n            },\n            getBitsCharacterCount: function (version) {\n                var mode = this;\n                return mode.bitsInCharacterCount[mode.getVersionIndex(version || 40)];\n            },\n            getModeCountString: function (length, version) {\n                var mode = this;\n                return mode.modeIndicator + toBitsString(length, mode.getBitsCharacterCount(version));\n            },\n            encode: function () {\n            },\n            getStringBitsLength: function () {\n            },\n            getValue: function () {\n            },\n            modeIndicator: '',\n            bitsInCharacterCount: []\n        });\n        var modes = {};\n        modes[NUMERIC] = QRDataMode.extend({\n            bitsInCharacterCount: [\n                10,\n                12,\n                14\n            ],\n            modeIndicator: '0001',\n            getValue: function (character) {\n                return parseInt(character, 10);\n            },\n            encode: function (str, version) {\n                var mode = this, parts = splitInto(str, 3), result = mode.getModeCountString(str.length, version);\n                for (var i = 0; i < parts.length - 1; i++) {\n                    result += toBitsString(parts[i], 10);\n                }\n                return result + toBitsString(parts[i], 1 + 3 * parts[i].length);\n            },\n            getStringBitsLength: function (inputLength, version) {\n                var mod3 = inputLength % 3;\n                return 4 + this.getBitsCharacterCount(version) + 10 * Math.floor(inputLength / 3) + 3 * mod3 + (mod3 === 0 ? 0 : 1);\n            }\n        });\n        modes[ALPHA_NUMERIC] = QRDataMode.extend({\n            characters: {\n                '0': 0,\n                '1': 1,\n                '2': 2,\n                '3': 3,\n                '4': 4,\n                '5': 5,\n                '6': 6,\n                '7': 7,\n                '8': 8,\n                '9': 9,\n                'A': 10,\n                'B': 11,\n                'C': 12,\n                'D': 13,\n                'E': 14,\n                'F': 15,\n                'G': 16,\n                'H': 17,\n                'I': 18,\n                'J': 19,\n                'K': 20,\n                'L': 21,\n                'M': 22,\n                'N': 23,\n                'O': 24,\n                'P': 25,\n                'Q': 26,\n                'R': 27,\n                'S': 28,\n                'T': 29,\n                'U': 30,\n                'V': 31,\n                'W': 32,\n                'X': 33,\n                'Y': 34,\n                'Z': 35,\n                ' ': 36,\n                '$': 37,\n                '%': 38,\n                '*': 39,\n                '+': 40,\n                '-': 41,\n                '.': 42,\n                '/': 43,\n                ':': 44\n            },\n            bitsInCharacterCount: [\n                9,\n                11,\n                13\n            ],\n            modeIndicator: '0010',\n            getValue: function (character) {\n                return this.characters[character];\n            },\n            encode: function (str, version) {\n                var mode = this, parts = splitInto(str, 2), result = mode.getModeCountString(str.length, version), value;\n                for (var i = 0; i < parts.length - 1; i++) {\n                    value = 45 * mode.getValue(parts[i].charAt(0)) + mode.getValue(parts[i].charAt(1));\n                    result += toBitsString(value, 11);\n                }\n                value = parts[i].length == 2 ? 45 * mode.getValue(parts[i].charAt(0)) + mode.getValue(parts[i].charAt(1)) : mode.getValue(parts[i].charAt(0));\n                return result + toBitsString(value, 1 + 5 * parts[i].length);\n            },\n            getStringBitsLength: function (inputLength, version) {\n                return 4 + this.getBitsCharacterCount(version) + 11 * Math.floor(inputLength / 2) + 6 * (inputLength % 2);\n            }\n        });\n        modes[BYTE] = QRDataMode.extend({\n            bitsInCharacterCount: [\n                8,\n                16,\n                16\n            ],\n            modeIndicator: '0100',\n            getValue: function (character) {\n                var code = character.charCodeAt(0);\n                if (code <= 127 || 160 <= code && code <= 255) {\n                    return code;\n                } else {\n                    throw new Error('Unsupported character: ' + character);\n                }\n            },\n            encode: function (str, version) {\n                var mode = this, result = mode.getModeCountString(str.length, version);\n                for (var i = 0; i < str.length; i++) {\n                    result += toBitsString(mode.getValue(str.charAt(i)), 8);\n                }\n                return result;\n            },\n            getStringBitsLength: function (inputLength, version) {\n                return 4 + this.getBitsCharacterCount(version) + 8 * inputLength;\n            }\n        });\n        var modeInstances = {};\n        for (var mode in modes) {\n            modeInstances[mode] = new modes[mode]();\n        }\n        var FreeCellVisitor = function (matrix) {\n            var that = this, row = matrix.length - 1, column = matrix.length - 1, startColumn = column, dir = -1, c = 0;\n            that.move = function () {\n                row += dir * c;\n                c ^= 1;\n                column = startColumn - c;\n            };\n            that.getNextCell = function () {\n                while (matrix[row][column] !== undefined) {\n                    that.move();\n                    if (row < 0 || row >= matrix.length) {\n                        dir = -dir;\n                        startColumn -= startColumn != 8 ? 2 : 3;\n                        column = startColumn;\n                        row = dir < 0 ? matrix.length - 1 : 0;\n                    }\n                }\n                return {\n                    row: row,\n                    column: column\n                };\n            };\n            that.getNextRemainderCell = function () {\n                that.move();\n                if (matrix[row][column] === undefined) {\n                    return {\n                        row: row,\n                        column: column\n                    };\n                }\n            };\n        };\n        function fillFunctionCell(matrices, bit, x, y) {\n            for (var i = 0; i < matrices.length; i++) {\n                matrices[i][x][y] = bit;\n            }\n        }\n        function fillDataCell(matrices, bit, x, y) {\n            for (var i = 0; i < maskPatternConditions.length; i++) {\n                matrices[i][x][y] = maskPatternConditions[i](x, y) ? bit ^ 1 : parseInt(bit, 10);\n            }\n        }\n        var fillData = function (matrices, blocks) {\n            var cellVisitor = new FreeCellVisitor(matrices[0]), block, codewordIdx, cell;\n            for (var blockIdx = 0; blockIdx < blocks.length; blockIdx++) {\n                block = blocks[blockIdx];\n                codewordIdx = 0;\n                while (block.length > 0) {\n                    for (var i = 0; i < block.length; i++) {\n                        for (var j = 0; j < 8; j++) {\n                            cell = cellVisitor.getNextCell();\n                            fillDataCell(matrices, block[i][codewordIdx].charAt(j), cell.row, cell.column);\n                        }\n                    }\n                    codewordIdx++;\n                    while (block[0] && codewordIdx == block[0].length) {\n                        block.splice(0, 1);\n                    }\n                }\n            }\n            while (cell = cellVisitor.getNextRemainderCell()) {\n                fillDataCell(matrices, 0, cell.row, cell.column);\n            }\n        };\n        var padDataString = function (dataString, totalDataCodewords) {\n            var dataBitsCount = totalDataCodewords * 8, terminatorIndex = 0, paddingCodewordIndex = 0;\n            while (dataString.length < dataBitsCount && terminatorIndex < terminator.length) {\n                dataString += terminator.charAt(terminatorIndex++);\n            }\n            if (dataString.length % 8 !== 0) {\n                dataString += new Array(9 - dataString.length % 8).join('0');\n            }\n            while (dataString.length < dataBitsCount) {\n                dataString += paddingCodewords[paddingCodewordIndex];\n                paddingCodewordIndex ^= 1;\n            }\n            return dataString;\n        };\n        function generatePowersOfTwo() {\n            var result;\n            for (var power = 1; power < 255; power++) {\n                result = powersOfTwoResult[power - 1] * 2;\n                if (result > 255) {\n                    result = result ^ 285;\n                }\n                powersOfTwoResult[power] = result;\n                powersOfTwo[result] = power;\n            }\n            result = powersOfTwoResult[power - 1] * 2 ^ 285;\n            powersOfTwoResult[power] = result;\n            powersOfTwoResult[-1] = 0;\n        }\n        var xorPolynomials = function (x, y) {\n            var result = [], idx = x.length - 2;\n            for (var i = idx; i >= 0; i--) {\n                result[i] = x[i] ^ y[i];\n            }\n            return result;\n        };\n        var multiplyPolynomials = function (x, y) {\n            var result = [];\n            for (var i = 0; i < x.length; i++) {\n                for (var j = 0; j < y.length; j++) {\n                    if (result[i + j] === undefined) {\n                        result[i + j] = (x[i] + (y[j] >= 0 ? y[j] : 0)) % 255;\n                    } else {\n                        result[i + j] = powersOfTwo[powersOfTwoResult[result[i + j]] ^ powersOfTwoResult[(x[i] + y[j]) % 255]];\n                    }\n                }\n            }\n            return result;\n        };\n        function generateGeneratorPolynomials() {\n            var maxErrorCorrectionCodeWordsCount = 68;\n            for (var idx = 2; idx <= maxErrorCorrectionCodeWordsCount; idx++) {\n                var firstPolynomial = generatorPolynomials[idx - 1], secondPolynomial = [\n                        idx,\n                        0\n                    ];\n                generatorPolynomials[idx] = multiplyPolynomials(firstPolynomial, secondPolynomial);\n            }\n        }\n        generatePowersOfTwo();\n        generateGeneratorPolynomials();\n        function multiplyByConstant(polynomial, power) {\n            var result = [], idx = polynomial.length - 1;\n            do {\n                result[idx] = powersOfTwoResult[(polynomial[idx] + power) % 255];\n                idx--;\n            } while (polynomial[idx] !== undefined);\n            return result;\n        }\n        var generateErrorCodewords = function (data, errorCodewordsCount) {\n            var generator = generatorPolynomials[errorCodewordsCount - 1], result = new Array(errorCodewordsCount).concat(data), generatorPolynomial = new Array(result.length - generator.length).concat(generator), steps = data.length, errorCodewords = [], divisor, idx;\n            for (idx = 0; idx < steps; idx++) {\n                divisor = multiplyByConstant(generatorPolynomial, powersOfTwo[result[result.length - 1]]);\n                generatorPolynomial.splice(0, 1);\n                result = xorPolynomials(divisor, result);\n            }\n            for (idx = result.length - 1; idx >= 0; idx--) {\n                errorCodewords[errorCodewordsCount - 1 - idx] = toBitsString(result[idx], 8);\n            }\n            return errorCodewords;\n        };\n        var getBlocks = function (dataStream, versionCodewordsInformation) {\n            var codewordStart = 0, dataBlocks = [], errorBlocks = [], dataBlock, versionGroups = versionCodewordsInformation.groups, blockCodewordsCount, groupBlocksCount, messagePolynomial, codeword;\n            for (var groupIdx = 0; groupIdx < versionGroups.length; groupIdx++) {\n                groupBlocksCount = versionGroups[groupIdx][0];\n                for (var blockIdx = 0; blockIdx < groupBlocksCount; blockIdx++) {\n                    blockCodewordsCount = versionGroups[groupIdx][1];\n                    dataBlock = [];\n                    messagePolynomial = [];\n                    for (var codewordIdx = 1; codewordIdx <= blockCodewordsCount; codewordIdx++) {\n                        codeword = dataStream.substring(codewordStart, codewordStart + 8);\n                        dataBlock.push(codeword);\n                        messagePolynomial[blockCodewordsCount - codewordIdx] = toDecimal(codeword);\n                        codewordStart += 8;\n                    }\n                    dataBlocks.push(dataBlock);\n                    errorBlocks.push(generateErrorCodewords(messagePolynomial, versionCodewordsInformation.errorCodewordsPerBlock));\n                }\n            }\n            return [\n                dataBlocks,\n                errorBlocks\n            ];\n        };\n        var chooseMode = function (str, minNumericBeforeAlpha, minNumericBeforeByte, minAlphaBeforeByte, previousMode) {\n            var numeric = numberRegex.exec(str), numericMatch = numeric ? numeric[0] : '', alpha = alphaRegex.exec(str), alphaMatch = alpha ? alpha[0] : '', alphaNumeric = alphaNumericRegex.exec(str), alphaNumericMatch = alphaNumeric ? alphaNumeric[0] : '', mode, modeString;\n            if (numericMatch && (numericMatch.length >= minNumericBeforeAlpha || str.length == numericMatch.length || numericMatch.length >= minNumericBeforeByte && !alphaNumericRegex.test(str.charAt(numericMatch.length)))) {\n                mode = NUMERIC;\n                modeString = numericMatch;\n            } else if (alphaNumericMatch && (str.length == alphaNumericMatch.length || alphaNumericMatch.length >= minAlphaBeforeByte || previousMode == ALPHA_NUMERIC)) {\n                mode = ALPHA_NUMERIC;\n                modeString = numericMatch || alphaMatch;\n            } else {\n                mode = BYTE;\n                if (alphaNumericMatch) {\n                    modeString = alphaNumericMatch + byteRegex.exec(str.substring(alphaNumericMatch.length))[0];\n                } else {\n                    modeString = byteRegex.exec(str)[0];\n                }\n            }\n            return {\n                mode: mode,\n                modeString: modeString\n            };\n        };\n        var getModes = function (str) {\n            var modes = [], previousMode, idx = 0;\n            modes.push(chooseMode(str, initMinNumericBeforeAlpha, initMinNumericBeforeByte, initMinAlphaBeforeByte, previousMode));\n            previousMode = modes[0].mode;\n            str = str.substr(modes[0].modeString.length);\n            while (str.length > 0) {\n                var nextMode = chooseMode(str, minNumericBeforeAlpha, minNumericBeforeByte, minAlphaBeforeByte, previousMode);\n                if (nextMode.mode != previousMode) {\n                    previousMode = nextMode.mode;\n                    modes.push(nextMode);\n                    idx++;\n                } else {\n                    modes[idx].modeString += nextMode.modeString;\n                }\n                str = str.substr(nextMode.modeString.length);\n            }\n            return modes;\n        };\n        var getDataCodewordsCount = function (modes) {\n            var length = 0, mode;\n            for (var i = 0; i < modes.length; i++) {\n                mode = modeInstances[modes[i].mode];\n                length += mode.getStringBitsLength(modes[i].modeString.length);\n            }\n            return Math.ceil(length / 8);\n        };\n        var getVersion = function (dataCodewordsCount, errorCorrectionLevel) {\n            var x = 0, y = versionsCodewordsInformation.length - 1, version = Math.floor(versionsCodewordsInformation.length / 2);\n            do {\n                if (dataCodewordsCount < versionsCodewordsInformation[version][errorCorrectionLevel].totalDataCodewords) {\n                    y = version;\n                } else {\n                    x = version;\n                }\n                version = x + Math.floor((y - x) / 2);\n            } while (y - x > 1);\n            if (dataCodewordsCount <= versionsCodewordsInformation[x][errorCorrectionLevel].totalDataCodewords) {\n                return version + 1;\n            }\n            return y + 1;\n        };\n        var getDataString = function (modes, version) {\n            var dataString = '', mode;\n            for (var i = 0; i < modes.length; i++) {\n                mode = modeInstances[modes[i].mode];\n                dataString += mode.encode(modes[i].modeString, version);\n            }\n            return dataString;\n        };\n        var encodeFormatInformation = function (format) {\n            var formatNumber = toDecimal(format), encodedString, result = '';\n            if (formatNumber === 0) {\n                return '101010000010010';\n            } else {\n                encodedString = encodeBCH(toDecimal(format), formatGeneratorPolynomial, 15);\n            }\n            for (var i = 0; i < encodedString.length; i++) {\n                result += encodedString.charAt(i) ^ formatMaskPattern.charAt(i);\n            }\n            return result;\n        };\n        var encodeBCH = function (value, generatorPolynomial, codeLength) {\n            var generatorNumber = toDecimal(generatorPolynomial), polynomialLength = generatorPolynomial.length - 1, valueNumber = value << polynomialLength, length = codeLength - polynomialLength, valueString = toBitsString(value, length), result = dividePolynomials(valueNumber, generatorNumber);\n            result = valueString + toBitsString(result, polynomialLength);\n            return result;\n        };\n        var dividePolynomials = function (numberX, numberY) {\n            var yLength = numberY.toString(2).length, xLength = numberX.toString(2).length;\n            do {\n                numberX ^= numberY << xLength - yLength;\n                xLength = numberX.toString(2).length;\n            } while (xLength >= yLength);\n            return numberX;\n        };\n        function getNumberAt(str, idx) {\n            return parseInt(str.charAt(idx), 10);\n        }\n        var initMatrices = function (version) {\n            var matrices = [], modules = 17 + 4 * version;\n            for (var i = 0; i < maskPatternConditions.length; i++) {\n                matrices[i] = new Array(modules);\n                for (var j = 0; j < modules; j++) {\n                    matrices[i][j] = new Array(modules);\n                }\n            }\n            return matrices;\n        };\n        var addFormatInformation = function (matrices, formatString) {\n            var matrix = matrices[0], x, y, idx = 0, length = formatString.length;\n            for (x = 0, y = 8; x <= 8; x++) {\n                if (x !== 6) {\n                    fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y);\n                }\n            }\n            for (x = 8, y = 7; y >= 0; y--) {\n                if (y !== 6) {\n                    fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y);\n                }\n            }\n            idx = 0;\n            for (y = matrix.length - 1, x = 8; y >= matrix.length - 8; y--) {\n                fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y);\n            }\n            fillFunctionCell(matrices, 1, matrix.length - 8, 8);\n            for (x = matrix.length - 7, y = 8; x < matrix.length; x++) {\n                fillFunctionCell(matrices, getNumberAt(formatString, length - 1 - idx++), x, y);\n            }\n        };\n        var encodeVersionInformation = function (version) {\n            return encodeBCH(version, versionGeneratorPolynomial, 18);\n        };\n        var addVersionInformation = function (matrices, dataString) {\n            var matrix = matrices[0], modules = matrix.length, x1 = 0, y1 = modules - 11, x2 = modules - 11, y2 = 0, quotient, mod, value;\n            for (var idx = 0; idx < dataString.length; idx++) {\n                quotient = Math.floor(idx / 3);\n                mod = idx % 3;\n                value = getNumberAt(dataString, dataString.length - idx - 1);\n                fillFunctionCell(matrices, value, x1 + quotient, y1 + mod);\n                fillFunctionCell(matrices, value, x2 + mod, y2 + quotient);\n            }\n        };\n        var addCentricPattern = function (matrices, pattern, x, y) {\n            var size = pattern.length + 2, length = pattern.length + 1, value;\n            for (var i = 0; i < pattern.length; i++) {\n                for (var j = i; j < size - i; j++) {\n                    value = pattern[i];\n                    fillFunctionCell(matrices, value, x + j, y + i);\n                    fillFunctionCell(matrices, value, x + i, y + j);\n                    fillFunctionCell(matrices, value, x + length - j, y + length - i);\n                    fillFunctionCell(matrices, value, x + length - i, y + length - j);\n                }\n            }\n        };\n        var addFinderSeparator = function (matrices, direction, x, y) {\n            var nextX = x, nextY = y, matrix = matrices[0];\n            do {\n                fillFunctionCell(matrices, 0, nextX, y);\n                fillFunctionCell(matrices, 0, x, nextY);\n                nextX += direction[0];\n                nextY += direction[1];\n            } while (nextX >= 0 && nextX < matrix.length);\n        };\n        var addFinderPatterns = function (matrices) {\n            var modules = matrices[0].length;\n            addCentricPattern(matrices, finderPattern, 0, 0);\n            addFinderSeparator(matrices, [\n                -1,\n                -1\n            ], 7, 7);\n            addCentricPattern(matrices, finderPattern, modules - 7, 0);\n            addFinderSeparator(matrices, [\n                1,\n                -1\n            ], modules - 8, 7);\n            addCentricPattern(matrices, finderPattern, 0, modules - 7);\n            addFinderSeparator(matrices, [\n                -1,\n                1\n            ], 7, modules - 8);\n        };\n        var addAlignmentPatterns = function (matrices, version) {\n            if (version < 2) {\n                return;\n            }\n            var matrix = matrices[0], modules = matrix.length, pointsCount = Math.floor(version / 7), points = [6], startDistance, distance, idx = 0;\n            if (startDistance = irregularAlignmentPatternsStartDistance[version]) {\n                distance = (modules - 13 - startDistance) / pointsCount;\n            } else {\n                startDistance = distance = (modules - 13) / (pointsCount + 1);\n            }\n            points.push(points[idx++] + startDistance);\n            while (points[idx] + distance < modules) {\n                points.push(points[idx++] + distance);\n            }\n            for (var i = 0; i < points.length; i++) {\n                for (var j = 0; j < points.length; j++) {\n                    if (matrix[points[i]][points[j]] === undefined) {\n                        addCentricPattern(matrices, alignmentPattern, points[i] - 2, points[j] - 2);\n                    }\n                }\n            }\n        };\n        var addTimingFunctions = function (matrices) {\n            var row = 6, column = 6, value = 1, modules = matrices[0].length;\n            for (var i = 8; i < modules - 8; i++) {\n                fillFunctionCell(matrices, value, row, i);\n                fillFunctionCell(matrices, value, i, column);\n                value ^= 1;\n            }\n        };\n        var scoreMaskMatrixes = function (matrices) {\n            var scores = [], previousBits = [], darkModules = [], patterns = [], adjacentSameBits = [], matrix, i, row = 0, column = 1, modules = matrices[0].length;\n            for (i = 0; i < matrices.length; i++) {\n                scores[i] = 0;\n                darkModules[i] = 0;\n                adjacentSameBits[i] = [\n                    0,\n                    0\n                ];\n                patterns[i] = [\n                    0,\n                    0\n                ];\n                previousBits[i] = [];\n            }\n            for (i = 0; i < modules; i++) {\n                for (var j = 0; j < modules; j++) {\n                    for (var k = 0; k < matrices.length; k++) {\n                        matrix = matrices[k];\n                        darkModules[k] += parseInt(matrix[i][j], 10);\n                        if (previousBits[k][row] === matrix[i][j] && i + 1 < modules && j - 1 >= 0 && matrix[i + 1][j] == previousBits[k][row] && matrix[i + 1][j - 1] == previousBits[k][row]) {\n                            scores[k] += 3;\n                        }\n                        scoreFinderPatternOccurance(k, patterns, scores, row, matrix[i][j]);\n                        scoreFinderPatternOccurance(k, patterns, scores, column, matrix[j][i]);\n                        scoreAdjacentSameBits(k, scores, previousBits, matrix[i][j], adjacentSameBits, row);\n                        scoreAdjacentSameBits(k, scores, previousBits, matrix[j][i], adjacentSameBits, column);\n                    }\n                }\n            }\n            var total = modules * modules, minIdx, min = Number.MAX_VALUE;\n            for (i = 0; i < scores.length; i++) {\n                scores[i] += calculateDarkModulesRatioScore(darkModules[i], total);\n                if (scores[i] < min) {\n                    min = scores[i];\n                    minIdx = i;\n                }\n            }\n            return minIdx;\n        };\n        function scoreFinderPatternOccurance(idx, patterns, scores, rowColumn, bit) {\n            patterns[idx][rowColumn] = (patterns[idx][rowColumn] << 1 ^ bit) % 128;\n            if (patterns[idx][rowColumn] == finderPatternValue) {\n                scores[idx] += 40;\n            }\n        }\n        function scoreAdjacentSameBits(idx, scores, previousBits, bit, adjacentBits, rowColumn) {\n            if (previousBits[idx][rowColumn] == bit) {\n                adjacentBits[idx][rowColumn]++;\n            } else {\n                previousBits[idx][rowColumn] = bit;\n                if (adjacentBits[idx][rowColumn] >= 5) {\n                    scores[idx] += 3 + adjacentBits[idx][rowColumn] - 5;\n                }\n                adjacentBits[idx][rowColumn] = 1;\n            }\n        }\n        function calculateDarkModulesRatioScore(darkModules, total) {\n            var percent = Math.floor(darkModules / total * 100), mod5 = percent % 5, previous = Math.abs(percent - mod5 - 50), next = Math.abs(percent + 5 - mod5 - 50), score = 10 * Math.min(previous / 5, next / 5);\n            return score;\n        }\n        var EncodingResult = function (dataString, version) {\n            this.dataString = dataString;\n            this.version = version;\n        };\n        var IsoEncoder = function () {\n            this.getEncodingResult = function (inputString, errorCorrectionLevel) {\n                var modes = getModes(inputString), dataCodewordsCount = getDataCodewordsCount(modes), version = getVersion(dataCodewordsCount, errorCorrectionLevel), dataString = getDataString(modes, version);\n                return new EncodingResult(dataString, version);\n            };\n        };\n        var UTF8Encoder = function () {\n            this.mode = modeInstances[this.encodingMode];\n        };\n        UTF8Encoder.fn = UTF8Encoder.prototype = {\n            encodingMode: BYTE,\n            utfBOM: '111011111011101110111111',\n            initialModeCountStringLength: 20,\n            getEncodingResult: function (inputString, errorCorrectionLevel) {\n                var that = this, data = that.encode(inputString), dataCodewordsCount = that.getDataCodewordsCount(data), version = getVersion(dataCodewordsCount, errorCorrectionLevel), dataString = that.mode.getModeCountString(data.length / 8, version) + data;\n                return new EncodingResult(dataString, version);\n            },\n            getDataCodewordsCount: function (data) {\n                var that = this, dataLength = data.length, dataCodewordsCount = Math.ceil((that.initialModeCountStringLength + dataLength) / 8);\n                return dataCodewordsCount;\n            },\n            encode: function (str) {\n                var that = this, result = that.utfBOM;\n                for (var i = 0; i < str.length; i++) {\n                    result += that.encodeCharacter(str.charCodeAt(i));\n                }\n                return result;\n            },\n            encodeCharacter: function (code) {\n                var bytesCount = this.getBytesCount(code), bc = bytesCount - 1, result = '';\n                if (bytesCount == 1) {\n                    result = toBitsString(code, 8);\n                } else {\n                    var significantOnes = 8 - bytesCount;\n                    for (var i = 0; i < bc; i++) {\n                        result = toBitsString(code >> i * 6 & 63 | 128, 8) + result;\n                    }\n                    result = (code >> bc * 6 | 255 >> significantOnes << significantOnes).toString(2) + result;\n                }\n                return result;\n            },\n            getBytesCount: function (code) {\n                var ranges = this.ranges;\n                for (var i = 0; i < ranges.length; i++) {\n                    if (code < ranges[i]) {\n                        return i + 1;\n                    }\n                }\n            },\n            ranges: [\n                128,\n                2048,\n                65536,\n                2097152,\n                67108864\n            ]\n        };\n        var QRCodeDataEncoder = function (encoding) {\n            if (encoding && encoding.toLowerCase().indexOf('utf_8') >= 0) {\n                return new UTF8Encoder();\n            } else {\n                return new IsoEncoder();\n            }\n        };\n        var encodeData = function (inputString, errorCorrectionLevel, encoding) {\n            var encoder = new QRCodeDataEncoder(encoding), encodingResult = encoder.getEncodingResult(inputString, errorCorrectionLevel), version = encodingResult.version, versionInformation = versionsCodewordsInformation[version - 1][errorCorrectionLevel], dataString = padDataString(encodingResult.dataString, versionInformation.totalDataCodewords), blocks = getBlocks(dataString, versionInformation), matrices = initMatrices(version);\n            addFinderPatterns(matrices);\n            addAlignmentPatterns(matrices, version);\n            addTimingFunctions(matrices);\n            if (version >= 7) {\n                addVersionInformation(matrices, toBitsString(0, 18));\n            }\n            addFormatInformation(matrices, toBitsString(0, 15));\n            fillData(matrices, blocks);\n            var minIdx = scoreMaskMatrixes(matrices), optimalMatrix = matrices[minIdx];\n            if (version >= 7) {\n                addVersionInformation([optimalMatrix], encodeVersionInformation(version));\n            }\n            var formatString = errorCorrectionPatterns[errorCorrectionLevel] + toBitsString(minIdx, 3);\n            addFormatInformation([optimalMatrix], encodeFormatInformation(formatString));\n            return optimalMatrix;\n        };\n        var QRCodeDefaults = {\n            DEFAULT_SIZE: 200,\n            QUIET_ZONE_LENGTH: 4,\n            DEFAULT_ERROR_CORRECTION_LEVEL: 'L',\n            DEFAULT_BACKGROUND: '#fff',\n            DEFAULT_DARK_MODULE_COLOR: '#000',\n            MIN_BASE_UNIT_SIZE: 1\n        };\n        var QRCode = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                that.element = $(element);\n                that.wrapper = that.element;\n                that.element.addClass('k-qrcode');\n                that.surfaceWrap = $('<div />').css('position', 'relative').appendTo(this.element);\n                that.surface = draw.Surface.create(that.surfaceWrap, { type: that.options.renderAs });\n                that.setOptions(options);\n            },\n            redraw: function () {\n                var size = this._getSize();\n                this.surfaceWrap.css({\n                    width: size,\n                    height: size\n                });\n                this.surface.clear();\n                this.createVisual();\n                this.surface.draw(this.visual);\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            _resize: function () {\n                this.redraw();\n            },\n            createVisual: function () {\n                this.visual = this._render();\n            },\n            exportVisual: function () {\n                return this._render();\n            },\n            _render: function () {\n                var that = this, value = that._value, baseUnit, border = that.options.border || {}, padding = that.options.padding || 0, borderWidth = border.width || 0, quietZoneSize, matrix, size, dataSize, contentSize;\n                border.width = borderWidth;\n                var visual = new draw.Group();\n                if (value) {\n                    matrix = encodeData(value, that.options.errorCorrection, that.options.encoding);\n                    size = that._getSize();\n                    contentSize = size - 2 * (borderWidth + padding);\n                    baseUnit = that._calculateBaseUnit(contentSize, matrix.length);\n                    dataSize = matrix.length * baseUnit;\n                    quietZoneSize = borderWidth + padding + (contentSize - dataSize) / 2;\n                    visual.append(that._renderBackground(size, border));\n                    visual.append(that._renderMatrix(matrix, baseUnit, quietZoneSize));\n                }\n                return visual;\n            },\n            _getSize: function () {\n                var that = this, size;\n                if (that.options.size) {\n                    size = parseInt(that.options.size, 10);\n                } else {\n                    var element = that.element, min = Math.min(element.width(), element.height());\n                    if (min > 0) {\n                        size = min;\n                    } else {\n                        size = QRCodeDefaults.DEFAULT_SIZE;\n                    }\n                }\n                return size;\n            },\n            _calculateBaseUnit: function (size, matrixSize) {\n                var baseUnit = Math.floor(size / matrixSize);\n                if (baseUnit < QRCodeDefaults.MIN_BASE_UNIT_SIZE) {\n                    throw new Error('Insufficient size.');\n                }\n                if (baseUnit * matrixSize >= size && baseUnit - 1 >= QRCodeDefaults.MIN_BASE_UNIT_SIZE) {\n                    baseUnit--;\n                }\n                return baseUnit;\n            },\n            _renderMatrix: function (matrix, baseUnit, quietZoneSize) {\n                var path = new draw.MultiPath({\n                    fill: { color: this.options.color },\n                    stroke: null\n                });\n                for (var row = 0; row < matrix.length; row++) {\n                    var y = quietZoneSize + row * baseUnit;\n                    var column = 0;\n                    while (column < matrix.length) {\n                        while (matrix[row][column] === 0 && column < matrix.length) {\n                            column++;\n                        }\n                        if (column < matrix.length) {\n                            var x = column;\n                            while (matrix[row][column] == 1) {\n                                column++;\n                            }\n                            var x1 = round(quietZoneSize + x * baseUnit);\n                            var y1 = round(y);\n                            var x2 = round(quietZoneSize + column * baseUnit);\n                            var y2 = round(y + baseUnit);\n                            path.moveTo(x1, y1).lineTo(x1, y2).lineTo(x2, y2).lineTo(x2, y1).close();\n                        }\n                    }\n                }\n                return path;\n            },\n            _renderBackground: function (size, border) {\n                var box = new Box2D(0, 0, size, size).unpad(border.width / 2);\n                return draw.Path.fromRect(box.toRect(), {\n                    fill: { color: this.options.background },\n                    stroke: {\n                        color: border.color,\n                        width: border.width\n                    }\n                });\n            },\n            setOptions: function (options) {\n                var that = this;\n                options = options || {};\n                that.options = extend(that.options, options);\n                if (options.value !== undefined) {\n                    that._value = that.options.value + '';\n                }\n                that.redraw();\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._value = value + '';\n                that.redraw();\n            },\n            options: {\n                name: 'QRCode',\n                renderAs: 'svg',\n                encoding: 'ISO_8859_1',\n                value: '',\n                errorCorrection: QRCodeDefaults.DEFAULT_ERROR_CORRECTION_LEVEL,\n                background: QRCodeDefaults.DEFAULT_BACKGROUND,\n                color: QRCodeDefaults.DEFAULT_DARK_MODULE_COLOR,\n                size: '',\n                padding: 0,\n                border: {\n                    color: '',\n                    width: 0\n                }\n            }\n        });\n        dataviz.ExportMixin.extend(QRCode.fn);\n        dataviz.ui.plugin(QRCode);\n        kendo.deepExtend(dataviz, {\n            QRCode: QRCode,\n            QRCodeDefaults: QRCodeDefaults,\n            QRCodeFunctions: {\n                FreeCellVisitor: FreeCellVisitor,\n                fillData: fillData,\n                padDataString: padDataString,\n                generateErrorCodewords: generateErrorCodewords,\n                xorPolynomials: xorPolynomials,\n                getBlocks: getBlocks,\n                multiplyPolynomials: multiplyPolynomials,\n                chooseMode: chooseMode,\n                getModes: getModes,\n                getDataCodewordsCount: getDataCodewordsCount,\n                getVersion: getVersion,\n                getDataString: getDataString,\n                encodeFormatInformation: encodeFormatInformation,\n                encodeBCH: encodeBCH,\n                dividePolynomials: dividePolynomials,\n                initMatrices: initMatrices,\n                addFormatInformation: addFormatInformation,\n                encodeVersionInformation: encodeVersionInformation,\n                addVersionInformation: addVersionInformation,\n                addCentricPattern: addCentricPattern,\n                addFinderSeparator: addFinderSeparator,\n                addFinderPatterns: addFinderPatterns,\n                addAlignmentPatterns: addAlignmentPatterns,\n                addTimingFunctions: addTimingFunctions,\n                scoreMaskMatrixes: scoreMaskMatrixes,\n                encodeData: encodeData,\n                UTF8Encoder: UTF8Encoder\n            },\n            QRCodeFields: {\n                modes: modeInstances,\n                powersOfTwo: powersOfTwo,\n                powersOfTwoResult: powersOfTwoResult,\n                generatorPolynomials: generatorPolynomials\n            }\n        });\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/stock/kendo-stock-chart', ['kendo.dataviz.chart'], f);\n}(function () {\n    (function () {\n        window.kendo.dataviz = window.kendo.dataviz || {};\n        var dataviz = kendo.dataviz;\n        var elementStyles = dataviz.elementStyles;\n        var deepExtend = dataviz.deepExtend;\n        var toTime = dataviz.toTime;\n        var datavizConstants = dataviz.constants;\n        var Chart = dataviz.Chart;\n        var drawing = kendo.drawing;\n        var FadeOutAnimation = drawing.Animation.extend({\n            setup: function () {\n                this._initialOpacity = parseFloat(elementStyles(this.element, 'opacity').opacity);\n            },\n            step: function (pos) {\n                elementStyles(this.element, { opacity: String(dataviz.interpolateValue(this._initialOpacity, 0, pos)) });\n            },\n            abort: function () {\n                drawing.Animation.fn.abort.call(this);\n                elementStyles(this.element, {\n                    display: 'none',\n                    opacity: String(this._initialOpacity)\n                });\n            },\n            cancel: function () {\n                drawing.Animation.fn.abort.call(this);\n                elementStyles(this.element, { opacity: String(this._initialOpacity) });\n            }\n        });\n        function createDiv(className, style) {\n            var div = document.createElement('div');\n            div.className = className;\n            if (style) {\n                div.style.cssText = style;\n            }\n            return div;\n        }\n        var NavigatorHint = dataviz.Class.extend({\n            init: function (container, chartService, options) {\n                this.options = deepExtend({}, this.options, options);\n                this.container = container;\n                this.chartService = chartService;\n                var padding = elementStyles(container, [\n                    'paddingLeft',\n                    'paddingTop'\n                ]);\n                this.chartPadding = {\n                    top: padding.paddingTop,\n                    left: padding.paddingLeft\n                };\n                this.createElements();\n                container.appendChild(this.element);\n            },\n            createElements: function () {\n                var element = this.element = createDiv('k-navigator-hint', 'display: none; position: absolute; top: 1px; left: 1px;');\n                var tooltip = this.tooltip = createDiv('k-tooltip k-chart-tooltip');\n                var scroll = this.scroll = createDiv('k-scroll');\n                tooltip.innerHTML = '&nbsp;';\n                element.appendChild(tooltip);\n                element.appendChild(scroll);\n            },\n            show: function (from, to, bbox) {\n                var ref = this;\n                var element = ref.element;\n                var options = ref.options;\n                var scroll = ref.scroll;\n                var tooltip = ref.tooltip;\n                var middle = dataviz.toDate(toTime(from) + toTime(to - from) / 2);\n                var scrollWidth = bbox.width() * 0.4;\n                var minPos = bbox.center().x - scrollWidth;\n                var maxPos = bbox.center().x;\n                var posRange = maxPos - minPos;\n                var range = options.max - options.min;\n                var scale = posRange / range;\n                var offset = middle - options.min;\n                var text = this.chartService.intl.format(options.format, from, to);\n                var template = dataviz.getTemplate(options);\n                this.clearHideTimeout();\n                if (!this._visible) {\n                    elementStyles(element, {\n                        visibility: 'hidden',\n                        display: 'block'\n                    });\n                    this._visible = true;\n                }\n                if (template) {\n                    text = template({\n                        from: from,\n                        to: to\n                    });\n                }\n                tooltip.innerHTML = text;\n                elementStyles(tooltip, {\n                    left: bbox.center().x - tooltip.offsetWidth / 2,\n                    top: bbox.y1\n                });\n                var tooltipStyle = elementStyles(tooltip, [\n                    'marginTop',\n                    'borderTopWidth',\n                    'height'\n                ]);\n                elementStyles(scroll, {\n                    width: scrollWidth,\n                    left: minPos + offset * scale,\n                    top: bbox.y1 + tooltipStyle.marginTop + tooltipStyle.borderTopWidth + tooltipStyle.height / 2\n                });\n                elementStyles(element, { visibility: 'visible' });\n            },\n            clearHideTimeout: function () {\n                if (this._hideTimeout) {\n                    clearTimeout(this._hideTimeout);\n                }\n                if (this._hideAnimation) {\n                    this._hideAnimation.cancel();\n                }\n            },\n            hide: function () {\n                var this$1 = this;\n                this.clearHideTimeout();\n                this._hideTimeout = setTimeout(function () {\n                    this$1._visible = false;\n                    this$1._hideAnimation = new FadeOutAnimation(this$1.element);\n                    this$1._hideAnimation.setup();\n                    this$1._hideAnimation.play();\n                }, this.options.hideDelay);\n            },\n            destroy: function () {\n                this.clearHideTimeout();\n                if (this.container) {\n                    this.container.removeChild(this.element);\n                }\n                delete this.container;\n                delete this.chartService;\n                delete this.element;\n                delete this.tooltip;\n                delete this.scroll;\n            }\n        });\n        dataviz.setDefaultOptions(NavigatorHint, {\n            format: '{0:d} - {1:d}',\n            hideDelay: 500\n        });\n        var NAVIGATOR_PANE = '_navigator';\n        var NAVIGATOR_AXIS = NAVIGATOR_PANE;\n        var constants = {\n            NAVIGATOR_AXIS: NAVIGATOR_AXIS,\n            NAVIGATOR_PANE: NAVIGATOR_PANE\n        };\n        var ZOOM_ACCELERATION = 3;\n        var Navigator = dataviz.Class.extend({\n            init: function (chart) {\n                this.chart = chart;\n                var options = this.options = deepExtend({}, this.options, chart.options.navigator);\n                var select = options.select;\n                if (select) {\n                    select.from = this.parseDate(select.from);\n                    select.to = this.parseDate(select.to);\n                }\n                if (!dataviz.defined(options.hint.visible)) {\n                    options.hint.visible = options.visible;\n                }\n                var obj;\n                this.chartObserver = new dataviz.InstanceObserver(this, (obj = {}, obj[datavizConstants.DRAG] = '_drag', obj[datavizConstants.DRAG_END] = '_dragEnd', obj[datavizConstants.ZOOM] = '_zoom', obj[datavizConstants.ZOOM_END] = '_zoomEnd', obj));\n                chart.addObserver(this.chartObserver);\n            },\n            parseDate: function (value) {\n                return dataviz.parseDate(this.chart.chartService.intl, value);\n            },\n            clean: function () {\n                if (this.selection) {\n                    this.selection.destroy();\n                    this.selection = null;\n                }\n                if (this.hint) {\n                    this.hint.destroy();\n                    this.hint = null;\n                }\n            },\n            destroy: function () {\n                if (this.chart) {\n                    this.chart.removeObserver(this.chartObserver);\n                    delete this.chart;\n                }\n                this.clean();\n            },\n            redraw: function () {\n                this._redrawSelf();\n                this.initSelection();\n            },\n            initSelection: function () {\n                var ref = this;\n                var chart = ref.chart;\n                var options = ref.options;\n                var axis = this.mainAxis();\n                var ref$1 = axis.roundedRange();\n                var min = ref$1.min;\n                var max = ref$1.max;\n                var ref$2 = options.select;\n                var from = ref$2.from;\n                var to = ref$2.to;\n                var mousewheel = ref$2.mousewheel;\n                var axisClone = clone(axis);\n                if (axis.categoriesCount() === 0) {\n                    return;\n                }\n                this.clean();\n                axisClone.box = axis.box;\n                this.selection = new dataviz.Selection(chart, axisClone, {\n                    min: min,\n                    max: max,\n                    from: from || min,\n                    to: to || max,\n                    mousewheel: dataviz.valueOrDefault(mousewheel, { zoom: 'left' }),\n                    visible: options.visible\n                }, new dataviz.InstanceObserver(this, {\n                    selectStart: '_selectStart',\n                    select: '_select',\n                    selectEnd: '_selectEnd'\n                }));\n                if (options.hint.visible) {\n                    this.hint = new NavigatorHint(chart.element, chart.chartService, {\n                        min: min,\n                        max: max,\n                        template: dataviz.getTemplate(options.hint),\n                        format: options.hint.format\n                    });\n                }\n            },\n            setRange: function () {\n                var plotArea = this.chart._createPlotArea(true);\n                var axis = plotArea.namedCategoryAxes[NAVIGATOR_AXIS];\n                var ref = axis.roundedRange();\n                var min = ref.min;\n                var max = ref.max;\n                var select = this.options.select || {};\n                var from = select.from || min;\n                if (from < min) {\n                    from = min;\n                }\n                var to = select.to || max;\n                if (to > max) {\n                    to = max;\n                }\n                this.options.select = deepExtend({}, select, {\n                    from: from,\n                    to: to\n                });\n                this.filterAxes();\n            },\n            _redrawSelf: function (silent) {\n                var plotArea = this.chart._plotArea;\n                if (plotArea) {\n                    plotArea.redraw(dataviz.last(plotArea.panes), silent);\n                }\n            },\n            redrawSlaves: function () {\n                var chart = this.chart;\n                var plotArea = chart._plotArea;\n                var slavePanes = plotArea.panes.slice(0, -1);\n                plotArea.srcSeries = chart.options.series;\n                plotArea.options.categoryAxis = chart.options.categoryAxis;\n                plotArea.clearSeriesPointsCache();\n                plotArea.redraw(slavePanes);\n            },\n            _drag: function (e) {\n                var ref = this;\n                var chart = ref.chart;\n                var selection = ref.selection;\n                var coords = chart._eventCoordinates(e.originalEvent);\n                var navigatorAxis = this.mainAxis();\n                var naviRange = navigatorAxis.roundedRange();\n                var inNavigator = navigatorAxis.pane.box.containsPoint(coords);\n                var axis = chart._plotArea.categoryAxis;\n                var range = e.axisRanges[axis.options.name];\n                var select = this.options.select;\n                var duration;\n                if (!range || inNavigator || !selection) {\n                    return;\n                }\n                if (select.from && select.to) {\n                    duration = toTime(select.to) - toTime(select.from);\n                } else {\n                    duration = toTime(selection.options.to) - toTime(selection.options.from);\n                }\n                var from = dataviz.toDate(dataviz.limitValue(toTime(range.min), naviRange.min, toTime(naviRange.max) - duration));\n                var to = dataviz.toDate(dataviz.limitValue(toTime(from) + duration, toTime(naviRange.min) + duration, naviRange.max));\n                this.options.select = {\n                    from: from,\n                    to: to\n                };\n                if (this.options.liveDrag) {\n                    this.filterAxes();\n                    this.redrawSlaves();\n                }\n                selection.set(from, to);\n                this.showHint(from, to);\n            },\n            _dragEnd: function () {\n                this.filterAxes();\n                this.filter();\n                this.redrawSlaves();\n                if (this.hint) {\n                    this.hint.hide();\n                }\n            },\n            readSelection: function () {\n                var ref = this;\n                var ref_selection_options = ref.selection.options;\n                var from = ref_selection_options.from;\n                var to = ref_selection_options.to;\n                var select = ref.options.select;\n                select.from = from;\n                select.to = to;\n            },\n            filterAxes: function () {\n                var ref = this;\n                var select = ref.options.select;\n                if (select === void 0) {\n                    select = {};\n                }\n                var chart = ref.chart;\n                var allAxes = chart.options.categoryAxis;\n                var from = select.from;\n                var to = select.to;\n                for (var idx = 0; idx < allAxes.length; idx++) {\n                    var axis = allAxes[idx];\n                    if (axis.pane !== NAVIGATOR_PANE) {\n                        axis.min = from;\n                        axis.max = to;\n                    }\n                }\n            },\n            filter: function () {\n                var ref = this;\n                var chart = ref.chart;\n                var select = ref.options.select;\n                if (!chart.requiresHandlers(['navigatorFilter'])) {\n                    return;\n                }\n                var mainAxis = this.mainAxis();\n                var args = {\n                    from: select.from,\n                    to: select.to\n                };\n                if (mainAxis.options.type !== 'category') {\n                    var axisOptions = new dataviz.DateCategoryAxis(deepExtend({ baseUnit: 'fit' }, chart.options.categoryAxis[0], {\n                        categories: [\n                            select.from,\n                            select.to\n                        ]\n                    }), chart.chartService).options;\n                    args.from = dataviz.addDuration(axisOptions.min, -axisOptions.baseUnitStep, axisOptions.baseUnit);\n                    args.to = dataviz.addDuration(axisOptions.max, axisOptions.baseUnitStep, axisOptions.baseUnit);\n                }\n                this.chart.trigger('navigatorFilter', args);\n            },\n            _zoom: function (e) {\n                var ref = this;\n                var axis = ref.chart._plotArea.categoryAxis;\n                var selection = ref.selection;\n                var ref_options = ref.options;\n                var select = ref_options.select;\n                var liveDrag = ref_options.liveDrag;\n                var mainAxis = this.mainAxis();\n                var delta = e.delta;\n                if (!selection) {\n                    return;\n                }\n                var fromIx = mainAxis.categoryIndex(selection.options.from);\n                var toIx = mainAxis.categoryIndex(selection.options.to);\n                e.originalEvent.preventDefault();\n                if (Math.abs(delta) > 1) {\n                    delta *= ZOOM_ACCELERATION;\n                }\n                if (toIx - fromIx > 1) {\n                    selection.expand(delta);\n                    this.readSelection();\n                } else {\n                    axis.options.min = select.from;\n                    select.from = axis.scaleRange(-e.delta).min;\n                }\n                if (liveDrag) {\n                    this.filterAxes();\n                    this.redrawSlaves();\n                }\n                selection.set(select.from, select.to);\n                this.showHint(this.options.select.from, this.options.select.to);\n            },\n            _zoomEnd: function (e) {\n                this._dragEnd(e);\n            },\n            showHint: function (from, to) {\n                var plotArea = this.chart._plotArea;\n                if (this.hint) {\n                    this.hint.show(from, to, plotArea.backgroundBox());\n                }\n            },\n            _selectStart: function (e) {\n                return this.chart._selectStart(e);\n            },\n            _select: function (e) {\n                this.showHint(e.from, e.to);\n                return this.chart._select(e);\n            },\n            _selectEnd: function (e) {\n                if (this.hint) {\n                    this.hint.hide();\n                }\n                this.readSelection();\n                this.filterAxes();\n                this.filter();\n                this.redrawSlaves();\n                return this.chart._selectEnd(e);\n            },\n            mainAxis: function () {\n                var plotArea = this.chart._plotArea;\n                if (plotArea) {\n                    return plotArea.namedCategoryAxes[NAVIGATOR_AXIS];\n                }\n            },\n            select: function (from, to) {\n                var select = this.options.select;\n                if (from && to) {\n                    select.from = this.parseDate(from);\n                    select.to = this.parseDate(to);\n                    this.filterAxes();\n                    this.filter();\n                    this.redrawSlaves();\n                    this.selection.set(from, to);\n                }\n                return {\n                    from: select.from,\n                    to: select.to\n                };\n            }\n        });\n        Navigator.setup = function (options, themeOptions) {\n            if (options === void 0) {\n                options = {};\n            }\n            if (themeOptions === void 0) {\n                themeOptions = {};\n            }\n            if (options.__navi) {\n                return;\n            }\n            options.__navi = true;\n            var naviOptions = deepExtend({}, themeOptions.navigator, options.navigator);\n            var panes = options.panes = [].concat(options.panes);\n            var paneOptions = deepExtend({}, naviOptions.pane, { name: NAVIGATOR_PANE });\n            if (!naviOptions.visible) {\n                paneOptions.visible = false;\n                paneOptions.height = 0.1;\n            }\n            panes.push(paneOptions);\n            Navigator.attachAxes(options, naviOptions);\n            Navigator.attachSeries(options, naviOptions, themeOptions);\n        };\n        Navigator.attachAxes = function (options, naviOptions) {\n            var series = naviOptions.series || [];\n            var categoryAxes = options.categoryAxis = [].concat(options.categoryAxis);\n            var valueAxes = options.valueAxis = [].concat(options.valueAxis);\n            var equallySpacedSeries = dataviz.filterSeriesByType(series, datavizConstants.EQUALLY_SPACED_SERIES);\n            var justifyAxis = equallySpacedSeries.length === 0;\n            var base = deepExtend({\n                type: 'date',\n                pane: NAVIGATOR_PANE,\n                roundToBaseUnit: !justifyAxis,\n                justified: justifyAxis,\n                _collapse: false,\n                majorTicks: { visible: true },\n                tooltip: { visible: false },\n                labels: { step: 1 },\n                autoBind: naviOptions.autoBindElements,\n                autoBaseUnitSteps: {\n                    minutes: [1],\n                    hours: [\n                        1,\n                        2\n                    ],\n                    days: [\n                        1,\n                        2\n                    ],\n                    weeks: [],\n                    months: [1],\n                    years: [1]\n                }\n            });\n            var user = naviOptions.categoryAxis;\n            categoryAxes.push(deepExtend({}, base, { maxDateGroups: 200 }, user, {\n                name: NAVIGATOR_AXIS,\n                title: null,\n                baseUnit: 'fit',\n                baseUnitStep: 'auto',\n                labels: { visible: false },\n                majorTicks: { visible: false }\n            }), deepExtend({}, base, user, {\n                name: NAVIGATOR_AXIS + '_labels',\n                maxDateGroups: 20,\n                baseUnitStep: 'auto',\n                labels: { position: '' },\n                plotBands: [],\n                autoBaseUnitSteps: { minutes: [] },\n                _overlap: true\n            }), deepExtend({}, base, user, {\n                name: NAVIGATOR_AXIS + '_ticks',\n                maxDateGroups: 200,\n                majorTicks: { width: 0.5 },\n                plotBands: [],\n                title: null,\n                labels: {\n                    visible: false,\n                    mirror: true\n                },\n                _overlap: true\n            }));\n            valueAxes.push(deepExtend({\n                name: NAVIGATOR_AXIS,\n                pane: NAVIGATOR_PANE,\n                majorGridLines: { visible: false },\n                visible: false\n            }, naviOptions.valueAxis));\n        };\n        Navigator.attachSeries = function (options, naviOptions, themeOptions) {\n            var series = options.series = options.series || [];\n            var navigatorSeries = [].concat(naviOptions.series || []);\n            var seriesColors = themeOptions.seriesColors;\n            var defaults = naviOptions.seriesDefaults;\n            for (var idx = 0; idx < navigatorSeries.length; idx++) {\n                series.push(deepExtend({\n                    color: seriesColors[idx % seriesColors.length],\n                    categoryField: naviOptions.dateField,\n                    visibleInLegend: false,\n                    tooltip: { visible: false }\n                }, defaults, navigatorSeries[idx], {\n                    axis: NAVIGATOR_AXIS,\n                    categoryAxis: NAVIGATOR_AXIS,\n                    autoBind: naviOptions.autoBindElements\n                }));\n            }\n        };\n        function ClonedObject() {\n        }\n        function clone(obj) {\n            ClonedObject.prototype = obj;\n            return new ClonedObject();\n        }\n        var AUTO_CATEGORY_WIDTH = 28;\n        var StockChart = Chart.extend({\n            applyDefaults: function (options, themeOptions) {\n                var width = dataviz.elementSize(this.element).width || datavizConstants.DEFAULT_WIDTH;\n                var theme = themeOptions;\n                var stockDefaults = {\n                    seriesDefaults: { categoryField: options.dateField },\n                    axisDefaults: {\n                        categoryAxis: {\n                            name: 'default',\n                            majorGridLines: { visible: false },\n                            labels: { step: 2 },\n                            majorTicks: { visible: false },\n                            maxDateGroups: Math.floor(width / AUTO_CATEGORY_WIDTH)\n                        }\n                    }\n                };\n                if (theme) {\n                    theme = deepExtend({}, theme, stockDefaults);\n                }\n                Navigator.setup(options, theme);\n                Chart.fn.applyDefaults.call(this, options, theme);\n            },\n            _setElementClass: function (element) {\n                dataviz.addClass(element, 'k-chart k-stockchart');\n            },\n            setOptions: function (options) {\n                this.destroyNavigator();\n                Chart.fn.setOptions.call(this, options);\n            },\n            noTransitionsRedraw: function () {\n                var transitions = this.options.transitions;\n                this.options.transitions = false;\n                this._fullRedraw();\n                this.options.transitions = transitions;\n            },\n            _resize: function () {\n                this.noTransitionsRedraw();\n            },\n            _redraw: function () {\n                var navigator = this.navigator;\n                if (!this._dirty() && navigator && navigator.options.partialRedraw) {\n                    navigator.redrawSlaves();\n                } else {\n                    this._fullRedraw();\n                }\n            },\n            _dirty: function () {\n                var options = this.options;\n                var series = [].concat(options.series, options.navigator.series);\n                var seriesCount = dataviz.grep(series, function (s) {\n                    return s && s.visible;\n                }).length;\n                var dirty = this._seriesCount !== seriesCount;\n                this._seriesCount = seriesCount;\n                return dirty;\n            },\n            _fullRedraw: function () {\n                var navigator = this.navigator;\n                if (!navigator) {\n                    navigator = this.navigator = new Navigator(this);\n                    this.trigger('navigatorCreated', { navigator: navigator });\n                }\n                navigator.clean();\n                navigator.setRange();\n                Chart.fn._redraw.call(this);\n                navigator.initSelection();\n            },\n            _trackSharedTooltip: function (coords) {\n                var plotArea = this._plotArea;\n                var pane = plotArea.paneByPoint(coords);\n                if (pane && pane.options.name === NAVIGATOR_PANE) {\n                    this._unsetActivePoint();\n                } else {\n                    Chart.fn._trackSharedTooltip.call(this, coords);\n                }\n            },\n            bindCategories: function () {\n                Chart.fn.bindCategories.call(this);\n                this.copyNavigatorCategories();\n            },\n            copyNavigatorCategories: function () {\n                var definitions = [].concat(this.options.categoryAxis);\n                var categories;\n                for (var axisIx = 0; axisIx < definitions.length; axisIx++) {\n                    var axis = definitions[axisIx];\n                    if (axis.name === NAVIGATOR_AXIS) {\n                        categories = axis.categories;\n                    } else if (categories && axis.pane === NAVIGATOR_PANE) {\n                        axis.categories = categories;\n                    }\n                }\n            },\n            destroyNavigator: function () {\n                if (this.navigator) {\n                    this.navigator.destroy();\n                    this.navigator = null;\n                }\n            },\n            destroy: function () {\n                this.destroyNavigator();\n                Chart.fn.destroy.call(this);\n            },\n            _stopChartHandlers: function (e) {\n                var coords = this._eventCoordinates(e);\n                var pane = this._plotArea.paneByPoint(coords);\n                return Chart.fn._stopChartHandlers.call(this, e) || pane && pane.options.name === NAVIGATOR_PANE;\n            }\n        });\n        dataviz.setDefaultOptions(StockChart, {\n            dateField: 'date',\n            axisDefaults: {\n                categoryAxis: {\n                    type: 'date',\n                    baseUnit: 'fit',\n                    justified: true\n                },\n                valueAxis: {\n                    narrowRange: true,\n                    labels: { format: 'C' }\n                }\n            },\n            navigator: {\n                select: {},\n                seriesDefaults: {\n                    markers: { visible: false },\n                    tooltip: { visible: true },\n                    line: { width: 2 }\n                },\n                hint: {},\n                visible: true\n            },\n            tooltip: { visible: true },\n            legend: { visible: false }\n        });\n        kendo.deepExtend(kendo.dataviz, {\n            constants: constants,\n            Navigator: Navigator,\n            NavigatorHint: NavigatorHint,\n            StockChart: StockChart\n        });\n    }());\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/stock/stock-chart', ['dataviz/stock/kendo-stock-chart'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var dataviz = kendo.dataviz;\n        var ChartInstanceObserver = dataviz.ChartInstanceObserver;\n        var Chart = dataviz.ui.Chart;\n        var KendoStockChart = dataviz.StockChart;\n        var constants = dataviz.constants;\n        var NAVIGATOR_AXIS = constants.NAVIGATOR_AXIS;\n        var NAVIGATOR_PANE = constants.NAVIGATOR_PANE;\n        var deepExtend = kendo.deepExtend;\n        var defined = dataviz.defined;\n        var proxy = $.proxy;\n        var CHANGE = 'change';\n        var StockInstanceObserver = ChartInstanceObserver.extend({\n            handlerMap: {\n                navigatorFilter: '_onNavigatorFilter',\n                navigatorCreated: '_onNavigatorCreated'\n            }\n        });\n        var StockChart = Chart.extend({\n            options: {\n                name: 'StockChart',\n                dateField: 'date',\n                axisDefaults: {\n                    categoryAxis: {\n                        type: 'date',\n                        baseUnit: 'fit',\n                        justified: true\n                    },\n                    valueAxis: {\n                        narrowRange: true,\n                        labels: { format: 'C' }\n                    }\n                },\n                navigator: {\n                    select: {},\n                    seriesDefaults: {\n                        markers: { visible: false },\n                        tooltip: {\n                            visible: true,\n                            template: '#= kendo.toString(category, \\'d\\') #'\n                        },\n                        line: { width: 2 }\n                    },\n                    hint: {},\n                    visible: true\n                },\n                tooltip: { visible: true },\n                legend: { visible: false },\n                persistSeriesVisibility: true\n            },\n            _createChart: function (options, themeOptions) {\n                this._initNavigatorOptions(options);\n                this._instance = new KendoStockChart(this.element[0], options, themeOptions, {\n                    observer: new StockInstanceObserver(this),\n                    sender: this,\n                    rtl: this._isRtl()\n                });\n            },\n            _initNavigatorOptions: function (options) {\n                var navigatorOptions = options.navigator || {};\n                var support = kendo.support;\n                var isTouch = support.touch;\n                var isFirefox = support.browser.mozilla;\n                deepExtend(navigatorOptions, {\n                    autoBindElements: !navigatorOptions.dataSource,\n                    partialRedraw: navigatorOptions.dataSource,\n                    liveDrag: !isTouch && !isFirefox\n                });\n            },\n            _initDataSource: function (userOptions) {\n                var options = userOptions || {}, dataSource = options.dataSource, hasServerFiltering = dataSource && dataSource.serverFiltering, mainAxis = [].concat(options.categoryAxis)[0], naviOptions = options.navigator || {}, select = naviOptions.select, hasSelect = select && select.from && select.to;\n                if (hasServerFiltering && hasSelect) {\n                    var filter = [].concat(dataSource.filter || []);\n                    var from = kendo.parseDate(select.from);\n                    var to = kendo.parseDate(select.to);\n                    var dummyAxis = new dataviz.DateCategoryAxis(deepExtend({ baseUnit: 'fit' }, mainAxis, {\n                        categories: [\n                            from,\n                            to\n                        ]\n                    }), kendo);\n                    dataSource.filter = buildFilter(dummyAxis.range().min, to).concat(filter);\n                }\n                Chart.fn._initDataSource.call(this, userOptions);\n            },\n            _onNavigatorCreated: function (e) {\n                this._instance = e.sender;\n                this.options = e.sender.options;\n                this._navigator = this.navigator = e.navigator;\n                this._initNavigatorDataSource();\n            },\n            _initNavigatorDataSource: function () {\n                var navigatorOptions = this.options.navigator;\n                var autoBind = navigatorOptions.autoBind;\n                var dsOptions = navigatorOptions.dataSource;\n                if (dsOptions) {\n                    this._navigatorDataChangedHandler = this._navigatorDataChangedHandler || proxy(this._onNavigatorDataChanged, this);\n                    this._navigatorDataSource = kendo.data.DataSource.create(dsOptions).bind(CHANGE, this._navigatorDataChangedHandler);\n                    if (!defined(autoBind)) {\n                        autoBind = this.options.autoBind;\n                    }\n                    if (autoBind) {\n                        this._navigatorDataSource.fetch();\n                    }\n                }\n            },\n            _bindNavigatorSeries: function (series, data) {\n                var seriesIx, currentSeries, seriesLength = series.length;\n                for (seriesIx = 0; seriesIx < seriesLength; seriesIx++) {\n                    currentSeries = series[seriesIx];\n                    if (currentSeries.axis == NAVIGATOR_AXIS && this._isBindable(currentSeries)) {\n                        currentSeries.data = data;\n                    }\n                }\n            },\n            _onNavigatorDataChanged: function () {\n                var chart = this, instance = chart._instance, categoryAxes = chart.options.categoryAxis, axisIx, axesLength = categoryAxes.length, data = chart._navigatorDataSource.view(), currentAxis, naviCategories;\n                this._bindNavigatorSeries(chart.options.series, data);\n                if (chart._sourceSeries) {\n                    this._bindNavigatorSeries(chart._sourceSeries, data);\n                }\n                for (axisIx = 0; axisIx < axesLength; axisIx++) {\n                    currentAxis = categoryAxes[axisIx];\n                    if (currentAxis.pane == NAVIGATOR_PANE) {\n                        if (currentAxis.name == NAVIGATOR_AXIS) {\n                            chart._bindCategoryAxis(currentAxis, data, axisIx);\n                            naviCategories = currentAxis.categories;\n                        } else {\n                            currentAxis.categories = naviCategories;\n                        }\n                    }\n                }\n                if (instance._model) {\n                    var navigator = this.navigator;\n                    navigator.redraw();\n                    navigator.setRange();\n                    if (!chart.options.dataSource || chart.options.dataSource && chart._dataBound) {\n                        navigator.redrawSlaves();\n                    }\n                }\n            },\n            _bindCategories: function () {\n                Chart.fn._bindCategories.call(this);\n                if (this._instance) {\n                    this._instance.copyNavigatorCategories();\n                }\n            },\n            _onDataChanged: function () {\n                Chart.fn._onDataChanged.call(this);\n                this._dataBound = true;\n            },\n            setOptions: function (options) {\n                this._removeNavigatorDataSource();\n                this._initNavigatorOptions(options);\n                this._instance.destroyNavigator();\n                Chart.fn.setOptions.call(this, options);\n            },\n            _onNavigatorFilter: function (e) {\n                this.dataSource.filter(buildFilter(e.from, e.to));\n            },\n            requiresHandlers: function (names) {\n                if (dataviz.inArray('navigatorFilter', names)) {\n                    var dataSource = this.dataSource;\n                    var hasServerFiltering = dataSource && dataSource.options.serverFiltering;\n                    return hasServerFiltering && this.options.navigator.dataSource;\n                }\n                return Chart.fn.requiresHandlers.call(this, names);\n            },\n            _removeNavigatorDataSource: function () {\n                var navigatorDataSource = this._navigatorDataSource;\n                if (navigatorDataSource) {\n                    navigatorDataSource.unbind(CHANGE, this._navigatorDataChangedHandler);\n                    delete this._navigatorDataSource;\n                }\n            },\n            destroy: function () {\n                Chart.fn.destroy.call(this);\n                this._removeNavigatorDataSource();\n            }\n        });\n        dataviz.ui.plugin(StockChart);\n        function buildFilter(from, to) {\n            return [\n                {\n                    field: 'Date',\n                    operator: 'gte',\n                    value: from\n                },\n                {\n                    field: 'Date',\n                    operator: 'lt',\n                    value: to\n                }\n            ];\n        }\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.stock', [\n        'dataviz/stock/kendo-stock-chart',\n        'dataviz/stock/stock-chart'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.stockchart',\n        name: 'StockChart',\n        category: 'dataviz',\n        description: 'StockChart widget and associated financial series.',\n        depends: ['dataviz.chart']\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/sparkline/kendo-sparkline', ['kendo.dataviz.chart'], f);\n}(function () {\n    (function () {\n        window.kendo.dataviz = window.kendo.dataviz || {};\n        var dataviz = kendo.dataviz;\n        var constants = dataviz.constants;\n        var Chart = dataviz.Chart;\n        var elementSize = dataviz.elementSize;\n        var deepExtend = dataviz.deepExtend;\n        var TOP_OFFSET = -2;\n        var SharedTooltip$1 = dataviz.SharedTooltip.extend({\n            _slotAnchor: function (coords, slot) {\n                var axis = this.plotArea.categoryAxis;\n                var vertical = axis.options.vertical;\n                var align = vertical ? {\n                    horizontal: 'left',\n                    vertical: 'center'\n                } : {\n                    horizontal: 'center',\n                    vertical: 'bottom'\n                };\n                var point;\n                if (vertical) {\n                    point = new dataviz.Point(this.plotArea.box.x2, slot.center().y);\n                } else {\n                    point = new dataviz.Point(slot.center().x, TOP_OFFSET);\n                }\n                return {\n                    point: point,\n                    align: align\n                };\n            },\n            _defaultAnchor: function (point, slot) {\n                return this._slotAnchor({}, slot);\n            }\n        });\n        var DEAULT_BAR_WIDTH = 150;\n        var DEAULT_BULLET_WIDTH = 150;\n        var NO_CROSSHAIR = [\n            constants.BAR,\n            constants.BULLET\n        ];\n        function hide(children) {\n            var state = [];\n            for (var idx = 0; idx < children.length; idx++) {\n                var child = children[idx];\n                state[idx] = child.style.display;\n                child.style.display = 'none';\n            }\n            return state;\n        }\n        function show(children, state) {\n            for (var idx = 0; idx < children.length; idx++) {\n                children[idx].style.display = state[idx];\n            }\n        }\n        function wrapNumber(value) {\n            return dataviz.isNumber(value) ? [value] : value;\n        }\n        var Sparkline = Chart.extend({\n            _setElementClass: function (element) {\n                dataviz.addClass(element, 'k-sparkline');\n            },\n            _initElement: function (element) {\n                Chart.fn._initElement.call(this, element);\n                this._initialWidth = Math.floor(elementSize(element).width);\n            },\n            _resize: function () {\n                var element = this.element;\n                var state = hide(element.childNodes);\n                this._initialWidth = Math.floor(elementSize(element).width);\n                show(element.childNodes, state);\n                Chart.fn._resize.call(this);\n            },\n            _modelOptions: function () {\n                var chartOptions = this.options;\n                var stage = this._surfaceWrap();\n                var displayState = hide(stage.childNodes);\n                var space = document.createElement('span');\n                space.innerHTML = '&nbsp;';\n                stage.appendChild(space);\n                var options = deepExtend({\n                    width: this._autoWidth,\n                    height: elementSize(stage).height,\n                    transitions: chartOptions.transitions\n                }, chartOptions.chartArea, {\n                    inline: true,\n                    align: false\n                });\n                elementSize(stage, {\n                    width: options.width,\n                    height: options.height\n                });\n                stage.removeChild(space);\n                show(stage.childNodes, displayState);\n                if (this.surface) {\n                    this.surface.resize();\n                }\n                return options;\n            },\n            _surfaceWrap: function () {\n                if (!this.stage) {\n                    var stage = this.stage = document.createElement('span');\n                    this.element.appendChild(stage);\n                }\n                return this.stage;\n            },\n            _createPlotArea: function (skipSeries) {\n                var plotArea = Chart.fn._createPlotArea.call(this, skipSeries);\n                this._autoWidth = this._initialWidth || this._calculateWidth(plotArea);\n                return plotArea;\n            },\n            _calculateWidth: function (plotArea) {\n                var options = this.options;\n                var margin = dataviz.getSpacing(options.chartArea.margin);\n                var charts = plotArea.charts;\n                var stage = this._surfaceWrap();\n                var total = 0;\n                for (var i = 0; i < charts.length; i++) {\n                    var currentChart = charts[i];\n                    var firstSeries = (currentChart.options.series || [])[0];\n                    if (!firstSeries) {\n                        continue;\n                    }\n                    if (firstSeries.type === constants.BAR) {\n                        return DEAULT_BAR_WIDTH;\n                    }\n                    if (firstSeries.type === constants.BULLET) {\n                        return DEAULT_BULLET_WIDTH;\n                    }\n                    if (firstSeries.type === constants.PIE) {\n                        return elementSize(stage).height;\n                    }\n                    var categoryAxis = currentChart.categoryAxis;\n                    if (categoryAxis) {\n                        var pointsCount = categoryAxis.categoriesCount() * (!currentChart.options.isStacked && dataviz.inArray(firstSeries.type, [\n                            constants.COLUMN,\n                            constants.VERTICAL_BULLET\n                        ]) ? currentChart.seriesOptions.length : 1);\n                        total = Math.max(total, pointsCount);\n                    }\n                }\n                var size = total * options.pointWidth;\n                if (size > 0) {\n                    size += margin.left + margin.right;\n                }\n                return size;\n            },\n            _createSharedTooltip: function (options) {\n                return new SharedTooltip$1(this._plotArea, options);\n            }\n        });\n        Sparkline.normalizeOptions = function (userOptions) {\n            var options = wrapNumber(userOptions);\n            if (dataviz.isArray(options)) {\n                options = { seriesDefaults: { data: options } };\n            } else {\n                options = deepExtend({}, options);\n            }\n            if (!options.series) {\n                options.series = [{ data: wrapNumber(options.data) }];\n            }\n            deepExtend(options, { seriesDefaults: { type: options.type } });\n            if (dataviz.inArray(options.series[0].type, NO_CROSSHAIR) || dataviz.inArray(options.seriesDefaults.type, NO_CROSSHAIR)) {\n                options = deepExtend({}, { categoryAxis: { crosshair: { visible: false } } }, options);\n            }\n            return options;\n        };\n        dataviz.setDefaultOptions(Sparkline, {\n            chartArea: { margin: 2 },\n            axisDefaults: {\n                visible: false,\n                majorGridLines: { visible: false },\n                valueAxis: { narrowRange: true }\n            },\n            seriesDefaults: {\n                type: 'line',\n                area: { line: { width: 0.5 } },\n                bar: { stack: true },\n                padding: 2,\n                width: 0.5,\n                overlay: { gradient: null },\n                highlight: { visible: false },\n                border: { width: 0 },\n                markers: {\n                    size: 2,\n                    visible: false\n                }\n            },\n            tooltip: {\n                visible: true,\n                shared: true\n            },\n            categoryAxis: {\n                crosshair: {\n                    visible: true,\n                    tooltip: { visible: false }\n                }\n            },\n            legend: { visible: false },\n            transitions: false,\n            pointWidth: 5,\n            panes: [{ clip: false }]\n        });\n        kendo.deepExtend(kendo.dataviz, { Sparkline: Sparkline });\n    }());\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/sparkline/sparkline', ['dataviz/sparkline/kendo-sparkline'], f);\n}(function () {\n    (function ($) {\n        var dataviz = kendo.dataviz;\n        var Chart = dataviz.ui.Chart;\n        var KendoSparkline = dataviz.Sparkline;\n        var ChartInstanceObserver = dataviz.ChartInstanceObserver;\n        var extend = $.extend;\n        var Sparkline = Chart.extend({\n            init: function (element, userOptions) {\n                var options = userOptions;\n                if (options instanceof kendo.data.ObservableArray) {\n                    options = { seriesDefaults: { data: options } };\n                }\n                Chart.fn.init.call(this, element, KendoSparkline.normalizeOptions(options));\n            },\n            _createChart: function (options, themeOptions) {\n                this._instance = new KendoSparkline(this.element[0], options, themeOptions, {\n                    observer: new ChartInstanceObserver(this),\n                    sender: this,\n                    rtl: this._isRtl()\n                });\n            },\n            _createTooltip: function () {\n                return new SparklineTooltip(this.element, extend({}, this.options.tooltip, { rtl: this._isRtl() }));\n            },\n            options: {\n                name: 'Sparkline',\n                chartArea: { margin: 2 },\n                axisDefaults: {\n                    visible: false,\n                    majorGridLines: { visible: false },\n                    valueAxis: { narrowRange: true }\n                },\n                seriesDefaults: {\n                    type: 'line',\n                    area: { line: { width: 0.5 } },\n                    bar: { stack: true },\n                    padding: 2,\n                    width: 0.5,\n                    overlay: { gradient: null },\n                    highlight: { visible: false },\n                    border: { width: 0 },\n                    markers: {\n                        size: 2,\n                        visible: false\n                    }\n                },\n                tooltip: {\n                    visible: true,\n                    shared: true\n                },\n                categoryAxis: {\n                    crosshair: {\n                        visible: true,\n                        tooltip: { visible: false }\n                    }\n                },\n                legend: { visible: false },\n                transitions: false,\n                pointWidth: 5,\n                panes: [{ clip: false }]\n            }\n        });\n        dataviz.ui.plugin(Sparkline);\n        var SparklineTooltip = dataviz.Tooltip.extend({\n            options: { animation: { duration: 0 } },\n            _hideElement: function () {\n                if (this.element) {\n                    this.element.hide().remove();\n                }\n            }\n        });\n        dataviz.SparklineTooltip = SparklineTooltip;\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.sparkline', [\n        'dataviz/sparkline/kendo-sparkline',\n        'dataviz/sparkline/sparkline'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.sparkline',\n        name: 'Sparkline',\n        category: 'dataviz',\n        description: 'Sparkline widgets.',\n        depends: ['dataviz.chart']\n    };\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('util/main', ['kendo.core'], f);\n}(function () {\n    (function () {\n        var kendo = window.kendo, deepExtend = kendo.deepExtend;\n        function sqr(value) {\n            return value * value;\n        }\n        var now = Date.now;\n        if (!now) {\n            now = function () {\n                return new Date().getTime();\n            };\n        }\n        function renderSize(size) {\n            if (typeof size !== 'string') {\n                size += 'px';\n            }\n            return size;\n        }\n        function renderPos(pos) {\n            var result = [];\n            if (pos) {\n                var parts = kendo.toHyphens(pos).split('-');\n                for (var i = 0; i < parts.length; i++) {\n                    result.push('k-pos-' + parts[i]);\n                }\n            }\n            return result.join(' ');\n        }\n        function arabicToRoman(n) {\n            var literals = {\n                1: 'i',\n                10: 'x',\n                100: 'c',\n                2: 'ii',\n                20: 'xx',\n                200: 'cc',\n                3: 'iii',\n                30: 'xxx',\n                300: 'ccc',\n                4: 'iv',\n                40: 'xl',\n                400: 'cd',\n                5: 'v',\n                50: 'l',\n                500: 'd',\n                6: 'vi',\n                60: 'lx',\n                600: 'dc',\n                7: 'vii',\n                70: 'lxx',\n                700: 'dcc',\n                8: 'viii',\n                80: 'lxxx',\n                800: 'dccc',\n                9: 'ix',\n                90: 'xc',\n                900: 'cm',\n                1000: 'm'\n            };\n            var values = [\n                1000,\n                900,\n                800,\n                700,\n                600,\n                500,\n                400,\n                300,\n                200,\n                100,\n                90,\n                80,\n                70,\n                60,\n                50,\n                40,\n                30,\n                20,\n                10,\n                9,\n                8,\n                7,\n                6,\n                5,\n                4,\n                3,\n                2,\n                1\n            ];\n            var roman = '';\n            while (n > 0) {\n                if (n < values[0]) {\n                    values.shift();\n                } else {\n                    roman += literals[values[0]];\n                    n -= values[0];\n                }\n            }\n            return roman;\n        }\n        function romanToArabic(r) {\n            r = r.toLowerCase();\n            var digits = {\n                i: 1,\n                v: 5,\n                x: 10,\n                l: 50,\n                c: 100,\n                d: 500,\n                m: 1000\n            };\n            var value = 0, prev = 0;\n            for (var i = 0; i < r.length; ++i) {\n                var v = digits[r.charAt(i)];\n                if (!v) {\n                    return null;\n                }\n                value += v;\n                if (v > prev) {\n                    value -= 2 * prev;\n                }\n                prev = v;\n            }\n            return value;\n        }\n        function memoize(f) {\n            var cache = Object.create(null);\n            return function () {\n                var id = '';\n                for (var i = arguments.length; --i >= 0;) {\n                    id += ':' + arguments[i];\n                }\n                return id in cache ? cache[id] : cache[id] = f.apply(this, arguments);\n            };\n        }\n        function isUnicodeLetter(ch) {\n            return RX_UNICODE_LETTER.test(ch);\n        }\n        function withExit(f, obj) {\n            try {\n                return f.call(obj, function (value) {\n                    throw new Return(value);\n                });\n            } catch (ex) {\n                if (ex instanceof Return) {\n                    return ex.value;\n                }\n                throw ex;\n            }\n            function Return(value) {\n                this.value = value;\n            }\n        }\n        deepExtend(kendo, {\n            util: {\n                now: now,\n                renderPos: renderPos,\n                renderSize: renderSize,\n                sqr: sqr,\n                romanToArabic: romanToArabic,\n                arabicToRoman: arabicToRoman,\n                memoize: memoize,\n                isUnicodeLetter: isUnicodeLetter,\n                withExit: withExit\n            }\n        });\n        var RX_UNICODE_LETTER = new RegExp('[\\\\u0041-\\\\u005A\\\\u0061-\\\\u007A\\\\u00AA\\\\u00B5\\\\u00BA\\\\u00C0-\\\\u00D6\\\\u00D8-\\\\u00F6\\\\u00F8-\\\\u02C1\\\\u02C6-\\\\u02D1\\\\u02E0-\\\\u02E4\\\\u02EC\\\\u02EE\\\\u0370-\\\\u0374\\\\u0376\\\\u0377\\\\u037A-\\\\u037D\\\\u037F\\\\u0386\\\\u0388-\\\\u038A\\\\u038C\\\\u038E-\\\\u03A1\\\\u03A3-\\\\u03F5\\\\u03F7-\\\\u0481\\\\u048A-\\\\u052F\\\\u0531-\\\\u0556\\\\u0559\\\\u0561-\\\\u0587\\\\u05D0-\\\\u05EA\\\\u05F0-\\\\u05F2\\\\u0620-\\\\u064A\\\\u066E\\\\u066F\\\\u0671-\\\\u06D3\\\\u06D5\\\\u06E5\\\\u06E6\\\\u06EE\\\\u06EF\\\\u06FA-\\\\u06FC\\\\u06FF\\\\u0710\\\\u0712-\\\\u072F\\\\u074D-\\\\u07A5\\\\u07B1\\\\u07CA-\\\\u07EA\\\\u07F4\\\\u07F5\\\\u07FA\\\\u0800-\\\\u0815\\\\u081A\\\\u0824\\\\u0828\\\\u0840-\\\\u0858\\\\u08A0-\\\\u08B2\\\\u0904-\\\\u0939\\\\u093D\\\\u0950\\\\u0958-\\\\u0961\\\\u0971-\\\\u0980\\\\u0985-\\\\u098C\\\\u098F\\\\u0990\\\\u0993-\\\\u09A8\\\\u09AA-\\\\u09B0\\\\u09B2\\\\u09B6-\\\\u09B9\\\\u09BD\\\\u09CE\\\\u09DC\\\\u09DD\\\\u09DF-\\\\u09E1\\\\u09F0\\\\u09F1\\\\u0A05-\\\\u0A0A\\\\u0A0F\\\\u0A10\\\\u0A13-\\\\u0A28\\\\u0A2A-\\\\u0A30\\\\u0A32\\\\u0A33\\\\u0A35\\\\u0A36\\\\u0A38\\\\u0A39\\\\u0A59-\\\\u0A5C\\\\u0A5E\\\\u0A72-\\\\u0A74\\\\u0A85-\\\\u0A8D\\\\u0A8F-\\\\u0A91\\\\u0A93-\\\\u0AA8\\\\u0AAA-\\\\u0AB0\\\\u0AB2\\\\u0AB3\\\\u0AB5-\\\\u0AB9\\\\u0ABD\\\\u0AD0\\\\u0AE0\\\\u0AE1\\\\u0B05-\\\\u0B0C\\\\u0B0F\\\\u0B10\\\\u0B13-\\\\u0B28\\\\u0B2A-\\\\u0B30\\\\u0B32\\\\u0B33\\\\u0B35-\\\\u0B39\\\\u0B3D\\\\u0B5C\\\\u0B5D\\\\u0B5F-\\\\u0B61\\\\u0B71\\\\u0B83\\\\u0B85-\\\\u0B8A\\\\u0B8E-\\\\u0B90\\\\u0B92-\\\\u0B95\\\\u0B99\\\\u0B9A\\\\u0B9C\\\\u0B9E\\\\u0B9F\\\\u0BA3\\\\u0BA4\\\\u0BA8-\\\\u0BAA\\\\u0BAE-\\\\u0BB9\\\\u0BD0\\\\u0C05-\\\\u0C0C\\\\u0C0E-\\\\u0C10\\\\u0C12-\\\\u0C28\\\\u0C2A-\\\\u0C39\\\\u0C3D\\\\u0C58\\\\u0C59\\\\u0C60\\\\u0C61\\\\u0C85-\\\\u0C8C\\\\u0C8E-\\\\u0C90\\\\u0C92-\\\\u0CA8\\\\u0CAA-\\\\u0CB3\\\\u0CB5-\\\\u0CB9\\\\u0CBD\\\\u0CDE\\\\u0CE0\\\\u0CE1\\\\u0CF1\\\\u0CF2\\\\u0D05-\\\\u0D0C\\\\u0D0E-\\\\u0D10\\\\u0D12-\\\\u0D3A\\\\u0D3D\\\\u0D4E\\\\u0D60\\\\u0D61\\\\u0D7A-\\\\u0D7F\\\\u0D85-\\\\u0D96\\\\u0D9A-\\\\u0DB1\\\\u0DB3-\\\\u0DBB\\\\u0DBD\\\\u0DC0-\\\\u0DC6\\\\u0E01-\\\\u0E30\\\\u0E32\\\\u0E33\\\\u0E40-\\\\u0E46\\\\u0E81\\\\u0E82\\\\u0E84\\\\u0E87\\\\u0E88\\\\u0E8A\\\\u0E8D\\\\u0E94-\\\\u0E97\\\\u0E99-\\\\u0E9F\\\\u0EA1-\\\\u0EA3\\\\u0EA5\\\\u0EA7\\\\u0EAA\\\\u0EAB\\\\u0EAD-\\\\u0EB0\\\\u0EB2\\\\u0EB3\\\\u0EBD\\\\u0EC0-\\\\u0EC4\\\\u0EC6\\\\u0EDC-\\\\u0EDF\\\\u0F00\\\\u0F40-\\\\u0F47\\\\u0F49-\\\\u0F6C\\\\u0F88-\\\\u0F8C\\\\u1000-\\\\u102A\\\\u103F\\\\u1050-\\\\u1055\\\\u105A-\\\\u105D\\\\u1061\\\\u1065\\\\u1066\\\\u106E-\\\\u1070\\\\u1075-\\\\u1081\\\\u108E\\\\u10A0-\\\\u10C5\\\\u10C7\\\\u10CD\\\\u10D0-\\\\u10FA\\\\u10FC-\\\\u1248\\\\u124A-\\\\u124D\\\\u1250-\\\\u1256\\\\u1258\\\\u125A-\\\\u125D\\\\u1260-\\\\u1288\\\\u128A-\\\\u128D\\\\u1290-\\\\u12B0\\\\u12B2-\\\\u12B5\\\\u12B8-\\\\u12BE\\\\u12C0\\\\u12C2-\\\\u12C5\\\\u12C8-\\\\u12D6\\\\u12D8-\\\\u1310\\\\u1312-\\\\u1315\\\\u1318-\\\\u135A\\\\u1380-\\\\u138F\\\\u13A0-\\\\u13F4\\\\u1401-\\\\u166C\\\\u166F-\\\\u167F\\\\u1681-\\\\u169A\\\\u16A0-\\\\u16EA\\\\u16EE-\\\\u16F8\\\\u1700-\\\\u170C\\\\u170E-\\\\u1711\\\\u1720-\\\\u1731\\\\u1740-\\\\u1751\\\\u1760-\\\\u176C\\\\u176E-\\\\u1770\\\\u1780-\\\\u17B3\\\\u17D7\\\\u17DC\\\\u1820-\\\\u1877\\\\u1880-\\\\u18A8\\\\u18AA\\\\u18B0-\\\\u18F5\\\\u1900-\\\\u191E\\\\u1950-\\\\u196D\\\\u1970-\\\\u1974\\\\u1980-\\\\u19AB\\\\u19C1-\\\\u19C7\\\\u1A00-\\\\u1A16\\\\u1A20-\\\\u1A54\\\\u1AA7\\\\u1B05-\\\\u1B33\\\\u1B45-\\\\u1B4B\\\\u1B83-\\\\u1BA0\\\\u1BAE\\\\u1BAF\\\\u1BBA-\\\\u1BE5\\\\u1C00-\\\\u1C23\\\\u1C4D-\\\\u1C4F\\\\u1C5A-\\\\u1C7D\\\\u1CE9-\\\\u1CEC\\\\u1CEE-\\\\u1CF1\\\\u1CF5\\\\u1CF6\\\\u1D00-\\\\u1DBF\\\\u1E00-\\\\u1F15\\\\u1F18-\\\\u1F1D\\\\u1F20-\\\\u1F45\\\\u1F48-\\\\u1F4D\\\\u1F50-\\\\u1F57\\\\u1F59\\\\u1F5B\\\\u1F5D\\\\u1F5F-\\\\u1F7D\\\\u1F80-\\\\u1FB4\\\\u1FB6-\\\\u1FBC\\\\u1FBE\\\\u1FC2-\\\\u1FC4\\\\u1FC6-\\\\u1FCC\\\\u1FD0-\\\\u1FD3\\\\u1FD6-\\\\u1FDB\\\\u1FE0-\\\\u1FEC\\\\u1FF2-\\\\u1FF4\\\\u1FF6-\\\\u1FFC\\\\u2071\\\\u207F\\\\u2090-\\\\u209C\\\\u2102\\\\u2107\\\\u210A-\\\\u2113\\\\u2115\\\\u2119-\\\\u211D\\\\u2124\\\\u2126\\\\u2128\\\\u212A-\\\\u212D\\\\u212F-\\\\u2139\\\\u213C-\\\\u213F\\\\u2145-\\\\u2149\\\\u214E\\\\u2160-\\\\u2188\\\\u2C00-\\\\u2C2E\\\\u2C30-\\\\u2C5E\\\\u2C60-\\\\u2CE4\\\\u2CEB-\\\\u2CEE\\\\u2CF2\\\\u2CF3\\\\u2D00-\\\\u2D25\\\\u2D27\\\\u2D2D\\\\u2D30-\\\\u2D67\\\\u2D6F\\\\u2D80-\\\\u2D96\\\\u2DA0-\\\\u2DA6\\\\u2DA8-\\\\u2DAE\\\\u2DB0-\\\\u2DB6\\\\u2DB8-\\\\u2DBE\\\\u2DC0-\\\\u2DC6\\\\u2DC8-\\\\u2DCE\\\\u2DD0-\\\\u2DD6\\\\u2DD8-\\\\u2DDE\\\\u2E2F\\\\u3005-\\\\u3007\\\\u3021-\\\\u3029\\\\u3031-\\\\u3035\\\\u3038-\\\\u303C\\\\u3041-\\\\u3096\\\\u309D-\\\\u309F\\\\u30A1-\\\\u30FA\\\\u30FC-\\\\u30FF\\\\u3105-\\\\u312D\\\\u3131-\\\\u318E\\\\u31A0-\\\\u31BA\\\\u31F0-\\\\u31FF\\\\u3400-\\\\u4DB5\\\\u4E00-\\\\u9FCC\\\\uA000-\\\\uA48C\\\\uA4D0-\\\\uA4FD\\\\uA500-\\\\uA60C\\\\uA610-\\\\uA61F\\\\uA62A\\\\uA62B\\\\uA640-\\\\uA66E\\\\uA67F-\\\\uA69D\\\\uA6A0-\\\\uA6EF\\\\uA717-\\\\uA71F\\\\uA722-\\\\uA788\\\\uA78B-\\\\uA78E\\\\uA790-\\\\uA7AD\\\\uA7B0\\\\uA7B1\\\\uA7F7-\\\\uA801\\\\uA803-\\\\uA805\\\\uA807-\\\\uA80A\\\\uA80C-\\\\uA822\\\\uA840-\\\\uA873\\\\uA882-\\\\uA8B3\\\\uA8F2-\\\\uA8F7\\\\uA8FB\\\\uA90A-\\\\uA925\\\\uA930-\\\\uA946\\\\uA960-\\\\uA97C\\\\uA984-\\\\uA9B2\\\\uA9CF\\\\uA9E0-\\\\uA9E4\\\\uA9E6-\\\\uA9EF\\\\uA9FA-\\\\uA9FE\\\\uAA00-\\\\uAA28\\\\uAA40-\\\\uAA42\\\\uAA44-\\\\uAA4B\\\\uAA60-\\\\uAA76\\\\uAA7A\\\\uAA7E-\\\\uAAAF\\\\uAAB1\\\\uAAB5\\\\uAAB6\\\\uAAB9-\\\\uAABD\\\\uAAC0\\\\uAAC2\\\\uAADB-\\\\uAADD\\\\uAAE0-\\\\uAAEA\\\\uAAF2-\\\\uAAF4\\\\uAB01-\\\\uAB06\\\\uAB09-\\\\uAB0E\\\\uAB11-\\\\uAB16\\\\uAB20-\\\\uAB26\\\\uAB28-\\\\uAB2E\\\\uAB30-\\\\uAB5A\\\\uAB5C-\\\\uAB5F\\\\uAB64\\\\uAB65\\\\uABC0-\\\\uABE2\\\\uAC00-\\\\uD7A3\\\\uD7B0-\\\\uD7C6\\\\uD7CB-\\\\uD7FB\\\\uF900-\\\\uFA6D\\\\uFA70-\\\\uFAD9\\\\uFB00-\\\\uFB06\\\\uFB13-\\\\uFB17\\\\uFB1D\\\\uFB1F-\\\\uFB28\\\\uFB2A-\\\\uFB36\\\\uFB38-\\\\uFB3C\\\\uFB3E\\\\uFB40\\\\uFB41\\\\uFB43\\\\uFB44\\\\uFB46-\\\\uFBB1\\\\uFBD3-\\\\uFD3D\\\\uFD50-\\\\uFD8F\\\\uFD92-\\\\uFDC7\\\\uFDF0-\\\\uFDFB\\\\uFE70-\\\\uFE74\\\\uFE76-\\\\uFEFC\\\\uFF21-\\\\uFF3A\\\\uFF41-\\\\uFF5A\\\\uFF66-\\\\uFFBE\\\\uFFC2-\\\\uFFC7\\\\uFFCA-\\\\uFFCF\\\\uFFD2-\\\\uFFD7\\\\uFFDA-\\\\uFFDC]');\n    }());\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/location', [\n        'kendo.drawing',\n        'util/main'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var math = Math, abs = math.abs, atan = math.atan, atan2 = math.atan2, cos = math.cos, max = math.max, min = math.min, sin = math.sin, tan = math.tan, kendo = window.kendo, Class = kendo.Class, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, util = kendo.drawing.util, defined = util.defined, deg = util.deg, rad = util.rad, round = util.round, valueOrDefault = util.valueOrDefault, sqr = kendo.util.sqr;\n        var Location = Class.extend({\n            init: function (lat, lng) {\n                if (arguments.length === 1) {\n                    this.lat = lat[0];\n                    this.lng = lat[1];\n                } else {\n                    this.lat = lat;\n                    this.lng = lng;\n                }\n            },\n            DISTANCE_ITERATIONS: 100,\n            DISTANCE_CONVERGENCE: 1e-12,\n            DISTANCE_PRECISION: 2,\n            FORMAT: '{0:N6},{1:N6}',\n            toArray: function () {\n                return [\n                    this.lat,\n                    this.lng\n                ];\n            },\n            equals: function (loc) {\n                return loc && loc.lat === this.lat && loc.lng === this.lng;\n            },\n            clone: function () {\n                return new Location(this.lat, this.lng);\n            },\n            round: function (precision) {\n                this.lng = round(this.lng, precision);\n                this.lat = round(this.lat, precision);\n                return this;\n            },\n            wrap: function () {\n                this.lng = this.lng % 180;\n                this.lat = this.lat % 90;\n                return this;\n            },\n            distanceTo: function (dest, datum) {\n                return this.greatCircleTo(dest, datum).distance;\n            },\n            destination: function (distance, bearing, datum) {\n                bearing = rad(bearing);\n                datum = datum || dataviz.map.datums.WGS84;\n                var fromLat = rad(this.lat);\n                var fromLng = rad(this.lng);\n                var dToR = distance / kendo.dataviz.map.datums.WGS84.a;\n                var lat = math.asin(sin(fromLat) * cos(dToR) + cos(fromLat) * sin(dToR) * cos(bearing));\n                var lng = fromLng + atan2(sin(bearing) * sin(dToR) * cos(fromLat), cos(dToR) - sin(fromLat) * sin(lat));\n                return new Location(deg(lat), deg(lng));\n            },\n            greatCircleTo: function (dest, datum) {\n                dest = Location.create(dest);\n                datum = datum || dataviz.map.datums.WGS84;\n                if (!dest || this.clone().round(8).equals(dest.clone().round(8))) {\n                    return {\n                        distance: 0,\n                        azimuthFrom: 0,\n                        azimuthTo: 0\n                    };\n                }\n                var a = datum.a;\n                var b = datum.b;\n                var f = datum.f;\n                var L = rad(dest.lng - this.lng);\n                var U1 = atan((1 - f) * tan(rad(this.lat)));\n                var sinU1 = sin(U1);\n                var cosU1 = cos(U1);\n                var U2 = atan((1 - f) * tan(rad(dest.lat)));\n                var sinU2 = sin(U2);\n                var cosU2 = cos(U2);\n                var lambda = L;\n                var prevLambda;\n                var i = this.DISTANCE_ITERATIONS;\n                var converged = false;\n                var sinLambda;\n                var cosLambda;\n                var sino;\n                var cosA2;\n                var coso;\n                var cos2om;\n                var sigma;\n                while (!converged && i-- > 0) {\n                    sinLambda = sin(lambda);\n                    cosLambda = cos(lambda);\n                    sino = math.sqrt(sqr(cosU2 * sinLambda) + sqr(cosU1 * sinU2 - sinU1 * cosU2 * cosLambda));\n                    coso = sinU1 * sinU2 + cosU1 * cosU2 * cosLambda;\n                    sigma = atan2(sino, coso);\n                    var sinA = cosU1 * cosU2 * sinLambda / sino;\n                    cosA2 = 1 - sqr(sinA);\n                    cos2om = 0;\n                    if (cosA2 !== 0) {\n                        cos2om = coso - 2 * sinU1 * sinU2 / cosA2;\n                    }\n                    prevLambda = lambda;\n                    var C = f / 16 * cosA2 * (4 + f * (4 - 3 * cosA2));\n                    lambda = L + (1 - C) * f * sinA * (sigma + C * sino * (cos2om + C * coso * (-1 + 2 * sqr(cos2om))));\n                    converged = abs(lambda - prevLambda) <= this.DISTANCE_CONVERGENCE;\n                }\n                var u2 = cosA2 * (sqr(a) - sqr(b)) / sqr(b);\n                var A = 1 + u2 / 16384 * (4096 + u2 * (-768 + u2 * (320 - 175 * u2)));\n                var B = u2 / 1024 * (256 + u2 * (-128 + u2 * (74 - 47 * u2)));\n                var deltao = B * sino * (cos2om + B / 4 * (coso * (-1 + 2 * sqr(cos2om)) - B / 6 * cos2om * (-3 + 4 * sqr(sino)) * (-3 + 4 * sqr(cos2om))));\n                var azimuthFrom = atan2(cosU2 * sinLambda, cosU1 * sinU2 - sinU1 * cosU2 * cosLambda);\n                var azimuthTo = atan2(cosU1 * sinLambda, -sinU1 * cosU2 + cosU1 * sinU2 * cosLambda);\n                return {\n                    distance: round(b * A * (sigma - deltao), this.DISTANCE_PRECISION),\n                    azimuthFrom: deg(azimuthFrom),\n                    azimuthTo: deg(azimuthTo)\n                };\n            }\n        });\n        Location.fn.toString = function () {\n            return kendo.format(this.FORMAT, this.lat, this.lng);\n        };\n        Location.fromLngLat = function (ll) {\n            return new Location(ll[1], ll[0]);\n        };\n        Location.fromLatLng = function (ll) {\n            return new Location(ll[0], ll[1]);\n        };\n        Location.create = function (a, b) {\n            if (defined(a)) {\n                if (a instanceof Location) {\n                    return a.clone();\n                } else if (arguments.length === 1 && a.length === 2) {\n                    return Location.fromLatLng(a);\n                } else {\n                    return new Location(a, b);\n                }\n            }\n        };\n        var Extent = Class.extend({\n            init: function (nw, se) {\n                nw = Location.create(nw);\n                se = Location.create(se);\n                if (nw.lng + 180 > se.lng + 180 && nw.lat + 90 < se.lat + 90) {\n                    this.se = nw;\n                    this.nw = se;\n                } else {\n                    this.se = se;\n                    this.nw = nw;\n                }\n            },\n            contains: function (loc) {\n                var nw = this.nw, se = this.se, lng = valueOrDefault(loc.lng, loc[1]), lat = valueOrDefault(loc.lat, loc[0]);\n                return loc && lng + 180 >= nw.lng + 180 && lng + 180 <= se.lng + 180 && lat + 90 >= se.lat + 90 && lat + 90 <= nw.lat + 90;\n            },\n            center: function () {\n                var nw = this.nw;\n                var se = this.se;\n                var lng = nw.lng + (se.lng - nw.lng) / 2;\n                var lat = nw.lat + (se.lat - nw.lat) / 2;\n                return new Location(lat, lng);\n            },\n            containsAny: function (locs) {\n                var result = false;\n                for (var i = 0; i < locs.length; i++) {\n                    result = result || this.contains(locs[i]);\n                }\n                return result;\n            },\n            include: function (loc) {\n                var nw = this.nw, se = this.se, lng = valueOrDefault(loc.lng, loc[1]), lat = valueOrDefault(loc.lat, loc[0]);\n                nw.lng = min(nw.lng, lng);\n                nw.lat = max(nw.lat, lat);\n                se.lng = max(se.lng, lng);\n                se.lat = min(se.lat, lat);\n            },\n            includeAll: function (locs) {\n                for (var i = 0; i < locs.length; i++) {\n                    this.include(locs[i]);\n                }\n            },\n            edges: function () {\n                var nw = this.nw, se = this.se;\n                return {\n                    nw: this.nw,\n                    ne: new Location(nw.lat, se.lng),\n                    se: this.se,\n                    sw: new Location(se.lat, nw.lng)\n                };\n            },\n            toArray: function () {\n                var nw = this.nw, se = this.se;\n                return [\n                    nw,\n                    new Location(nw.lat, se.lng),\n                    se,\n                    new Location(se.lat, nw.lng)\n                ];\n            },\n            overlaps: function (extent) {\n                return this.containsAny(extent.toArray()) || extent.containsAny(this.toArray());\n            }\n        });\n        Extent.World = new Extent([\n            90,\n            -180\n        ], [\n            -90,\n            180\n        ]);\n        Extent.create = function (a, b) {\n            if (a instanceof Extent) {\n                return a;\n            } else if (a && b) {\n                return new Extent(a, b);\n            } else if (a && a.length === 4 && !b) {\n                return new Extent([\n                    a[0],\n                    a[1]\n                ], [\n                    a[2],\n                    a[3]\n                ]);\n            }\n        };\n        deepExtend(dataviz, {\n            map: {\n                Extent: Extent,\n                Location: Location\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/attribution', ['kendo.drawing'], f);\n}(function () {\n    (function () {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, template = kendo.template, util = kendo.drawing.util, valueOrDefault = util.valueOrDefault, defined = util.defined;\n        var Attribution = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._initOptions(options);\n                this.items = [];\n                this.element.addClass('k-widget k-attribution');\n            },\n            options: {\n                name: 'Attribution',\n                separator: '&nbsp;|&nbsp;',\n                itemTemplate: '#= text #'\n            },\n            filter: function (extent, zoom) {\n                this._extent = extent;\n                this._zoom = zoom;\n                this._render();\n            },\n            add: function (item) {\n                if (defined(item)) {\n                    if (typeof item === 'string') {\n                        item = { text: item };\n                    }\n                    this.items.push(item);\n                    this._render();\n                }\n            },\n            remove: function (text) {\n                var result = [];\n                for (var i = 0; i < this.items.length; i++) {\n                    var item = this.items[i];\n                    if (item.text !== text) {\n                        result.push(item);\n                    }\n                }\n                this.items = result;\n                this._render();\n            },\n            clear: function () {\n                this.items = [];\n                this.element.empty();\n            },\n            _render: function () {\n                var result = [];\n                var itemTemplate = template(this.options.itemTemplate);\n                for (var i = 0; i < this.items.length; i++) {\n                    var item = this.items[i];\n                    var text = this._itemText(item);\n                    if (text !== '') {\n                        result.push(itemTemplate({ text: text }));\n                    }\n                }\n                if (result.length > 0) {\n                    this.element.empty().append(result.join(this.options.separator)).show();\n                } else {\n                    this.element.hide();\n                }\n            },\n            _itemText: function (item) {\n                var text = '';\n                var inZoomLevel = this._inZoomLevel(item.minZoom, item.maxZoom);\n                var inArea = this._inArea(item.extent);\n                if (inZoomLevel && inArea) {\n                    text += item.text;\n                }\n                return text;\n            },\n            _inZoomLevel: function (min, max) {\n                var result = true;\n                min = valueOrDefault(min, -Number.MAX_VALUE);\n                max = valueOrDefault(max, Number.MAX_VALUE);\n                result = this._zoom > min && this._zoom < max;\n                return result;\n            },\n            _inArea: function (area) {\n                var result = true;\n                if (area) {\n                    result = area.contains(this._extent);\n                }\n                return result;\n            }\n        });\n        kendo.dataviz.ui.plugin(Attribution);\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/navigator', ['kendo.core'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var Widget = kendo.ui.Widget;\n        var keys = kendo.keys;\n        var proxy = $.proxy;\n        var NS = '.kendoNavigator';\n        function button(dir) {\n            return kendo.format('<button class=\"k-button k-navigator-{0}\" aria-label=\"move {0}\">' + '<span class=\"k-icon k-i-arrow-60-{0}\"/>' + '</button>', dir);\n        }\n        var BUTTONS = button('up') + button('right') + button('down') + button('left');\n        var Navigator = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._initOptions(options);\n                this.element.addClass('k-widget k-header k-shadow k-navigator').append(BUTTONS).on('click' + NS, '.k-button', proxy(this, '_click'));\n                var parentElement = this.element.parent().closest('[' + kendo.attr('role') + ']');\n                this._keyroot = parentElement.length > 0 ? parentElement : this.element;\n                this._tabindex(this._keyroot);\n                this._keydown = proxy(this._keydown, this);\n                this._keyroot.on('keydown', this._keydown);\n            },\n            options: {\n                name: 'Navigator',\n                panStep: 1\n            },\n            events: ['pan'],\n            dispose: function () {\n                this._keyroot.off('keydown', this._keydown);\n            },\n            _pan: function (x, y) {\n                var panStep = this.options.panStep;\n                this.trigger('pan', {\n                    x: x * panStep,\n                    y: y * panStep\n                });\n            },\n            _click: function (e) {\n                var x = 0;\n                var y = 0;\n                var button = $(e.currentTarget);\n                if (button.is('.k-navigator-up')) {\n                    y = 1;\n                } else if (button.is('.k-navigator-down')) {\n                    y = -1;\n                } else if (button.is('.k-navigator-right')) {\n                    x = 1;\n                } else if (button.is('.k-navigator-left')) {\n                    x = -1;\n                }\n                this._pan(x, y);\n                e.preventDefault();\n            },\n            _keydown: function (e) {\n                switch (e.which) {\n                case keys.UP:\n                    this._pan(0, 1);\n                    e.preventDefault();\n                    break;\n                case keys.DOWN:\n                    this._pan(0, -1);\n                    e.preventDefault();\n                    break;\n                case keys.RIGHT:\n                    this._pan(1, 0);\n                    e.preventDefault();\n                    break;\n                case keys.LEFT:\n                    this._pan(-1, 0);\n                    e.preventDefault();\n                    break;\n                }\n            }\n        });\n        kendo.dataviz.ui.plugin(Navigator);\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/zoom', ['kendo.core'], f);\n}(function () {\n    (function ($) {\n        var kendo = window.kendo;\n        var Widget = kendo.ui.Widget;\n        var keys = kendo.keys;\n        var proxy = $.proxy;\n        function button(dir, iconClass) {\n            return kendo.format('<button class=\"k-button k-zoom-{0}\" title=\"zoom-{0}\" aria-label=\"zoom-{0}\"><span class=\"k-icon {1}\"></span></button>', dir, iconClass);\n        }\n        var NS = '.kendoZoomControl';\n        var BUTTONS = button('in', 'k-i-plus') + button('out', 'k-i-minus');\n        var PLUS = 187;\n        var MINUS = 189;\n        var FF_PLUS = 61;\n        var FF_MINUS = 173;\n        var ZoomControl = Widget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this._initOptions(options);\n                this.element.addClass('k-widget k-zoom-control k-button-wrap k-buttons-horizontal k-button-group k-group-horizontal').append(BUTTONS).on('click' + NS, '.k-button', proxy(this, '_click'));\n                var parentElement = this.element.parent().closest('[' + kendo.attr('role') + ']');\n                this._keyroot = parentElement.length > 0 ? parentElement : this.element;\n                this._tabindex(this._keyroot);\n                this._keydown = proxy(this._keydown, this);\n                this._keyroot.on('keydown', this._keydown);\n            },\n            options: {\n                name: 'ZoomControl',\n                zoomStep: 1\n            },\n            events: ['change'],\n            _change: function (dir) {\n                var zoomStep = this.options.zoomStep;\n                this.trigger('change', { delta: dir * zoomStep });\n            },\n            _click: function (e) {\n                var button = $(e.currentTarget);\n                var dir = 1;\n                if (button.is('.k-zoom-out')) {\n                    dir = -1;\n                }\n                this._change(dir);\n                e.preventDefault();\n            },\n            _keydown: function (e) {\n                switch (e.which) {\n                case keys.NUMPAD_PLUS:\n                case PLUS:\n                case FF_PLUS:\n                    this._change(1);\n                    break;\n                case keys.NUMPAD_MINUS:\n                case MINUS:\n                case FF_MINUS:\n                    this._change(-1);\n                    break;\n                }\n            }\n        });\n        kendo.dataviz.ui.plugin(ZoomControl);\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/crs', [\n        'dataviz/map/location',\n        'kendo.drawing'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var math = Math, atan = math.atan, exp = math.exp, pow = math.pow, sin = math.sin, log = math.log, tan = math.tan, kendo = window.kendo, Class = kendo.Class, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, g = kendo.geometry, Point = g.Point, map = dataviz.map, Location = map.Location, util = kendo.drawing.util, rad = util.rad, deg = util.deg, limit = util.limitValue;\n        var PI = math.PI, PI_DIV_2 = PI / 2, PI_DIV_4 = PI / 4, DEG_TO_RAD = PI / 180;\n        var WGS84 = {\n            a: 6378137,\n            b: 6356752.314245179,\n            f: 0.0033528106647474805,\n            e: 0.08181919084262149\n        };\n        var Mercator = Class.extend({\n            init: function (options) {\n                this._initOptions(options);\n            },\n            MAX_LNG: 180,\n            MAX_LAT: 85.0840590501,\n            INVERSE_ITERATIONS: 15,\n            INVERSE_CONVERGENCE: 1e-12,\n            options: {\n                centralMeridian: 0,\n                datum: WGS84\n            },\n            forward: function (loc, clamp) {\n                var proj = this, options = proj.options, datum = options.datum, r = datum.a, lng0 = options.centralMeridian, lat = limit(loc.lat, -proj.MAX_LAT, proj.MAX_LAT), lng = clamp ? limit(loc.lng, -proj.MAX_LNG, proj.MAX_LNG) : loc.lng, x = rad(lng - lng0) * r, y = proj._projectLat(lat);\n                return new Point(x, y);\n            },\n            _projectLat: function (lat) {\n                var datum = this.options.datum, ecc = datum.e, r = datum.a, y = rad(lat), ts = tan(PI_DIV_4 + y / 2), con = ecc * sin(y), p = pow((1 - con) / (1 + con), ecc / 2);\n                return r * log(ts * p);\n            },\n            inverse: function (point, clamp) {\n                var proj = this, options = proj.options, datum = options.datum, r = datum.a, lng0 = options.centralMeridian, lng = point.x / (DEG_TO_RAD * r) + lng0, lat = limit(proj._inverseY(point.y), -proj.MAX_LAT, proj.MAX_LAT);\n                if (clamp) {\n                    lng = limit(lng, -proj.MAX_LNG, proj.MAX_LNG);\n                }\n                return new Location(lat, lng);\n            },\n            _inverseY: function (y) {\n                var proj = this, datum = proj.options.datum, r = datum.a, ecc = datum.e, ecch = ecc / 2, ts = exp(-y / r), phi = PI_DIV_2 - 2 * atan(ts), i;\n                for (i = 0; i <= proj.INVERSE_ITERATIONS; i++) {\n                    var con = ecc * sin(phi), p = pow((1 - con) / (1 + con), ecch), dphi = PI_DIV_2 - 2 * atan(ts * p) - phi;\n                    phi += dphi;\n                    if (math.abs(dphi) <= proj.INVERSE_CONVERGENCE) {\n                        break;\n                    }\n                }\n                return deg(phi);\n            }\n        });\n        var SphericalMercator = Mercator.extend({\n            MAX_LAT: 85.0511287798,\n            _projectLat: function (lat) {\n                var r = this.options.datum.a, y = rad(lat), ts = tan(PI_DIV_4 + y / 2);\n                return r * log(ts);\n            },\n            _inverseY: function (y) {\n                var r = this.options.datum.a, ts = exp(-y / r);\n                return deg(PI_DIV_2 - 2 * atan(ts));\n            }\n        });\n        var Equirectangular = Class.extend({\n            forward: function (loc) {\n                return new Point(loc.lng, loc.lat);\n            },\n            inverse: function (point) {\n                return new Location(point.y, point.x);\n            }\n        });\n        var EPSG3857 = Class.extend({\n            init: function () {\n                var crs = this, proj = crs._proj = new SphericalMercator();\n                var c = this.c = 2 * PI * proj.options.datum.a;\n                this._tm = g.transform().translate(0.5, 0.5).scale(1 / c, -1 / c);\n                this._itm = g.transform().scale(c, -c).translate(-0.5, -0.5);\n            },\n            toPoint: function (loc, scale, clamp) {\n                var point = this._proj.forward(loc, clamp);\n                return point.transform(this._tm).scale(scale || 1);\n            },\n            toLocation: function (point, scale, clamp) {\n                point = point.clone().scale(1 / (scale || 1)).transform(this._itm);\n                return this._proj.inverse(point, clamp);\n            }\n        });\n        var EPSG3395 = Class.extend({\n            init: function () {\n                this._proj = new Mercator();\n            },\n            toPoint: function (loc) {\n                return this._proj.forward(loc);\n            },\n            toLocation: function (point) {\n                return this._proj.inverse(point);\n            }\n        });\n        var EPSG4326 = Class.extend({\n            init: function () {\n                this._proj = new Equirectangular();\n            },\n            toPoint: function (loc) {\n                return this._proj.forward(loc);\n            },\n            toLocation: function (point) {\n                return this._proj.inverse(point);\n            }\n        });\n        deepExtend(dataviz, {\n            map: {\n                crs: {\n                    EPSG3395: EPSG3395,\n                    EPSG3857: EPSG3857,\n                    EPSG4326: EPSG4326\n                },\n                datums: { WGS84: WGS84 },\n                projections: {\n                    Equirectangular: Equirectangular,\n                    Mercator: Mercator,\n                    SphericalMercator: SphericalMercator\n                }\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/layers/base', [\n        'kendo.core',\n        'dataviz/map/location'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var proxy = $.proxy, kendo = window.kendo, Class = kendo.Class, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, Extent = dataviz.map.Extent, util = kendo.drawing.util, defined = util.defined;\n        var Layer = Class.extend({\n            init: function (map, options) {\n                this._initOptions(options);\n                this.map = map;\n                this.element = $('<div class=\\'k-layer\\'></div>').css({\n                    'zIndex': this.options.zIndex,\n                    'opacity': this.options.opacity\n                }).appendTo(map.scrollElement);\n                this._beforeReset = proxy(this._beforeReset, this);\n                this._reset = proxy(this._reset, this);\n                this._resize = proxy(this._resize, this);\n                this._panEnd = proxy(this._panEnd, this);\n                this._activate();\n                this._updateAttribution();\n            },\n            destroy: function () {\n                this._deactivate();\n            },\n            show: function () {\n                this.reset();\n                this._activate();\n                this._applyExtent(true);\n            },\n            hide: function () {\n                this._deactivate();\n                this._setVisibility(false);\n            },\n            reset: function () {\n                this._beforeReset();\n                this._reset();\n            },\n            _reset: function () {\n                this._applyExtent();\n            },\n            _beforeReset: $.noop,\n            _resize: $.noop,\n            _panEnd: function () {\n                this._applyExtent();\n            },\n            _applyExtent: function () {\n                var options = this.options;\n                var zoom = this.map.zoom();\n                var matchMinZoom = !defined(options.minZoom) || zoom >= options.minZoom;\n                var matchMaxZoom = !defined(options.maxZoom) || zoom <= options.maxZoom;\n                var extent = Extent.create(options.extent);\n                var inside = !extent || extent.overlaps(this.map.extent());\n                this._setVisibility(matchMinZoom && matchMaxZoom && inside);\n            },\n            _setVisibility: function (visible) {\n                this.element.css('display', visible ? '' : 'none');\n            },\n            _activate: function () {\n                var map = this.map;\n                map.bind('beforeReset', this._beforeReset);\n                map.bind('reset', this._reset);\n                map.bind('resize', this._resize);\n                map.bind('panEnd', this._panEnd);\n            },\n            _deactivate: function () {\n                var map = this.map;\n                map.unbind('beforeReset', this._beforeReset);\n                map.unbind('reset', this._reset);\n                map.unbind('resize', this._resize);\n                map.unbind('panEnd', this._panEnd);\n            },\n            _updateAttribution: function () {\n                var attr = this.map.attribution;\n                if (attr) {\n                    attr.add(this.options.attribution);\n                }\n            }\n        });\n        deepExtend(dataviz, { map: { layers: { Layer: Layer } } });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/layers/shape', [\n        'dataviz/map/layers/base',\n        'dataviz/map/location'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var proxy = $.proxy, kendo = window.kendo, Class = kendo.Class, DataSource = kendo.data.DataSource, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, g = kendo.geometry, d = kendo.drawing, Group = d.Group, last = d.util.last, defined = d.util.defined, map = dataviz.map, Location = map.Location, Layer = map.layers.Layer;\n        var ShapeLayer = Layer.extend({\n            init: function (map, options) {\n                this._pan = proxy(this._pan, this);\n                Layer.fn.init.call(this, map, options);\n                this.surface = d.Surface.create(this.element, {\n                    width: map.scrollElement.width(),\n                    height: map.scrollElement.height()\n                });\n                this._initRoot();\n                this.movable = new kendo.ui.Movable(this.surface.element);\n                this._markers = [];\n                this._click = this._handler('shapeClick');\n                this.surface.bind('click', this._click);\n                this._mouseenter = this._handler('shapeMouseEnter');\n                this.surface.bind('mouseenter', this._mouseenter);\n                this._mouseleave = this._handler('shapeMouseLeave');\n                this.surface.bind('mouseleave', this._mouseleave);\n                this._initDataSource();\n            },\n            options: { autoBind: true },\n            destroy: function () {\n                Layer.fn.destroy.call(this);\n                this.surface.destroy();\n                this.dataSource.unbind('change', this._dataChange);\n            },\n            setDataSource: function (dataSource) {\n                if (this.dataSource) {\n                    this.dataSource.unbind('change', this._dataChange);\n                }\n                this.dataSource = kendo.data.DataSource.create(dataSource);\n                this.dataSource.bind('change', this._dataChange);\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            _reset: function () {\n                Layer.fn._reset.call(this);\n                this._translateSurface();\n                if (this._data) {\n                    this._load(this._data);\n                }\n            },\n            _initRoot: function () {\n                this._root = new Group();\n                this.surface.draw(this._root);\n            },\n            _beforeReset: function () {\n                this.surface.clear();\n                this._initRoot();\n            },\n            _resize: function () {\n                this.surface.size(this.map.size());\n            },\n            _initDataSource: function () {\n                var dsOptions = this.options.dataSource;\n                this._dataChange = proxy(this._dataChange, this);\n                this.dataSource = DataSource.create(dsOptions).bind('change', this._dataChange);\n                if (dsOptions && this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            _dataChange: function (e) {\n                this._data = e.sender.view();\n                this._load(this._data);\n            },\n            _load: function (data) {\n                this._clearMarkers();\n                if (!this._loader) {\n                    this._loader = new GeoJSONLoader(this.map, this.options.style, this);\n                }\n                var container = new Group();\n                for (var i = 0; i < data.length; i++) {\n                    var shape = this._loader.parse(data[i]);\n                    if (shape) {\n                        container.append(shape);\n                    }\n                }\n                this._root.clear();\n                this._root.append(container);\n            },\n            shapeCreated: function (shape) {\n                var cancelled = false;\n                if (shape instanceof d.Circle) {\n                    cancelled = defined(this._createMarker(shape));\n                }\n                if (!cancelled) {\n                    var args = {\n                        layer: this,\n                        shape: shape\n                    };\n                    cancelled = this.map.trigger('shapeCreated', args);\n                }\n                return cancelled;\n            },\n            featureCreated: function (e) {\n                e.layer = this;\n                this.map.trigger('shapeFeatureCreated', e);\n            },\n            _createMarker: function (shape) {\n                var marker = this.map.markers.bind({ location: shape.location }, shape.dataItem);\n                if (marker) {\n                    this._markers.push(marker);\n                }\n                return marker;\n            },\n            _clearMarkers: function () {\n                for (var i = 0; i < this._markers.length; i++) {\n                    this.map.markers.remove(this._markers[i]);\n                }\n                this._markers = [];\n            },\n            _pan: function () {\n                if (!this._panning) {\n                    this._panning = true;\n                    this.surface.suspendTracking();\n                }\n            },\n            _panEnd: function (e) {\n                Layer.fn._panEnd.call(this, e);\n                this._translateSurface();\n                this.surface.resumeTracking();\n                this._panning = false;\n            },\n            _translateSurface: function () {\n                var map = this.map;\n                var nw = map.locationToView(map.extent().nw);\n                if (this.surface.translate) {\n                    this.surface.translate(nw);\n                    this.movable.moveTo({\n                        x: nw.x,\n                        y: nw.y\n                    });\n                }\n            },\n            _handler: function (event) {\n                var layer = this;\n                return function (e) {\n                    if (e.element) {\n                        var args = {\n                            layer: layer,\n                            shape: e.element,\n                            originalEvent: e.originalEvent\n                        };\n                        layer.map.trigger(event, args);\n                    }\n                };\n            },\n            _activate: function () {\n                Layer.fn._activate.call(this);\n                this.map.bind('pan', this._pan);\n            },\n            _deactivate: function () {\n                Layer.fn._deactivate.call(this);\n                this.map.unbind('pan', this._pan);\n            }\n        });\n        var GeoJSONLoader = Class.extend({\n            init: function (locator, defaultStyle, observer) {\n                this.observer = observer;\n                this.locator = locator;\n                this.style = defaultStyle;\n            },\n            parse: function (item) {\n                var root = new Group();\n                var unwrap = true;\n                if (item.type === 'Feature') {\n                    unwrap = false;\n                    this._loadGeometryTo(root, item.geometry, item);\n                    this._featureCreated(root, item);\n                } else {\n                    this._loadGeometryTo(root, item, item);\n                }\n                if (unwrap && root.children.length < 2) {\n                    root = root.children[0];\n                }\n                return root;\n            },\n            _shapeCreated: function (shape) {\n                var cancelled = false;\n                if (this.observer && this.observer.shapeCreated) {\n                    cancelled = this.observer.shapeCreated(shape);\n                }\n                return cancelled;\n            },\n            _featureCreated: function (group, dataItem) {\n                if (this.observer && this.observer.featureCreated) {\n                    this.observer.featureCreated({\n                        group: group,\n                        dataItem: dataItem,\n                        properties: dataItem.properties\n                    });\n                }\n            },\n            _loadGeometryTo: function (container, geometry, dataItem) {\n                var coords = geometry.coordinates;\n                var i;\n                var path;\n                switch (geometry.type) {\n                case 'LineString':\n                    path = this._loadPolygon(container, [coords], dataItem);\n                    this._setLineFill(path);\n                    break;\n                case 'MultiLineString':\n                    for (i = 0; i < coords.length; i++) {\n                        path = this._loadPolygon(container, [coords[i]], dataItem);\n                        this._setLineFill(path);\n                    }\n                    break;\n                case 'Polygon':\n                    this._loadPolygon(container, coords, dataItem);\n                    break;\n                case 'MultiPolygon':\n                    for (i = 0; i < coords.length; i++) {\n                        this._loadPolygon(container, coords[i], dataItem);\n                    }\n                    break;\n                case 'Point':\n                    this._loadPoint(container, coords, dataItem);\n                    break;\n                case 'MultiPoint':\n                    for (i = 0; i < coords.length; i++) {\n                        this._loadPoint(container, coords[i], dataItem);\n                    }\n                    break;\n                }\n            },\n            _setLineFill: function (path) {\n                var segments = path.segments;\n                if (segments.length < 4 || !segments[0].anchor().equals(last(segments).anchor())) {\n                    path.options.fill = null;\n                }\n            },\n            _loadShape: function (container, shape) {\n                if (!this._shapeCreated(shape)) {\n                    container.append(shape);\n                }\n                return shape;\n            },\n            _loadPolygon: function (container, rings, dataItem) {\n                var shape = this._buildPolygon(rings);\n                shape.dataItem = dataItem;\n                return this._loadShape(container, shape);\n            },\n            _buildPolygon: function (rings) {\n                var type = rings.length > 1 ? d.MultiPath : d.Path;\n                var path = new type(this.style);\n                for (var i = 0; i < rings.length; i++) {\n                    for (var j = 0; j < rings[i].length; j++) {\n                        var point = this.locator.locationToView(Location.fromLngLat(rings[i][j]));\n                        if (j === 0) {\n                            path.moveTo(point.x, point.y);\n                        } else {\n                            path.lineTo(point.x, point.y);\n                        }\n                    }\n                }\n                return path;\n            },\n            _loadPoint: function (container, coords, dataItem) {\n                var location = Location.fromLngLat(coords);\n                var point = this.locator.locationToView(location);\n                var circle = new g.Circle(point, 10);\n                var shape = new d.Circle(circle, this.style);\n                shape.dataItem = dataItem;\n                shape.location = location;\n                return this._loadShape(container, shape);\n            }\n        });\n        deepExtend(kendo.data, {\n            schemas: {\n                geojson: {\n                    type: 'json',\n                    data: function (data) {\n                        if (data.type === 'FeatureCollection') {\n                            return data.features;\n                        }\n                        if (data.type === 'GeometryCollection') {\n                            return data.geometries;\n                        }\n                        return data;\n                    }\n                }\n            },\n            transports: { geojson: { read: { dataType: 'json' } } }\n        });\n        deepExtend(dataviz, {\n            map: {\n                layers: {\n                    shape: ShapeLayer,\n                    ShapeLayer: ShapeLayer\n                },\n                GeoJSONLoader: GeoJSONLoader\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/layers/bubble', ['dataviz/map/layers/shape'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, getter = kendo.getter, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, g = kendo.geometry, d = kendo.drawing, util = d.util, defined = util.defined, map = dataviz.map, Location = map.Location, ShapeLayer = map.layers.ShapeLayer;\n        var BubbleLayer = ShapeLayer.extend({\n            options: {\n                autoBind: true,\n                locationField: 'location',\n                valueField: 'value',\n                minSize: 0,\n                maxSize: 100,\n                scale: 'sqrt',\n                symbol: 'circle'\n            },\n            _load: function (data) {\n                this.surface.clear();\n                if (data.length === 0) {\n                    return;\n                }\n                var opt = this.options;\n                var getValue = getter(opt.valueField);\n                data = data.slice(0);\n                data.sort(function (a, b) {\n                    return getValue(b) - getValue(a);\n                });\n                var scaleType = this._scaleType();\n                var scale;\n                for (var i = 0; i < data.length; i++) {\n                    var dataItem = data[i];\n                    var location = getter(opt.locationField)(dataItem);\n                    var value = getter(opt.valueField)(dataItem);\n                    if (defined(location) && defined(value)) {\n                        if (!scale) {\n                            scale = new scaleType([\n                                0,\n                                value\n                            ], [\n                                opt.minSize,\n                                opt.maxSize\n                            ]);\n                        }\n                        location = Location.create(location);\n                        var center = this.map.locationToView(location);\n                        var size = scale.map(value);\n                        var symbol = this._createSymbol({\n                            center: center,\n                            size: size,\n                            style: opt.style,\n                            dataItem: dataItem,\n                            location: location\n                        });\n                        symbol.dataItem = dataItem;\n                        symbol.location = location;\n                        symbol.value = value;\n                        this._drawSymbol(symbol);\n                    }\n                }\n            },\n            _scaleType: function () {\n                var scale = this.options.scale;\n                if (kendo.isFunction(scale)) {\n                    return scale;\n                }\n                return dataviz.map.scales[scale];\n            },\n            _createSymbol: function (args) {\n                var symbol = this.options.symbol;\n                if (!kendo.isFunction(symbol)) {\n                    symbol = dataviz.map.symbols[symbol];\n                }\n                return symbol(args);\n            },\n            _drawSymbol: function (shape) {\n                var args = {\n                    layer: this,\n                    shape: shape\n                };\n                var cancelled = this.map.trigger('shapeCreated', args);\n                if (!cancelled) {\n                    this.surface.draw(shape);\n                }\n            }\n        });\n        var SqrtScale = kendo.Class.extend({\n            init: function (domain, range) {\n                this._domain = domain;\n                this._range = range;\n                var domainRange = Math.sqrt(domain[1]) - Math.sqrt(domain[0]);\n                var outputRange = range[1] - range[0];\n                this._ratio = outputRange / domainRange;\n            },\n            map: function (value) {\n                var rel = (Math.sqrt(value) - Math.sqrt(this._domain[0])) * this._ratio;\n                return this._range[0] + rel;\n            }\n        });\n        var Symbols = {\n            circle: function (args) {\n                var geo = new g.Circle(args.center, args.size / 2);\n                return new d.Circle(geo, args.style);\n            },\n            square: function (args) {\n                var path = new d.Path(args.style);\n                var halfSize = args.size / 2;\n                var center = args.center;\n                path.moveTo(center.x - halfSize, center.y - halfSize).lineTo(center.x + halfSize, center.y - halfSize).lineTo(center.x + halfSize, center.y + halfSize).lineTo(center.x - halfSize, center.y + halfSize).close();\n                return path;\n            }\n        };\n        deepExtend(dataviz, {\n            map: {\n                layers: {\n                    bubble: BubbleLayer,\n                    BubbleLayer: BubbleLayer\n                },\n                scales: { sqrt: SqrtScale },\n                symbols: Symbols\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/layers/tile', [\n        'dataviz/map/layers/base',\n        'dataviz/map/location'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var math = Math, proxy = $.proxy, kendo = window.kendo, Class = kendo.Class, template = kendo.template, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, g = kendo.geometry, Point = g.Point, Layer = dataviz.map.layers.Layer, util = kendo.util, renderSize = util.renderSize, drawingUtil = kendo.drawing.util, round = drawingUtil.round, limit = drawingUtil.limitValue;\n        var TileLayer = Layer.extend({\n            init: function (map, options) {\n                Layer.fn.init.call(this, map, options);\n                if (typeof this.options.subdomains === 'string') {\n                    this.options.subdomains = this.options.subdomains.split('');\n                }\n                var viewType = this._viewType();\n                this._view = new viewType(this.element, this.options);\n            },\n            destroy: function () {\n                Layer.fn.destroy.call(this);\n                this._view.destroy();\n                this._view = null;\n            },\n            _beforeReset: function () {\n                var map = this.map;\n                var origin = map.locationToLayer(map.extent().nw).round();\n                this._view.viewOrigin(origin);\n            },\n            _reset: function () {\n                Layer.fn._reset.call(this);\n                this._updateView();\n                this._view.reset();\n            },\n            _viewType: function () {\n                return TileView;\n            },\n            _activate: function () {\n                Layer.fn._activate.call(this);\n                if (!kendo.support.mobileOS) {\n                    if (!this._pan) {\n                        this._pan = kendo.throttle(proxy(this._render, this), 100);\n                    }\n                    this.map.bind('pan', this._pan);\n                }\n            },\n            _deactivate: function () {\n                Layer.fn._deactivate.call(this);\n                if (this._pan) {\n                    this.map.unbind('pan', this._pan);\n                }\n            },\n            _updateView: function () {\n                var view = this._view, map = this.map, extent = map.extent(), extentToPoint = {\n                        nw: map.locationToLayer(extent.nw).round(),\n                        se: map.locationToLayer(extent.se).round()\n                    };\n                view.center(map.locationToLayer(map.center()));\n                view.extent(extentToPoint);\n                view.zoom(map.zoom());\n            },\n            _resize: function () {\n                this._render();\n            },\n            _panEnd: function (e) {\n                Layer.fn._panEnd.call(this, e);\n                this._render();\n            },\n            _render: function () {\n                this._updateView();\n                this._view.render();\n            }\n        });\n        var TileView = Class.extend({\n            init: function (element, options) {\n                this.element = element;\n                this._initOptions(options);\n                this.pool = new TilePool();\n            },\n            options: {\n                tileSize: 256,\n                subdomains: [\n                    'a',\n                    'b',\n                    'c'\n                ],\n                urlTemplate: ''\n            },\n            center: function (center) {\n                this._center = center;\n            },\n            extent: function (extent) {\n                this._extent = extent;\n            },\n            viewOrigin: function (origin) {\n                this._viewOrigin = origin;\n            },\n            zoom: function (zoom) {\n                this._zoom = zoom;\n            },\n            pointToTileIndex: function (point) {\n                return new Point(math.floor(point.x / this.options.tileSize), math.floor(point.y / this.options.tileSize));\n            },\n            tileCount: function () {\n                var size = this.size(), firstTileIndex = this.pointToTileIndex(this._extent.nw), nw = this._extent.nw, point = this.indexToPoint(firstTileIndex).translate(-nw.x, -nw.y);\n                return {\n                    x: math.ceil((math.abs(point.x) + size.width) / this.options.tileSize),\n                    y: math.ceil((math.abs(point.y) + size.height) / this.options.tileSize)\n                };\n            },\n            size: function () {\n                var nw = this._extent.nw, se = this._extent.se, diff = se.clone().translate(-nw.x, -nw.y);\n                return {\n                    width: diff.x,\n                    height: diff.y\n                };\n            },\n            indexToPoint: function (index) {\n                var x = index.x, y = index.y;\n                return new Point(x * this.options.tileSize, y * this.options.tileSize);\n            },\n            subdomainText: function () {\n                var subdomains = this.options.subdomains;\n                return subdomains[this.subdomainIndex++ % subdomains.length];\n            },\n            destroy: function () {\n                this.element.empty();\n                this.pool.empty();\n            },\n            reset: function () {\n                this.pool.reset();\n                this.subdomainIndex = 0;\n                this.render();\n            },\n            render: function () {\n                var size = this.tileCount(), firstTileIndex = this.pointToTileIndex(this._extent.nw), tile, x, y;\n                for (x = 0; x < size.x; x++) {\n                    for (y = 0; y < size.y; y++) {\n                        tile = this.createTile({\n                            x: firstTileIndex.x + x,\n                            y: firstTileIndex.y + y\n                        });\n                        if (!tile.visible) {\n                            tile.show();\n                        }\n                    }\n                }\n            },\n            createTile: function (currentIndex) {\n                var options = this.tileOptions(currentIndex);\n                var tile = this.pool.get(this._center, options);\n                if (tile.element.parent().length === 0) {\n                    this.element.append(tile.element);\n                }\n                return tile;\n            },\n            tileOptions: function (currentIndex) {\n                var index = this.wrapIndex(currentIndex), point = this.indexToPoint(currentIndex), origin = this._viewOrigin, offset = point.clone().translate(-origin.x, -origin.y);\n                return {\n                    index: index,\n                    currentIndex: currentIndex,\n                    point: point,\n                    offset: roundPoint(offset),\n                    zoom: this._zoom,\n                    size: this.options.tileSize,\n                    subdomain: this.subdomainText(),\n                    urlTemplate: this.options.urlTemplate,\n                    errorUrlTemplate: this.options.errorUrlTemplate\n                };\n            },\n            wrapIndex: function (index) {\n                var boundary = math.pow(2, this._zoom);\n                return {\n                    x: this.wrapValue(index.x, boundary),\n                    y: limit(index.y, 0, boundary - 1)\n                };\n            },\n            wrapValue: function (value, boundary) {\n                var remainder = math.abs(value) % boundary;\n                if (value >= 0) {\n                    value = remainder;\n                } else {\n                    value = boundary - (remainder === 0 ? boundary : remainder);\n                }\n                return value;\n            }\n        });\n        var ImageTile = Class.extend({\n            init: function (id, options) {\n                this.id = id;\n                this.visible = true;\n                this._initOptions(options);\n                this.createElement();\n                this.show();\n            },\n            options: {\n                urlTemplate: '',\n                errorUrlTemplate: ''\n            },\n            createElement: function () {\n                this.element = $('<img style=\\'position: absolute; display: block;\\' alt=\\'\\' />').css({\n                    width: this.options.size,\n                    height: this.options.size\n                }).on('error', proxy(function (e) {\n                    if (this.errorUrl()) {\n                        e.target.setAttribute('src', this.errorUrl());\n                    } else {\n                        e.target.removeAttribute('src');\n                    }\n                }, this));\n            },\n            show: function () {\n                var element = this.element[0];\n                element.style.top = renderSize(this.options.offset.y);\n                element.style.left = renderSize(this.options.offset.x);\n                var url = this.url();\n                if (url) {\n                    element.setAttribute('src', url);\n                }\n                element.style.visibility = 'visible';\n                this.visible = true;\n            },\n            hide: function () {\n                this.element[0].style.visibility = 'hidden';\n                this.visible = false;\n            },\n            url: function () {\n                var urlResult = template(this.options.urlTemplate);\n                return urlResult(this.urlOptions());\n            },\n            errorUrl: function () {\n                var urlResult = template(this.options.errorUrlTemplate);\n                return urlResult(this.urlOptions());\n            },\n            urlOptions: function () {\n                var options = this.options;\n                return {\n                    zoom: options.zoom,\n                    subdomain: options.subdomain,\n                    z: options.zoom,\n                    x: options.index.x,\n                    y: options.index.y,\n                    s: options.subdomain,\n                    quadkey: options.quadkey,\n                    q: options.quadkey,\n                    culture: options.culture,\n                    c: options.culture\n                };\n            },\n            destroy: function () {\n                if (this.element) {\n                    this.element.remove();\n                    this.element = null;\n                }\n            }\n        });\n        var TilePool = Class.extend({\n            init: function () {\n                this._items = [];\n            },\n            options: { maxSize: 100 },\n            get: function (center, options) {\n                if (this._items.length >= this.options.maxSize) {\n                    this._remove(center);\n                }\n                return this._create(options);\n            },\n            empty: function () {\n                var items = this._items;\n                for (var i = 0; i < items.length; i++) {\n                    items[i].destroy();\n                }\n                this._items = [];\n            },\n            reset: function () {\n                var items = this._items;\n                for (var i = 0; i < items.length; i++) {\n                    items[i].hide();\n                }\n            },\n            _create: function (options) {\n                var items = this._items;\n                var tile;\n                var id = util.hashKey(options.point.toString() + options.offset.toString() + options.zoom + options.urlTemplate);\n                for (var i = 0; i < items.length; i++) {\n                    if (items[i].id === id) {\n                        tile = items[i];\n                        break;\n                    }\n                }\n                if (tile) {\n                    tile.show();\n                } else {\n                    tile = new ImageTile(id, options);\n                    this._items.push(tile);\n                }\n                return tile;\n            },\n            _remove: function (center) {\n                var items = this._items;\n                var maxDist = -1;\n                var index = -1;\n                for (var i = 0; i < items.length; i++) {\n                    var dist = items[i].options.point.distanceTo(center);\n                    if (dist > maxDist && !items[i].visible) {\n                        index = i;\n                        maxDist = dist;\n                    }\n                }\n                if (index !== -1) {\n                    items[index].destroy();\n                    items.splice(index, 1);\n                }\n            }\n        });\n        function roundPoint(point) {\n            return new Point(round(point.x), round(point.y));\n        }\n        deepExtend(dataviz, {\n            map: {\n                layers: {\n                    tile: TileLayer,\n                    TileLayer: TileLayer,\n                    ImageTile: ImageTile,\n                    TilePool: TilePool,\n                    TileView: TileView\n                }\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/layers/bing', ['dataviz/map/layers/tile'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, defined = kendo.drawing.util.defined, Extent = dataviz.map.Extent, Location = dataviz.map.Location, TileLayer = dataviz.map.layers.TileLayer, TileView = dataviz.map.layers.TileView;\n        var BingLayer = TileLayer.extend({\n            init: function (map, options) {\n                this.options.baseUrl = this._scheme() + '://dev.virtualearth.net/REST/v1/Imagery/Metadata/';\n                TileLayer.fn.init.call(this, map, options);\n                this._onMetadata = $.proxy(this._onMetadata, this);\n                this._fetchMetadata();\n            },\n            options: { imagerySet: 'road' },\n            _fetchMetadata: function () {\n                var options = this.options;\n                if (!options.key) {\n                    throw new Error('Bing tile layer: API key is required');\n                }\n                $.ajax({\n                    url: options.baseUrl + options.imagerySet,\n                    data: {\n                        output: 'json',\n                        include: 'ImageryProviders',\n                        key: options.key,\n                        uriScheme: this._scheme()\n                    },\n                    type: 'get',\n                    dataType: 'jsonp',\n                    jsonp: 'jsonp',\n                    success: this._onMetadata\n                });\n            },\n            _scheme: function (proto) {\n                proto = proto || window.location.protocol;\n                return proto.replace(':', '') === 'https' ? 'https' : 'http';\n            },\n            _onMetadata: function (data) {\n                if (data && data.resourceSets.length) {\n                    var resource = this.resource = data.resourceSets[0].resources[0];\n                    deepExtend(this._view.options, {\n                        urlTemplate: resource.imageUrl.replace('{subdomain}', '#= subdomain #').replace('{quadkey}', '#= quadkey #').replace('{culture}', '#= culture #'),\n                        subdomains: resource.imageUrlSubdomains\n                    });\n                    var options = this.options;\n                    if (!defined(options.minZoom)) {\n                        options.minZoom = resource.zoomMin;\n                    }\n                    if (!defined(options.maxZoom)) {\n                        options.maxZoom = resource.zoomMax;\n                    }\n                    this._addAttribution();\n                    if (this.element.css('display') !== 'none') {\n                        this._reset();\n                    }\n                }\n            },\n            _viewType: function () {\n                return BingView;\n            },\n            _addAttribution: function () {\n                var attr = this.map.attribution;\n                if (attr) {\n                    var items = this.resource.imageryProviders;\n                    if (items) {\n                        for (var i = 0; i < items.length; i++) {\n                            var item = items[i];\n                            for (var y = 0; y < item.coverageAreas.length; y++) {\n                                var area = item.coverageAreas[y];\n                                attr.add({\n                                    text: item.attribution,\n                                    minZoom: area.zoomMin,\n                                    maxZoom: area.zoomMax,\n                                    extent: new Extent(new Location(area.bbox[2], area.bbox[1]), new Location(area.bbox[0], area.bbox[3]))\n                                });\n                            }\n                        }\n                    }\n                }\n            },\n            imagerySet: function (value) {\n                if (value) {\n                    this.options.imagerySet = value;\n                    this.map.attribution.clear();\n                    this._fetchMetadata();\n                } else {\n                    return this.options.imagerySet;\n                }\n            }\n        });\n        var BingView = TileView.extend({\n            options: { culture: 'en-US' },\n            tileOptions: function (currentIndex) {\n                var options = TileView.fn.tileOptions.call(this, currentIndex);\n                options.culture = this.options.culture;\n                options.quadkey = this.tileQuadKey(this.wrapIndex(currentIndex));\n                return options;\n            },\n            tileQuadKey: function (index) {\n                var quadKey = '', digit, mask, i;\n                for (i = this._zoom; i > 0; i--) {\n                    digit = 0;\n                    mask = 1 << i - 1;\n                    if ((index.x & mask) !== 0) {\n                        digit++;\n                    }\n                    if ((index.y & mask) !== 0) {\n                        digit += 2;\n                    }\n                    quadKey += digit;\n                }\n                return quadKey;\n            }\n        });\n        deepExtend(dataviz, {\n            map: {\n                layers: {\n                    bing: BingLayer,\n                    BingLayer: BingLayer,\n                    BingView: BingView\n                }\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/layers/marker', [\n        'dataviz/map/layers/base',\n        'dataviz/map/location',\n        'kendo.data',\n        'kendo.tooltip'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var doc = document, math = Math, indexOf = $.inArray, proxy = $.proxy, kendo = window.kendo, Class = kendo.Class, DataSource = kendo.data.DataSource, Tooltip = kendo.ui.Tooltip, dataviz = kendo.dataviz, deepExtend = kendo.deepExtend, map = dataviz.map, Location = map.Location, Layer = map.layers.Layer;\n        var MarkerLayer = Layer.extend({\n            init: function (map, options) {\n                Layer.fn.init.call(this, map, options);\n                this._markerClick = proxy(this._markerClick, this);\n                this.element.on('click', '.k-marker', this._markerClick);\n                this.items = [];\n                this._initDataSource();\n            },\n            destroy: function () {\n                Layer.fn.destroy.call(this);\n                this.element.off('click', '.k-marker', this._markerClick);\n                this.dataSource.unbind('change', this._dataChange);\n                this.clear();\n            },\n            options: {\n                zIndex: 1000,\n                autoBind: true,\n                dataSource: {},\n                locationField: 'location',\n                titleField: 'title'\n            },\n            add: function (arg) {\n                if ($.isArray(arg)) {\n                    for (var i = 0; i < arg.length; i++) {\n                        this._addOne(arg[i]);\n                    }\n                } else {\n                    return this._addOne(arg);\n                }\n            },\n            remove: function (marker) {\n                marker.destroy();\n                var index = indexOf(marker, this.items);\n                if (index > -1) {\n                    this.items.splice(index, 1);\n                }\n            },\n            clear: function () {\n                for (var i = 0; i < this.items.length; i++) {\n                    this.items[i].destroy();\n                }\n                this.items = [];\n            },\n            update: function (marker) {\n                var loc = marker.location();\n                if (loc) {\n                    marker.showAt(this.map.locationToView(loc));\n                    var args = {\n                        marker: marker,\n                        layer: this\n                    };\n                    this.map.trigger('markerActivate', args);\n                }\n            },\n            _reset: function () {\n                Layer.fn._reset.call(this);\n                var items = this.items;\n                for (var i = 0; i < items.length; i++) {\n                    this.update(items[i]);\n                }\n            },\n            bind: function (options, dataItem) {\n                var marker = map.Marker.create(options, this.options);\n                marker.dataItem = dataItem;\n                var args = {\n                    marker: marker,\n                    layer: this\n                };\n                var cancelled = this.map.trigger('markerCreated', args);\n                if (!cancelled) {\n                    this.add(marker);\n                    return marker;\n                }\n            },\n            setDataSource: function (dataSource) {\n                if (this.dataSource) {\n                    this.dataSource.unbind('change', this._dataChange);\n                }\n                this.dataSource = kendo.data.DataSource.create(dataSource);\n                this.dataSource.bind('change', this._dataChange);\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            _addOne: function (arg) {\n                var marker = Marker.create(arg, this.options);\n                marker.addTo(this);\n                return marker;\n            },\n            _initDataSource: function () {\n                var dsOptions = this.options.dataSource;\n                this._dataChange = proxy(this._dataChange, this);\n                this.dataSource = DataSource.create(dsOptions).bind('change', this._dataChange);\n                if (dsOptions && this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            _dataChange: function (e) {\n                this._load(e.sender.view());\n            },\n            _load: function (data) {\n                this._data = data;\n                this.clear();\n                var getLocation = kendo.getter(this.options.locationField);\n                var getTitle = kendo.getter(this.options.titleField);\n                for (var i = 0; i < data.length; i++) {\n                    var dataItem = data[i];\n                    this.bind({\n                        location: getLocation(dataItem),\n                        title: getTitle(dataItem)\n                    }, dataItem);\n                }\n            },\n            _markerClick: function (e) {\n                var args = {\n                    marker: $(e.target).data('kendoMarker'),\n                    layer: this\n                };\n                this.map.trigger('markerClick', args);\n            }\n        });\n        var Marker = Class.extend({\n            init: function (options) {\n                this.options = options || {};\n            },\n            addTo: function (parent) {\n                this.layer = parent.markers || parent;\n                this.layer.items.push(this);\n                this.layer.update(this);\n            },\n            location: function (value) {\n                if (value) {\n                    this.options.location = Location.create(value).toArray();\n                    if (this.layer) {\n                        this.layer.update(this);\n                    }\n                    return this;\n                } else {\n                    return Location.create(this.options.location);\n                }\n            },\n            showAt: function (point) {\n                this.render();\n                this.element.css({\n                    left: math.round(point.x),\n                    top: math.round(point.y)\n                });\n                if (this.tooltip && this.tooltip.popup) {\n                    this.tooltip.popup._position();\n                }\n            },\n            hide: function () {\n                if (this.element) {\n                    this.element.remove();\n                    this.element = null;\n                }\n                if (this.tooltip) {\n                    this.tooltip.destroy();\n                    this.tooltip = null;\n                }\n            },\n            destroy: function () {\n                this.layer = null;\n                this.hide();\n            },\n            render: function () {\n                if (!this.element) {\n                    var options = this.options;\n                    var layer = this.layer;\n                    this.element = $(doc.createElement('span')).addClass('k-marker k-icon k-i-marker-' + kendo.toHyphens(options.shape || 'pin')).attr('title', options.title).attr(options.attributes || {}).data('kendoMarker', this).css('zIndex', options.zIndex);\n                    if (layer) {\n                        layer.element.append(this.element);\n                    }\n                    this.renderTooltip();\n                }\n            },\n            renderTooltip: function () {\n                var marker = this;\n                var title = marker.options.title;\n                var options = marker.options.tooltip || {};\n                if (options && Tooltip) {\n                    var template = options.template;\n                    if (template) {\n                        var contentTemplate = kendo.template(template);\n                        options.content = function (e) {\n                            e.location = marker.location();\n                            e.marker = marker;\n                            return contentTemplate(e);\n                        };\n                    }\n                    if (title || options.content || options.contentUrl) {\n                        this.tooltip = new Tooltip(this.element, options);\n                        this.tooltip.marker = this;\n                    }\n                }\n            }\n        });\n        Marker.create = function (arg, defaults) {\n            if (arg instanceof Marker) {\n                return arg;\n            }\n            return new Marker(deepExtend({}, defaults, arg));\n        };\n        deepExtend(dataviz, {\n            map: {\n                layers: {\n                    marker: MarkerLayer,\n                    MarkerLayer: MarkerLayer\n                },\n                Marker: Marker\n            }\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/map/main', [\n        'dataviz/map/crs',\n        'dataviz/map/location'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var doc = document, math = Math, min = math.min, pow = math.pow, proxy = $.proxy, kendo = window.kendo, Widget = kendo.ui.Widget, deepExtend = kendo.deepExtend, dataviz = kendo.dataviz, ui = dataviz.ui, g = kendo.geometry, Point = g.Point, map = dataviz.map, Extent = map.Extent, Location = map.Location, EPSG3857 = map.crs.EPSG3857, util = kendo.util, renderPos = util.renderPos, drawingUtil = kendo.drawing.util, defined = drawingUtil.defined, limit = drawingUtil.limitValue, valueOrDefault = drawingUtil.valueOrDefault;\n        var CSS_PREFIX = 'k-', FRICTION = 0.9, FRICTION_MOBILE = 0.93, MOUSEWHEEL = 'DOMMouseScroll mousewheel', VELOCITY_MULTIPLIER = 5, DEFAULT_ZOOM_RATE = 1;\n        var Map = Widget.extend({\n            init: function (element, options) {\n                kendo.destroy(element);\n                Widget.fn.init.call(this, element);\n                this._initOptions(options);\n                this.bind(this.events, options);\n                this.crs = new EPSG3857();\n                this.element.addClass(CSS_PREFIX + this.options.name.toLowerCase()).css('position', 'relative').empty().append(doc.createElement('div'));\n                this._viewOrigin = this._getOrigin();\n                this._initScroller();\n                this._initMarkers();\n                this._initControls();\n                this._initLayers();\n                this._reset();\n                this._mousewheel = proxy(this._mousewheel, this);\n                this.element.bind(MOUSEWHEEL, this._mousewheel);\n            },\n            options: {\n                name: 'Map',\n                controls: {\n                    attribution: true,\n                    navigator: { panStep: 100 },\n                    zoom: true\n                },\n                layers: [],\n                layerDefaults: {\n                    shape: {\n                        style: {\n                            fill: { color: '#fff' },\n                            stroke: {\n                                color: '#aaa',\n                                width: 0.5\n                            }\n                        }\n                    },\n                    bubble: {\n                        style: {\n                            fill: {\n                                color: '#fff',\n                                opacity: 0.5\n                            },\n                            stroke: {\n                                color: '#aaa',\n                                width: 0.5\n                            }\n                        }\n                    },\n                    marker: {\n                        shape: 'pinTarget',\n                        tooltip: { position: 'top' }\n                    }\n                },\n                center: [\n                    0,\n                    0\n                ],\n                zoom: 3,\n                minSize: 256,\n                minZoom: 1,\n                maxZoom: 19,\n                markers: [],\n                markerDefaults: {\n                    shape: 'pinTarget',\n                    tooltip: { position: 'top' }\n                },\n                wraparound: true\n            },\n            events: [\n                'beforeReset',\n                'click',\n                'markerActivate',\n                'markerClick',\n                'markerCreated',\n                'pan',\n                'panEnd',\n                'reset',\n                'shapeClick',\n                'shapeCreated',\n                'shapeFeatureCreated',\n                'shapeMouseEnter',\n                'shapeMouseLeave',\n                'zoomEnd',\n                'zoomStart'\n            ],\n            destroy: function () {\n                this.scroller.destroy();\n                if (this.navigator) {\n                    this.navigator.destroy();\n                }\n                if (this.attribution) {\n                    this.attribution.destroy();\n                }\n                if (this.zoomControl) {\n                    this.zoomControl.destroy();\n                }\n                this.markers.destroy();\n                for (var i = 0; i < this.layers.length; i++) {\n                    this.layers[i].destroy();\n                }\n                Widget.fn.destroy.call(this);\n            },\n            zoom: function (level) {\n                var options = this.options;\n                if (defined(level)) {\n                    level = math.round(limit(level, options.minZoom, options.maxZoom));\n                    if (options.zoom !== level) {\n                        options.zoom = level;\n                        this._reset();\n                    }\n                    return this;\n                } else {\n                    return options.zoom;\n                }\n            },\n            center: function (center) {\n                if (center) {\n                    this.options.center = Location.create(center).toArray();\n                    this._reset();\n                    return this;\n                } else {\n                    return Location.create(this.options.center);\n                }\n            },\n            extent: function (extent) {\n                if (extent) {\n                    this._setExtent(extent);\n                    return this;\n                } else {\n                    return this._getExtent();\n                }\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._reset();\n            },\n            locationToLayer: function (location, zoom) {\n                var clamp = !this.options.wraparound;\n                location = Location.create(location);\n                return this.crs.toPoint(location, this._layerSize(zoom), clamp);\n            },\n            layerToLocation: function (point, zoom) {\n                var clamp = !this.options.wraparound;\n                point = Point.create(point);\n                return this.crs.toLocation(point, this._layerSize(zoom), clamp);\n            },\n            locationToView: function (location) {\n                location = Location.create(location);\n                var origin = this.locationToLayer(this._viewOrigin);\n                var point = this.locationToLayer(location);\n                return point.translateWith(origin.scale(-1));\n            },\n            viewToLocation: function (point, zoom) {\n                var origin = this.locationToLayer(this._getOrigin(), zoom);\n                point = Point.create(point);\n                point = point.clone().translateWith(origin);\n                return this.layerToLocation(point, zoom);\n            },\n            eventOffset: function (e) {\n                var point;\n                var x;\n                var y;\n                var offset = this.element.offset();\n                if (e.x || e.y) {\n                    var field = 'location';\n                    x = e.x[field] - offset.left;\n                    y = e.y[field] - offset.top;\n                    point = new g.Point(x, y);\n                } else {\n                    var event = e.originalEvent || e;\n                    x = valueOrDefault(event.pageX, event.clientX) - offset.left;\n                    y = valueOrDefault(event.pageY, event.clientY) - offset.top;\n                    point = new g.Point(x, y);\n                }\n                return point;\n            },\n            eventToView: function (e) {\n                var cursor = this.eventOffset(e);\n                return this.locationToView(this.viewToLocation(cursor));\n            },\n            eventToLayer: function (e) {\n                return this.locationToLayer(this.eventToLocation(e));\n            },\n            eventToLocation: function (e) {\n                var cursor = this.eventOffset(e);\n                return this.viewToLocation(cursor);\n            },\n            viewSize: function () {\n                var element = this.element;\n                var scale = this._layerSize();\n                var width = element.width();\n                if (!this.options.wraparound) {\n                    width = min(scale, width);\n                }\n                return {\n                    width: width,\n                    height: min(scale, element.height())\n                };\n            },\n            exportVisual: function () {\n                this._reset();\n                return false;\n            },\n            _setOrigin: function (origin, zoom) {\n                var size = this.viewSize(), topLeft;\n                origin = this._origin = Location.create(origin);\n                topLeft = this.locationToLayer(origin, zoom);\n                topLeft.x += size.width / 2;\n                topLeft.y += size.height / 2;\n                this.options.center = this.layerToLocation(topLeft, zoom).toArray();\n                return this;\n            },\n            _getOrigin: function (invalidate) {\n                var size = this.viewSize(), topLeft;\n                if (invalidate || !this._origin) {\n                    topLeft = this.locationToLayer(this.center());\n                    topLeft.x -= size.width / 2;\n                    topLeft.y -= size.height / 2;\n                    this._origin = this.layerToLocation(topLeft);\n                }\n                return this._origin;\n            },\n            _setExtent: function (extent) {\n                var raw = Extent.create(extent);\n                var se = raw.se.clone();\n                if (this.options.wraparound && se.lng < 0 && extent.nw.lng > 0) {\n                    se.lng = 180 + (180 + se.lng);\n                }\n                extent = new Extent(raw.nw, se);\n                this.center(extent.center());\n                var width = this.element.width();\n                var height = this.element.height();\n                for (var zoom = this.options.maxZoom; zoom >= this.options.minZoom; zoom--) {\n                    var topLeft = this.locationToLayer(extent.nw, zoom);\n                    var bottomRight = this.locationToLayer(extent.se, zoom);\n                    var layerWidth = math.abs(bottomRight.x - topLeft.x);\n                    var layerHeight = math.abs(bottomRight.y - topLeft.y);\n                    if (layerWidth <= width && layerHeight <= height) {\n                        break;\n                    }\n                }\n                this.zoom(zoom);\n            },\n            _getExtent: function () {\n                var nw = this._getOrigin();\n                var bottomRight = this.locationToLayer(nw);\n                var size = this.viewSize();\n                bottomRight.x += size.width;\n                bottomRight.y += size.height;\n                var se = this.layerToLocation(bottomRight);\n                return new Extent(nw, se);\n            },\n            _zoomAround: function (pivot, level) {\n                this._setOrigin(this.layerToLocation(pivot, level), level);\n                this.zoom(level);\n            },\n            _initControls: function () {\n                var controls = this.options.controls;\n                if (ui.Attribution && controls.attribution) {\n                    this._createAttribution(controls.attribution);\n                }\n                if (!kendo.support.mobileOS) {\n                    if (ui.Navigator && controls.navigator) {\n                        this._createNavigator(controls.navigator);\n                    }\n                    if (ui.ZoomControl && controls.zoom) {\n                        this._createZoomControl(controls.zoom);\n                    }\n                }\n            },\n            _createControlElement: function (options, defaultPos) {\n                var pos = options.position || defaultPos;\n                var posSelector = '.' + renderPos(pos).replace(' ', '.');\n                var wrap = $('.k-map-controls' + posSelector, this.element);\n                if (wrap.length === 0) {\n                    wrap = $('<div>').addClass('k-map-controls ' + renderPos(pos)).appendTo(this.element);\n                }\n                return $('<div>').appendTo(wrap);\n            },\n            _createAttribution: function (options) {\n                var element = this._createControlElement(options, 'bottomRight');\n                this.attribution = new ui.Attribution(element, options);\n            },\n            _createNavigator: function (options) {\n                var element = this._createControlElement(options, 'topLeft');\n                var navigator = this.navigator = new ui.Navigator(element, options);\n                this._navigatorPan = proxy(this._navigatorPan, this);\n                navigator.bind('pan', this._navigatorPan);\n                this._navigatorCenter = proxy(this._navigatorCenter, this);\n                navigator.bind('center', this._navigatorCenter);\n            },\n            _navigatorPan: function (e) {\n                var map = this;\n                var scroller = map.scroller;\n                var x = scroller.scrollLeft + e.x;\n                var y = scroller.scrollTop - e.y;\n                var bounds = this._virtualSize;\n                var height = this.element.height();\n                var width = this.element.width();\n                x = limit(x, bounds.x.min, bounds.x.max - width);\n                y = limit(y, bounds.y.min, bounds.y.max - height);\n                map.scroller.one('scroll', function (e) {\n                    map._scrollEnd(e);\n                });\n                map.scroller.scrollTo(-x, -y);\n            },\n            _navigatorCenter: function () {\n                this.center(this.options.center);\n            },\n            _createZoomControl: function (options) {\n                var element = this._createControlElement(options, 'topLeft');\n                var zoomControl = this.zoomControl = new ui.ZoomControl(element, options);\n                this._zoomControlChange = proxy(this._zoomControlChange, this);\n                zoomControl.bind('change', this._zoomControlChange);\n            },\n            _zoomControlChange: function (e) {\n                if (!this.trigger('zoomStart', { originalEvent: e })) {\n                    this.zoom(this.zoom() + e.delta);\n                    this.trigger('zoomEnd', { originalEvent: e });\n                }\n            },\n            _initScroller: function () {\n                var friction = kendo.support.mobileOS ? FRICTION_MOBILE : FRICTION;\n                var zoomable = this.options.zoomable !== false;\n                var scroller = this.scroller = new kendo.mobile.ui.Scroller(this.element.children(0), {\n                    friction: friction,\n                    velocityMultiplier: VELOCITY_MULTIPLIER,\n                    zoom: zoomable,\n                    mousewheelScrolling: false,\n                    supportDoubleTap: true\n                });\n                scroller.bind('scroll', proxy(this._scroll, this));\n                scroller.bind('scrollEnd', proxy(this._scrollEnd, this));\n                scroller.userEvents.bind('gesturestart', proxy(this._scaleStart, this));\n                scroller.userEvents.bind('gestureend', proxy(this._scale, this));\n                scroller.userEvents.bind('doubleTap', proxy(this._doubleTap, this));\n                scroller.userEvents.bind('tap', proxy(this._tap, this));\n                this.scrollElement = scroller.scrollElement;\n            },\n            _initLayers: function () {\n                var defs = this.options.layers, layers = this.layers = [];\n                for (var i = 0; i < defs.length; i++) {\n                    var options = defs[i];\n                    var type = options.type || 'shape';\n                    var defaults = this.options.layerDefaults[type];\n                    var impl = dataviz.map.layers[type];\n                    layers.push(new impl(this, deepExtend({}, defaults, options)));\n                }\n            },\n            _initMarkers: function () {\n                this.markers = new map.layers.MarkerLayer(this, this.options.markerDefaults);\n                this.markers.add(this.options.markers);\n            },\n            _scroll: function (e) {\n                var origin = this.locationToLayer(this._viewOrigin).round();\n                var movable = e.sender.movable;\n                var offset = new g.Point(movable.x, movable.y).scale(-1).scale(1 / movable.scale);\n                origin.x += offset.x;\n                origin.y += offset.y;\n                this._scrollOffset = offset;\n                this._setOrigin(this.layerToLocation(origin));\n                this.trigger('pan', {\n                    originalEvent: e,\n                    origin: this._getOrigin(),\n                    center: this.center()\n                });\n            },\n            _scrollEnd: function (e) {\n                if (!this._scrollOffset || !this._panComplete()) {\n                    return;\n                }\n                this._scrollOffset = null;\n                this._panEndTS = new Date();\n                this.trigger('panEnd', {\n                    originalEvent: e,\n                    origin: this._getOrigin(),\n                    center: this.center()\n                });\n            },\n            _panComplete: function () {\n                return new Date() - (this._panEndTS || 0) > 50;\n            },\n            _scaleStart: function (e) {\n                if (this.trigger('zoomStart', { originalEvent: e })) {\n                    var touch = e.touches[1];\n                    if (touch) {\n                        touch.cancel();\n                    }\n                }\n            },\n            _scale: function (e) {\n                var scale = this.scroller.movable.scale;\n                var zoom = this._scaleToZoom(scale);\n                var gestureCenter = new g.Point(e.center.x, e.center.y);\n                var centerLocation = this.viewToLocation(gestureCenter, zoom);\n                var centerPoint = this.locationToLayer(centerLocation, zoom);\n                var originPoint = centerPoint.translate(-gestureCenter.x, -gestureCenter.y);\n                this._zoomAround(originPoint, zoom);\n                this.trigger('zoomEnd', { originalEvent: e });\n            },\n            _scaleToZoom: function (scaleDelta) {\n                var scale = this._layerSize() * scaleDelta;\n                var tiles = scale / this.options.minSize;\n                var zoom = math.log(tiles) / math.log(2);\n                return math.round(zoom);\n            },\n            _reset: function () {\n                if (this.attribution) {\n                    this.attribution.filter(this.center(), this.zoom());\n                }\n                this._viewOrigin = this._getOrigin(true);\n                this._resetScroller();\n                this.trigger('beforeReset');\n                this.trigger('reset');\n            },\n            _resetScroller: function () {\n                var scroller = this.scroller;\n                var x = scroller.dimensions.x;\n                var y = scroller.dimensions.y;\n                var scale = this._layerSize();\n                var nw = this.extent().nw;\n                var topLeft = this.locationToLayer(nw).round();\n                scroller.movable.round = true;\n                scroller.reset();\n                scroller.userEvents.cancel();\n                var zoom = this.zoom();\n                scroller.dimensions.forcedMinScale = pow(2, this.options.minZoom - zoom);\n                scroller.dimensions.maxScale = pow(2, this.options.maxZoom - zoom);\n                var xBounds = {\n                    min: -topLeft.x,\n                    max: scale - topLeft.x\n                };\n                var yBounds = {\n                    min: -topLeft.y,\n                    max: scale - topLeft.y\n                };\n                if (this.options.wraparound) {\n                    xBounds.max = 20 * scale;\n                    xBounds.min = -xBounds.max;\n                }\n                if (this.options.pannable === false) {\n                    var viewSize = this.viewSize();\n                    xBounds.min = yBounds.min = 0;\n                    xBounds.max = viewSize.width;\n                    yBounds.max = viewSize.height;\n                }\n                x.makeVirtual();\n                y.makeVirtual();\n                x.virtualSize(xBounds.min, xBounds.max);\n                y.virtualSize(yBounds.min, yBounds.max);\n                this._virtualSize = {\n                    x: xBounds,\n                    y: yBounds\n                };\n            },\n            _renderLayers: function () {\n                var defs = this.options.layers, layers = this.layers = [], scrollWrap = this.scrollWrap;\n                scrollWrap.empty();\n                for (var i = 0; i < defs.length; i++) {\n                    var options = defs[i];\n                    var type = options.type || 'shape';\n                    var defaults = this.options.layerDefaults[type];\n                    var impl = dataviz.map.layers[type];\n                    layers.push(new impl(this, deepExtend({}, defaults, options)));\n                }\n            },\n            _layerSize: function (zoom) {\n                zoom = valueOrDefault(zoom, this.options.zoom);\n                return this.options.minSize * pow(2, zoom);\n            },\n            _tap: function (e) {\n                if (!this._panComplete()) {\n                    return;\n                }\n                var cursor = this.eventOffset(e);\n                this.trigger('click', {\n                    originalEvent: e,\n                    location: this.viewToLocation(cursor)\n                });\n            },\n            _doubleTap: function (e) {\n                var options = this.options;\n                if (options.zoomable !== false) {\n                    if (!this.trigger('zoomStart', { originalEvent: e })) {\n                        var toZoom = this.zoom() + DEFAULT_ZOOM_RATE;\n                        var cursor = this.eventOffset(e);\n                        var location = this.viewToLocation(cursor);\n                        var postZoom = this.locationToLayer(location, toZoom);\n                        var origin = postZoom.translate(-cursor.x, -cursor.y);\n                        this._zoomAround(origin, toZoom);\n                        this.trigger('zoomEnd', { originalEvent: e });\n                    }\n                }\n            },\n            _mousewheel: function (e) {\n                e.preventDefault();\n                var delta = dataviz.mwDelta(e) > 0 ? -1 : 1;\n                var options = this.options;\n                var fromZoom = this.zoom();\n                var toZoom = limit(fromZoom + delta, options.minZoom, options.maxZoom);\n                if (options.zoomable !== false && toZoom !== fromZoom) {\n                    if (!this.trigger('zoomStart', { originalEvent: e })) {\n                        var cursor = this.eventOffset(e);\n                        var location = this.viewToLocation(cursor);\n                        var postZoom = this.locationToLayer(location, toZoom);\n                        var origin = postZoom.translate(-cursor.x, -cursor.y);\n                        this._zoomAround(origin, toZoom);\n                        this.trigger('zoomEnd', { originalEvent: e });\n                    }\n                }\n            }\n        });\n        dataviz.ui.plugin(Map);\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.map', [\n        'kendo.data',\n        'kendo.userevents',\n        'kendo.tooltip',\n        'kendo.mobile.scroller',\n        'kendo.draganddrop',\n        'kendo.dataviz.core',\n        'dataviz/map/location',\n        'dataviz/map/attribution',\n        'dataviz/map/navigator',\n        'dataviz/map/zoom',\n        'dataviz/map/crs',\n        'dataviz/map/layers/base',\n        'dataviz/map/layers/shape',\n        'dataviz/map/layers/bubble',\n        'dataviz/map/layers/tile',\n        'dataviz/map/layers/bing',\n        'dataviz/map/layers/marker',\n        'dataviz/map/main'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.map',\n        name: 'Map',\n        category: 'dataviz',\n        description: 'The Kendo DataViz Map displays spatial data',\n        depends: [\n            'data',\n            'userevents',\n            'tooltip',\n            'dataviz.core',\n            'drawing',\n            'mobile.scroller'\n        ]\n    };\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/diagram/utils', ['kendo.core'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, diagram = kendo.dataviz.diagram = {}, deepExtend = kendo.deepExtend, isArray = $.isArray, EPSILON = 0.000001;\n        var Utils = {};\n        deepExtend(Utils, {\n            isNearZero: function (num) {\n                return Math.abs(num) < EPSILON;\n            },\n            isDefined: function (obj) {\n                return typeof obj !== 'undefined';\n            },\n            isUndefined: function (obj) {\n                return typeof obj === 'undefined' || obj === null;\n            },\n            isObject: function (obj) {\n                return obj === Object(obj);\n            },\n            has: function (obj, key) {\n                return Object.hasOwnProperty.call(obj, key);\n            },\n            isString: function (obj) {\n                return Object.prototype.toString.call(obj) == '[object String]';\n            },\n            isBoolean: function (obj) {\n                return Object.prototype.toString.call(obj) == '[object Boolean]';\n            },\n            isType: function (obj, type) {\n                return Object.prototype.toString.call(obj) == '[object ' + type + ']';\n            },\n            isNumber: function (obj) {\n                return !isNaN(parseFloat(obj)) && isFinite(obj);\n            },\n            isEmpty: function (obj) {\n                if (obj === null) {\n                    return true;\n                }\n                if (isArray(obj) || Utils.isString(obj)) {\n                    return obj.length === 0;\n                }\n                for (var key in obj) {\n                    if (Utils.has(obj, key)) {\n                        return false;\n                    }\n                }\n                return true;\n            },\n            simpleExtend: function (destination, source) {\n                if (!Utils.isObject(source)) {\n                    return;\n                }\n                for (var name in source) {\n                    destination[name] = source[name];\n                }\n            },\n            initArray: function createIdArray(size, value) {\n                var array = [];\n                for (var i = 0; i < size; ++i) {\n                    array[i] = value;\n                }\n                return array;\n            },\n            serializePoints: function (points) {\n                var res = [];\n                for (var i = 0; i < points.length; i++) {\n                    var p = points[i];\n                    res.push(p.x + ';' + p.y);\n                }\n                return res.join(';');\n            },\n            deserializePoints: function (s) {\n                var v = s.split(';'), points = [];\n                if (v.length % 2 !== 0) {\n                    throw 'Not an array of points.';\n                }\n                for (var i = 0; i < v.length; i += 2) {\n                    points.push(new diagram.Point(parseInt(v[i], 10), parseInt(v[i + 1], 10)));\n                }\n                return points;\n            },\n            randomInteger: function (lower, upper) {\n                return parseInt(Math.floor(Math.random() * upper) + lower, 10);\n            },\n            DFT: function (el, func) {\n                func(el);\n                if (el.childNodes) {\n                    for (var i = 0; i < el.childNodes.length; i++) {\n                        var item = el.childNodes[i];\n                        this.DFT(item, func);\n                    }\n                }\n            },\n            getMatrixAngle: function (m) {\n                if (m === null || m.d === 0) {\n                    return 0;\n                }\n                return Math.atan2(m.b, m.d) * 180 / Math.PI;\n            },\n            getMatrixScaling: function (m) {\n                var sX = Math.sqrt(m.a * m.a + m.c * m.c);\n                var sY = Math.sqrt(m.b * m.b + m.d * m.d);\n                return [\n                    sX,\n                    sY\n                ];\n            }\n        });\n        function Range(start, stop, step) {\n            if (typeof start == 'undefined' || typeof stop == 'undefined') {\n                return [];\n            }\n            if (step && Utils.sign(stop - start) != Utils.sign(step)) {\n                throw 'The sign of the increment should allow to reach the stop-value.';\n            }\n            step = step || 1;\n            start = start || 0;\n            stop = stop || start;\n            if ((stop - start) / step === Infinity) {\n                throw 'Infinite range defined.';\n            }\n            var range = [], i = -1, j;\n            function rangeIntegerScale(x) {\n                var k = 1;\n                while (x * k % 1) {\n                    k *= 10;\n                }\n                return k;\n            }\n            var k = rangeIntegerScale(Math.abs(step));\n            start *= k;\n            stop *= k;\n            step *= k;\n            if (start > stop && step > 0) {\n                step = -step;\n            }\n            if (step < 0) {\n                while ((j = start + step * ++i) >= stop) {\n                    range.push(j / k);\n                }\n            } else {\n                while ((j = start + step * ++i) <= stop) {\n                    range.push(j / k);\n                }\n            }\n            return range;\n        }\n        function findRadian(start, end) {\n            if (start == end) {\n                return 0;\n            }\n            var sngXComp = end.x - start.x, sngYComp = start.y - end.y, atan = Math.atan(sngXComp / sngYComp);\n            if (sngYComp >= 0) {\n                return sngXComp < 0 ? atan + 2 * Math.PI : atan;\n            }\n            return atan + Math.PI;\n        }\n        Utils.sign = function (number) {\n            return number ? number < 0 ? -1 : 1 : 0;\n        };\n        Utils.findAngle = function (center, end) {\n            return findRadian(center, end) * 180 / Math.PI;\n        };\n        Utils.forEach = function (arr, iterator, thisRef) {\n            for (var i = 0; i < arr.length; i++) {\n                iterator.call(thisRef, arr[i], i, arr);\n            }\n        };\n        Utils.any = function (arr, predicate) {\n            for (var i = 0; i < arr.length; ++i) {\n                if (predicate(arr[i])) {\n                    return arr[i];\n                }\n            }\n            return null;\n        };\n        Utils.remove = function (arr, what) {\n            var ax;\n            while ((ax = Utils.indexOf(arr, what)) !== -1) {\n                arr.splice(ax, 1);\n            }\n            return arr;\n        };\n        Utils.contains = function (arr, obj) {\n            return Utils.indexOf(arr, obj) !== -1;\n        };\n        Utils.indexOf = function (arr, what) {\n            return $.inArray(what, arr);\n        };\n        Utils.fold = function (list, iterator, acc, context) {\n            var initial = arguments.length > 2;\n            for (var i = 0; i < list.length; i++) {\n                var value = list[i];\n                if (!initial) {\n                    acc = value;\n                    initial = true;\n                } else {\n                    acc = iterator.call(context, acc, value, i, list);\n                }\n            }\n            if (!initial) {\n                throw 'Reduce of empty array with no initial value';\n            }\n            return acc;\n        };\n        Utils.find = function (arr, iterator, context) {\n            var result;\n            Utils.any(arr, function (value, index, list) {\n                if (iterator.call(context, value, index, list)) {\n                    result = value;\n                    return true;\n                }\n                return false;\n            });\n            return result;\n        };\n        Utils.first = function (arr, constraint, context) {\n            if (arr.length === 0) {\n                return null;\n            }\n            if (Utils.isUndefined(constraint)) {\n                return arr[0];\n            }\n            return Utils.find(arr, constraint, context);\n        };\n        Utils.insert = function (arr, element, position) {\n            arr.splice(position, 0, element);\n            return arr;\n        };\n        Utils.all = function (arr, iterator, context) {\n            var result = true;\n            var value;\n            for (var i = 0; i < arr.length; i++) {\n                value = arr[i];\n                result = result && iterator.call(context, value, i, arr);\n                if (!result) {\n                    break;\n                }\n            }\n            return result;\n        };\n        Utils.clear = function (arr) {\n            arr.splice(0, arr.length);\n        };\n        Utils.bisort = function (a, b, sortfunc) {\n            if (Utils.isUndefined(a)) {\n                throw 'First array is not specified.';\n            }\n            if (Utils.isUndefined(b)) {\n                throw 'Second array is not specified.';\n            }\n            if (a.length != b.length) {\n                throw 'The two arrays should have equal length';\n            }\n            var all = [], i;\n            for (i = 0; i < a.length; i++) {\n                all.push({\n                    'x': a[i],\n                    'y': b[i]\n                });\n            }\n            if (Utils.isUndefined(sortfunc)) {\n                all.sort(function (m, n) {\n                    return m.x - n.x;\n                });\n            } else {\n                all.sort(function (m, n) {\n                    return sortfunc(m.x, n.x);\n                });\n            }\n            Utils.clear(a);\n            Utils.clear(b);\n            for (i = 0; i < all.length; i++) {\n                a.push(all[i].x);\n                b.push(all[i].y);\n            }\n        };\n        Utils.addRange = function (arr, range) {\n            arr.push.apply(arr, range);\n        };\n        var Easing = {\n            easeInOut: function (pos) {\n                return -Math.cos(pos * Math.PI) / 2 + 0.5;\n            }\n        };\n        var Ticker = kendo.Class.extend({\n            init: function () {\n                this.adapters = [];\n                this.target = 0;\n                this.tick = 0;\n                this.interval = 20;\n                this.duration = 800;\n                this.lastTime = null;\n                this.handlers = [];\n                var _this = this;\n                this.transition = Easing.easeInOut;\n                this.timerDelegate = function () {\n                    _this.onTimerEvent();\n                };\n            },\n            addAdapter: function (a) {\n                this.adapters.push(a);\n            },\n            onComplete: function (handler) {\n                this.handlers.push(handler);\n            },\n            removeHandler: function (handler) {\n                this.handlers = $.grep(this.handlers, function (h) {\n                    return h !== handler;\n                });\n            },\n            trigger: function () {\n                var _this = this;\n                if (this.handlers) {\n                    Utils.forEach(this.handlers, function (h) {\n                        return h.call(_this.caller !== null ? _this.caller : _this);\n                    });\n                }\n            },\n            onStep: function () {\n            },\n            seekTo: function (to) {\n                this.seekFromTo(this.tick, to);\n            },\n            seekFromTo: function (from, to) {\n                this.target = Math.max(0, Math.min(1, to));\n                this.tick = Math.max(0, Math.min(1, from));\n                this.lastTime = new Date().getTime();\n                if (!this.intervalId) {\n                    this.intervalId = window.setInterval(this.timerDelegate, this.interval);\n                }\n            },\n            stop: function () {\n                if (this.intervalId) {\n                    window.clearInterval(this.intervalId);\n                    this.intervalId = null;\n                    this.trigger();\n                }\n            },\n            play: function (origin) {\n                if (this.adapters.length === 0) {\n                    return;\n                }\n                if (origin !== null) {\n                    this.caller = origin;\n                }\n                this.initState();\n                this.seekFromTo(0, 1);\n            },\n            reverse: function () {\n                this.seekFromTo(1, 0);\n            },\n            initState: function () {\n                if (this.adapters.length === 0) {\n                    return;\n                }\n                for (var i = 0; i < this.adapters.length; i++) {\n                    this.adapters[i].initState();\n                }\n            },\n            propagate: function () {\n                var value = this.transition(this.tick);\n                for (var i = 0; i < this.adapters.length; i++) {\n                    this.adapters[i].update(value);\n                }\n            },\n            onTimerEvent: function () {\n                var now = new Date().getTime();\n                var timePassed = now - this.lastTime;\n                this.lastTime = now;\n                var movement = timePassed / this.duration * (this.tick < this.target ? 1 : -1);\n                if (Math.abs(movement) >= Math.abs(this.tick - this.target)) {\n                    this.tick = this.target;\n                } else {\n                    this.tick += movement;\n                }\n                try {\n                    this.propagate();\n                } finally {\n                    this.onStep.call(this);\n                    if (this.target == this.tick) {\n                        this.stop();\n                    }\n                }\n            }\n        });\n        kendo.deepExtend(diagram, {\n            init: function (element) {\n                kendo.init(element, diagram.ui);\n            },\n            Utils: Utils,\n            Range: Range,\n            Ticker: Ticker\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/diagram/math', [\n        'dataviz/diagram/utils',\n        'kendo.dataviz.core'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, diagram = kendo.dataviz.diagram, Class = kendo.Class, deepExtend = kendo.deepExtend, dataviz = kendo.dataviz, Utils = diagram.Utils, Point = dataviz.Point2D, isFunction = kendo.isFunction, contains = Utils.contains, map = $.map;\n        var HITTESTAREA = 3, EPSILON = 0.000001;\n        deepExtend(Point.fn, {\n            plus: function (p) {\n                return new Point(this.x + p.x, this.y + p.y);\n            },\n            minus: function (p) {\n                return new Point(this.x - p.x, this.y - p.y);\n            },\n            offset: function (value) {\n                return new Point(this.x - value, this.y - value);\n            },\n            times: function (s) {\n                return new Point(this.x * s, this.y * s);\n            },\n            normalize: function () {\n                if (this.length() === 0) {\n                    return new Point();\n                }\n                return this.times(1 / this.length());\n            },\n            length: function () {\n                return Math.sqrt(this.x * this.x + this.y * this.y);\n            },\n            toString: function () {\n                return '(' + this.x + ',' + this.y + ')';\n            },\n            lengthSquared: function () {\n                return this.x * this.x + this.y * this.y;\n            },\n            middleOf: function MiddleOf(p, q) {\n                return new Point(q.x - p.x, q.y - p.y).times(0.5).plus(p);\n            },\n            toPolar: function (useDegrees) {\n                var factor = 1;\n                if (useDegrees) {\n                    factor = 180 / Math.PI;\n                }\n                var a = Math.atan2(Math.abs(this.y), Math.abs(this.x));\n                var halfpi = Math.PI / 2;\n                var len = this.length();\n                if (this.x === 0) {\n                    if (this.y === 0) {\n                        return new Polar(0, 0);\n                    }\n                    if (this.y > 0) {\n                        return new Polar(len, factor * halfpi);\n                    }\n                    if (this.y < 0) {\n                        return new Polar(len, factor * 3 * halfpi);\n                    }\n                } else if (this.x > 0) {\n                    if (this.y === 0) {\n                        return new Polar(len, 0);\n                    }\n                    if (this.y > 0) {\n                        return new Polar(len, factor * a);\n                    }\n                    if (this.y < 0) {\n                        return new Polar(len, factor * (4 * halfpi - a));\n                    }\n                } else {\n                    if (this.y === 0) {\n                        return new Polar(len, 2 * halfpi);\n                    }\n                    if (this.y > 0) {\n                        return new Polar(len, factor * (2 * halfpi - a));\n                    }\n                    if (this.y < 0) {\n                        return new Polar(len, factor * (2 * halfpi + a));\n                    }\n                }\n            },\n            isOnLine: function (from, to) {\n                if (from.x > to.x) {\n                    var temp = to;\n                    to = from;\n                    from = temp;\n                }\n                var r1 = new Rect(from.x, from.y).inflate(HITTESTAREA, HITTESTAREA), r2 = new Rect(to.x, to.y).inflate(HITTESTAREA, HITTESTAREA), o1, u1;\n                if (r1.union(r2).contains(this)) {\n                    if (from.x === to.x || from.y === to.y) {\n                        return true;\n                    } else if (from.y < to.y) {\n                        o1 = r1.x + (r2.x - r1.x) * (this.y - (r1.y + r1.height)) / (r2.y + r2.height - (r1.y + r1.height));\n                        u1 = r1.x + r1.width + (r2.x + r2.width - (r1.x + r1.width)) * (this.y - r1.y) / (r2.y - r1.y);\n                    } else {\n                        o1 = r1.x + (r2.x - r1.x) * (this.y - r1.y) / (r2.y - r1.y);\n                        u1 = r1.x + r1.width + (r2.x + r2.width - (r1.x + r1.width)) * (this.y - (r1.y + r1.height)) / (r2.y + r2.height - (r1.y + r1.height));\n                    }\n                    return this.x > o1 && this.x < u1;\n                }\n                return false;\n            }\n        });\n        deepExtend(Point, {\n            parse: function (str) {\n                var tempStr = str.slice(1, str.length - 1), xy = tempStr.split(','), x = parseInt(xy[0], 10), y = parseInt(xy[1], 10);\n                if (!isNaN(x) && !isNaN(y)) {\n                    return new Point(x, y);\n                }\n            }\n        });\n        var PathDefiner = Class.extend({\n            init: function (p, left, right) {\n                this.point = p;\n                this.left = left;\n                this.right = right;\n            }\n        });\n        var Rect = Class.extend({\n            init: function (x, y, width, height) {\n                this.x = x || 0;\n                this.y = y || 0;\n                this.width = width || 0;\n                this.height = height || 0;\n            },\n            contains: function (point) {\n                return point.x >= this.x && point.x <= this.x + this.width && point.y >= this.y && point.y <= this.y + this.height;\n            },\n            inflate: function (dx, dy) {\n                if (dy === undefined) {\n                    dy = dx;\n                }\n                this.x -= dx;\n                this.y -= dy;\n                this.width += 2 * dx + 1;\n                this.height += 2 * dy + 1;\n                return this;\n            },\n            offset: function (dx, dy) {\n                var x = dx, y = dy;\n                if (dx instanceof Point) {\n                    x = dx.x;\n                    y = dx.y;\n                }\n                this.x += x;\n                this.y += y;\n                return this;\n            },\n            union: function (r) {\n                var x1 = Math.min(this.x, r.x);\n                var y1 = Math.min(this.y, r.y);\n                var x2 = Math.max(this.x + this.width, r.x + r.width);\n                var y2 = Math.max(this.y + this.height, r.y + r.height);\n                return new Rect(x1, y1, x2 - x1, y2 - y1);\n            },\n            center: function () {\n                return new Point(this.x + this.width / 2, this.y + this.height / 2);\n            },\n            top: function () {\n                return new Point(this.x + this.width / 2, this.y);\n            },\n            right: function () {\n                return new Point(this.x + this.width, this.y + this.height / 2);\n            },\n            bottom: function () {\n                return new Point(this.x + this.width / 2, this.y + this.height);\n            },\n            left: function () {\n                return new Point(this.x, this.y + this.height / 2);\n            },\n            topLeft: function () {\n                return new Point(this.x, this.y);\n            },\n            topRight: function () {\n                return new Point(this.x + this.width, this.y);\n            },\n            bottomLeft: function () {\n                return new Point(this.x, this.y + this.height);\n            },\n            bottomRight: function () {\n                return new Point(this.x + this.width, this.y + this.height);\n            },\n            clone: function () {\n                return new Rect(this.x, this.y, this.width, this.height);\n            },\n            isEmpty: function () {\n                return !this.width && !this.height;\n            },\n            equals: function (rect) {\n                return this.x === rect.x && this.y === rect.y && this.width === rect.width && this.height === rect.height;\n            },\n            rotatedBounds: function (angle) {\n                var rect = this.clone(), points = this.rotatedPoints(angle), tl = points[0], tr = points[1], br = points[2], bl = points[3];\n                rect.x = Math.min(br.x, tl.x, tr.x, bl.x);\n                rect.y = Math.min(br.y, tl.y, tr.y, bl.y);\n                rect.width = Math.max(br.x, tl.x, tr.x, bl.x) - rect.x;\n                rect.height = Math.max(br.y, tl.y, tr.y, bl.y) - rect.y;\n                return rect;\n            },\n            rotatedPoints: function (angle) {\n                var rect = this, c = rect.center(), br = rect.bottomRight().rotate(c, 360 - angle), tl = rect.topLeft().rotate(c, 360 - angle), tr = rect.topRight().rotate(c, 360 - angle), bl = rect.bottomLeft().rotate(c, 360 - angle);\n                return [\n                    tl,\n                    tr,\n                    br,\n                    bl\n                ];\n            },\n            toString: function (delimiter) {\n                delimiter = delimiter || ' ';\n                return this.x + delimiter + this.y + delimiter + this.width + delimiter + this.height;\n            },\n            scale: function (scaleX, scaleY, staicPoint, adornerCenter, angle) {\n                var tl = this.topLeft();\n                var thisCenter = this.center();\n                tl.rotate(thisCenter, 360 - angle).rotate(adornerCenter, angle);\n                var delta = staicPoint.minus(tl);\n                var scaled = new Point(delta.x * scaleX, delta.y * scaleY);\n                var position = delta.minus(scaled);\n                tl = tl.plus(position);\n                tl.rotate(adornerCenter, 360 - angle).rotate(thisCenter, angle);\n                this.x = tl.x;\n                this.y = tl.y;\n                this.width *= scaleX;\n                this.height *= scaleY;\n            },\n            zoom: function (zoom) {\n                this.x *= zoom;\n                this.y *= zoom;\n                this.width *= zoom;\n                this.height *= zoom;\n                return this;\n            },\n            overlaps: function (rect) {\n                var bottomRight = this.bottomRight();\n                var rectBottomRight = rect.bottomRight();\n                var overlaps = !(bottomRight.x < rect.x || bottomRight.y < rect.y || rectBottomRight.x < this.x || rectBottomRight.y < this.y);\n                return overlaps;\n            }\n        });\n        var Size = Class.extend({\n            init: function (width, height) {\n                this.width = width;\n                this.height = height;\n            }\n        });\n        Size.prototype.Empty = new Size(0, 0);\n        Rect.toRect = function (rect) {\n            if (!(rect instanceof Rect)) {\n                rect = new Rect(rect.x, rect.y, rect.width, rect.height);\n            }\n            return rect;\n        };\n        Rect.empty = function () {\n            return new Rect(0, 0, 0, 0);\n        };\n        Rect.fromPoints = function (p, q) {\n            if (isNaN(p.x) || isNaN(p.y) || isNaN(q.x) || isNaN(q.y)) {\n                throw 'Some values are NaN.';\n            }\n            return new Rect(Math.min(p.x, q.x), Math.min(p.y, q.y), Math.abs(p.x - q.x), Math.abs(p.y - q.y));\n        };\n        function isNearZero(num) {\n            return Math.abs(num) < EPSILON;\n        }\n        function intersectLine(start1, end1, start2, end2, isSegment) {\n            var tangensdiff = (end1.x - start1.x) * (end2.y - start2.y) - (end1.y - start1.y) * (end2.x - start2.x);\n            if (isNearZero(tangensdiff)) {\n                return;\n            }\n            var num1 = (start1.y - start2.y) * (end2.x - start2.x) - (start1.x - start2.x) * (end2.y - start2.y);\n            var num2 = (start1.y - start2.y) * (end1.x - start1.x) - (start1.x - start2.x) * (end1.y - start1.y);\n            var r = num1 / tangensdiff;\n            var s = num2 / tangensdiff;\n            if (isSegment && (r < 0 || r > 1 || s < 0 || s > 1)) {\n                return;\n            }\n            return new Point(start1.x + r * (end1.x - start1.x), start1.y + r * (end1.y - start1.y));\n        }\n        var Intersect = {\n            lines: function (start1, end1, start2, end2) {\n                return intersectLine(start1, end1, start2, end2);\n            },\n            segments: function (start1, end1, start2, end2) {\n                return intersectLine(start1, end1, start2, end2, true);\n            },\n            rectWithLine: function (rect, start, end) {\n                return Intersect.segments(start, end, rect.topLeft(), rect.topRight()) || Intersect.segments(start, end, rect.topRight(), rect.bottomRight()) || Intersect.segments(start, end, rect.bottomLeft(), rect.bottomRight()) || Intersect.segments(start, end, rect.topLeft(), rect.bottomLeft());\n            },\n            rects: function (rect1, rect2, angle) {\n                var tl = rect2.topLeft(), tr = rect2.topRight(), bl = rect2.bottomLeft(), br = rect2.bottomRight();\n                var center = rect2.center();\n                if (angle) {\n                    tl = tl.rotate(center, angle);\n                    tr = tr.rotate(center, angle);\n                    bl = bl.rotate(center, angle);\n                    br = br.rotate(center, angle);\n                }\n                var intersect = rect1.contains(tl) || rect1.contains(tr) || rect1.contains(bl) || rect1.contains(br) || Intersect.rectWithLine(rect1, tl, tr) || Intersect.rectWithLine(rect1, tl, bl) || Intersect.rectWithLine(rect1, tr, br) || Intersect.rectWithLine(rect1, bl, br);\n                if (!intersect) {\n                    tl = rect1.topLeft();\n                    tr = rect1.topRight();\n                    bl = rect1.bottomLeft();\n                    br = rect1.bottomRight();\n                    if (angle) {\n                        var reverseAngle = 360 - angle;\n                        tl = tl.rotate(center, reverseAngle);\n                        tr = tr.rotate(center, reverseAngle);\n                        bl = bl.rotate(center, reverseAngle);\n                        br = br.rotate(center, reverseAngle);\n                    }\n                    intersect = rect2.contains(tl) || rect2.contains(tr) || rect2.contains(bl) || rect2.contains(br);\n                }\n                return intersect;\n            }\n        };\n        var RectAlign = Class.extend({\n            init: function (container) {\n                this.container = Rect.toRect(container);\n            },\n            align: function (content, alignment) {\n                var alignValues = alignment.toLowerCase().split(' ');\n                for (var i = 0; i < alignValues.length; i++) {\n                    content = this._singleAlign(content, alignValues[i]);\n                }\n                return content;\n            },\n            _singleAlign: function (content, alignment) {\n                if (isFunction(this[alignment])) {\n                    return this[alignment](content);\n                } else {\n                    return content;\n                }\n            },\n            left: function (content) {\n                return this._align(content, this._left);\n            },\n            center: function (content) {\n                return this._align(content, this._center);\n            },\n            right: function (content) {\n                return this._align(content, this._right);\n            },\n            stretch: function (content) {\n                return this._align(content, this._stretch);\n            },\n            top: function (content) {\n                return this._align(content, this._top);\n            },\n            middle: function (content) {\n                return this._align(content, this._middle);\n            },\n            bottom: function (content) {\n                return this._align(content, this._bottom);\n            },\n            _left: function (container, content) {\n                content.x = container.x;\n            },\n            _center: function (container, content) {\n                content.x = (container.width - content.width) / 2 || 0;\n            },\n            _right: function (container, content) {\n                content.x = container.width - content.width;\n            },\n            _top: function (container, content) {\n                content.y = container.y;\n            },\n            _middle: function (container, content) {\n                content.y = (container.height - content.height) / 2 || 0;\n            },\n            _bottom: function (container, content) {\n                content.y = container.height - content.height;\n            },\n            _stretch: function (container, content) {\n                content.x = 0;\n                content.y = 0;\n                content.height = container.height;\n                content.width = container.width;\n            },\n            _align: function (content, alignCalc) {\n                content = Rect.toRect(content);\n                alignCalc(this.container, content);\n                return content;\n            }\n        });\n        var Polar = Class.extend({\n            init: function (r, a) {\n                this.r = r;\n                this.angle = a;\n            }\n        });\n        var Matrix = Class.extend({\n            init: function (a, b, c, d, e, f) {\n                this.a = a || 0;\n                this.b = b || 0;\n                this.c = c || 0;\n                this.d = d || 0;\n                this.e = e || 0;\n                this.f = f || 0;\n            },\n            plus: function (m) {\n                this.a += m.a;\n                this.b += m.b;\n                this.c += m.c;\n                this.d += m.d;\n                this.e += m.e;\n                this.f += m.f;\n            },\n            minus: function (m) {\n                this.a -= m.a;\n                this.b -= m.b;\n                this.c -= m.c;\n                this.d -= m.d;\n                this.e -= m.e;\n                this.f -= m.f;\n            },\n            times: function (m) {\n                return new Matrix(this.a * m.a + this.c * m.b, this.b * m.a + this.d * m.b, this.a * m.c + this.c * m.d, this.b * m.c + this.d * m.d, this.a * m.e + this.c * m.f + this.e, this.b * m.e + this.d * m.f + this.f);\n            },\n            apply: function (p) {\n                return new Point(this.a * p.x + this.c * p.y + this.e, this.b * p.x + this.d * p.y + this.f);\n            },\n            applyRect: function (r) {\n                return Rect.fromPoints(this.apply(r.topLeft()), this.apply(r.bottomRight()));\n            },\n            toString: function () {\n                return 'matrix(' + this.a + ' ' + this.b + ' ' + this.c + ' ' + this.d + ' ' + this.e + ' ' + this.f + ')';\n            }\n        });\n        deepExtend(Matrix, {\n            fromSVGMatrix: function (vm) {\n                var m = new Matrix();\n                m.a = vm.a;\n                m.b = vm.b;\n                m.c = vm.c;\n                m.d = vm.d;\n                m.e = vm.e;\n                m.f = vm.f;\n                return m;\n            },\n            fromMatrixVector: function (v) {\n                var m = new Matrix();\n                m.a = v.a;\n                m.b = v.b;\n                m.c = v.c;\n                m.d = v.d;\n                m.e = v.e;\n                m.f = v.f;\n                return m;\n            },\n            fromList: function (v) {\n                if (v.length !== 6) {\n                    throw 'The given list should consist of six elements.';\n                }\n                var m = new Matrix();\n                m.a = v[0];\n                m.b = v[1];\n                m.c = v[2];\n                m.d = v[3];\n                m.e = v[4];\n                m.f = v[5];\n                return m;\n            },\n            translation: function (x, y) {\n                var m = new Matrix();\n                m.a = 1;\n                m.b = 0;\n                m.c = 0;\n                m.d = 1;\n                m.e = x;\n                m.f = y;\n                return m;\n            },\n            unit: function () {\n                return new Matrix(1, 0, 0, 1, 0, 0);\n            },\n            rotation: function (angle, x, y) {\n                var m = new Matrix();\n                m.a = Math.cos(angle * Math.PI / 180);\n                m.b = Math.sin(angle * Math.PI / 180);\n                m.c = -m.b;\n                m.d = m.a;\n                m.e = x - x * m.a + y * m.b || 0;\n                m.f = y - y * m.a - x * m.b || 0;\n                return m;\n            },\n            scaling: function (scaleX, scaleY) {\n                var m = new Matrix();\n                m.a = scaleX;\n                m.b = 0;\n                m.c = 0;\n                m.d = scaleY;\n                m.e = 0;\n                m.f = 0;\n                return m;\n            },\n            parse: function (v) {\n                var parts, nums;\n                if (v) {\n                    v = v.trim();\n                    if (v.slice(0, 6).toLowerCase() === 'matrix') {\n                        nums = v.slice(7, v.length - 1).trim();\n                        parts = nums.split(',');\n                        if (parts.length === 6) {\n                            return Matrix.fromList(map(parts, function (p) {\n                                return parseFloat(p);\n                            }));\n                        }\n                        parts = nums.split(' ');\n                        if (parts.length === 6) {\n                            return Matrix.fromList(map(parts, function (p) {\n                                return parseFloat(p);\n                            }));\n                        }\n                    }\n                    if (v.slice(0, 1) === '(' && v.slice(v.length - 1) === ')') {\n                        v = v.substr(1, v.length - 1);\n                    }\n                    if (v.indexOf(',') > 0) {\n                        parts = v.split(',');\n                        if (parts.length === 6) {\n                            return Matrix.fromList(map(parts, function (p) {\n                                return parseFloat(p);\n                            }));\n                        }\n                    }\n                    if (v.indexOf(' ') > 0) {\n                        parts = v.split(' ');\n                        if (parts.length === 6) {\n                            return Matrix.fromList(map(parts, function (p) {\n                                return parseFloat(p);\n                            }));\n                        }\n                    }\n                }\n                return parts;\n            }\n        });\n        var MatrixVector = Class.extend({\n            init: function (a, b, c, d, e, f) {\n                this.a = a || 0;\n                this.b = b || 0;\n                this.c = c || 0;\n                this.d = d || 0;\n                this.e = e || 0;\n                this.f = f || 0;\n            },\n            fromMatrix: function FromMatrix(m) {\n                var v = new MatrixVector();\n                v.a = m.a;\n                v.b = m.b;\n                v.c = m.c;\n                v.d = m.d;\n                v.e = m.e;\n                v.f = m.f;\n                return v;\n            }\n        });\n        function normalVariable(mean, deviation) {\n            var x, y, r;\n            do {\n                x = Math.random() * 2 - 1;\n                y = Math.random() * 2 - 1;\n                r = x * x + y * y;\n            } while (!r || r > 1);\n            return mean + deviation * x * Math.sqrt(-2 * Math.log(r) / r);\n        }\n        function randomId(length) {\n            if (Utils.isUndefined(length)) {\n                length = 10;\n            }\n            var result = '';\n            var chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';\n            for (var i = length; i > 0; --i) {\n                result += chars.charAt(Math.round(Math.random() * (chars.length - 1)));\n            }\n            return result;\n        }\n        var Geometry = {\n            _distanceToLineSquared: function (p, a, b) {\n                function d2(pt1, pt2) {\n                    return (pt1.x - pt2.x) * (pt1.x - pt2.x) + (pt1.y - pt2.y) * (pt1.y - pt2.y);\n                }\n                if (a === b) {\n                    return d2(p, a);\n                }\n                var vx = b.x - a.x, vy = b.y - a.y, dot = (p.x - a.x) * vx + (p.y - a.y) * vy;\n                if (dot < 0) {\n                    return d2(a, p);\n                }\n                dot = (b.x - p.x) * vx + (b.y - p.y) * vy;\n                if (dot < 0) {\n                    return d2(b, p);\n                }\n                dot = (b.x - p.x) * vy - (b.y - p.y) * vx;\n                return dot * dot / (vx * vx + vy * vy);\n            },\n            distanceToLine: function (p, a, b) {\n                return Math.sqrt(this._distanceToLineSquared(p, a, b));\n            },\n            distanceToPolyline: function (p, points) {\n                var minimum = Number.MAX_VALUE;\n                if (Utils.isUndefined(points) || points.length === 0) {\n                    return Number.MAX_VALUE;\n                }\n                for (var s = 0; s < points.length - 1; s++) {\n                    var p1 = points[s];\n                    var p2 = points[s + 1];\n                    var d = this._distanceToLineSquared(p, p1, p2);\n                    if (d < minimum) {\n                        minimum = d;\n                    }\n                }\n                return Math.sqrt(minimum);\n            }\n        };\n        var HashTable = kendo.Class.extend({\n            init: function () {\n                this._buckets = [];\n                this.length = 0;\n            },\n            add: function (key, value) {\n                var obj = this._createGetBucket(key);\n                if (Utils.isDefined(value)) {\n                    obj.value = value;\n                }\n                return obj;\n            },\n            get: function (key) {\n                if (this._bucketExists(key)) {\n                    return this._createGetBucket(key);\n                }\n                return null;\n            },\n            set: function (key, value) {\n                this.add(key, value);\n            },\n            containsKey: function (key) {\n                return this._bucketExists(key);\n            },\n            remove: function (key) {\n                if (this._bucketExists(key)) {\n                    var hashId = this._hash(key);\n                    delete this._buckets[hashId];\n                    this.length--;\n                    return key;\n                }\n            },\n            forEach: function (func) {\n                var hashes = this._hashes();\n                for (var i = 0, len = hashes.length; i < len; i++) {\n                    var hash = hashes[i];\n                    var bucket = this._buckets[hash];\n                    if (Utils.isUndefined(bucket)) {\n                        continue;\n                    }\n                    func(bucket);\n                }\n            },\n            clone: function () {\n                var ht = new HashTable();\n                var hashes = this._hashes();\n                for (var i = 0, len = hashes.length; i < len; i++) {\n                    var hash = hashes[i];\n                    var bucket = this._buckets[hash];\n                    if (Utils.isUndefined(bucket)) {\n                        continue;\n                    }\n                    ht.add(bucket.key, bucket.value);\n                }\n                return ht;\n            },\n            _hashes: function () {\n                var hashes = [];\n                for (var hash in this._buckets) {\n                    if (this._buckets.hasOwnProperty(hash)) {\n                        hashes.push(hash);\n                    }\n                }\n                return hashes;\n            },\n            _bucketExists: function (key) {\n                var hashId = this._hash(key);\n                return Utils.isDefined(this._buckets[hashId]);\n            },\n            _createGetBucket: function (key) {\n                var hashId = this._hash(key);\n                var bucket = this._buckets[hashId];\n                if (Utils.isUndefined(bucket)) {\n                    bucket = { key: key };\n                    this._buckets[hashId] = bucket;\n                    this.length++;\n                }\n                return bucket;\n            },\n            _hash: function (key) {\n                if (Utils.isNumber(key)) {\n                    return key;\n                }\n                if (Utils.isString(key)) {\n                    return this._hashString(key);\n                }\n                if (Utils.isObject(key)) {\n                    return this._objectHashId(key);\n                }\n                throw 'Unsupported key type.';\n            },\n            _hashString: function (s) {\n                var result = 0;\n                if (s.length === 0) {\n                    return result;\n                }\n                for (var i = 0; i < s.length; i++) {\n                    var ch = s.charCodeAt(i);\n                    result = result * 32 - result + ch;\n                }\n                return result;\n            },\n            _objectHashId: function (key) {\n                var id = key._hashId;\n                if (Utils.isUndefined(id)) {\n                    id = randomId();\n                    key._hashId = id;\n                }\n                return id;\n            }\n        });\n        var Dictionary = kendo.Observable.extend({\n            init: function (dictionary) {\n                var that = this;\n                kendo.Observable.fn.init.call(that);\n                this._hashTable = new HashTable();\n                this.length = 0;\n                if (Utils.isDefined(dictionary)) {\n                    if ($.isArray(dictionary)) {\n                        for (var i = 0; i < dictionary.length; i++) {\n                            this.add(dictionary[i]);\n                        }\n                    } else {\n                        dictionary.forEach(function (k, v) {\n                            this.add(k, v);\n                        }, this);\n                    }\n                }\n            },\n            add: function (key, value) {\n                var entry = this._hashTable.get(key);\n                if (!entry) {\n                    entry = this._hashTable.add(key);\n                    this.length++;\n                    this.trigger('changed');\n                }\n                entry.value = value;\n            },\n            set: function (key, value) {\n                this.add(key, value);\n            },\n            get: function (key) {\n                var entry = this._hashTable.get(key);\n                if (entry) {\n                    return entry.value;\n                }\n                throw new Error('Cannot find key ' + key);\n            },\n            containsKey: function (key) {\n                return this._hashTable.containsKey(key);\n            },\n            remove: function (key) {\n                if (this.containsKey(key)) {\n                    this.trigger('changed');\n                    this.length--;\n                    return this._hashTable.remove(key);\n                }\n            },\n            forEach: function (func, thisRef) {\n                this._hashTable.forEach(function (entry) {\n                    func.call(thisRef, entry.key, entry.value);\n                });\n            },\n            forEachValue: function (func, thisRef) {\n                this._hashTable.forEach(function (entry) {\n                    func.call(thisRef, entry.value);\n                });\n            },\n            forEachKey: function (func, thisRef) {\n                this._hashTable.forEach(function (entry) {\n                    func.call(thisRef, entry.key);\n                });\n            },\n            keys: function () {\n                var keys = [];\n                this.forEachKey(function (key) {\n                    keys.push(key);\n                });\n                return keys;\n            }\n        });\n        var Queue = kendo.Class.extend({\n            init: function () {\n                this._tail = null;\n                this._head = null;\n                this.length = 0;\n            },\n            enqueue: function (value) {\n                var entry = {\n                    value: value,\n                    next: null\n                };\n                if (!this._head) {\n                    this._head = entry;\n                    this._tail = this._head;\n                } else {\n                    this._tail.next = entry;\n                    this._tail = this._tail.next;\n                }\n                this.length++;\n            },\n            dequeue: function () {\n                if (this.length < 1) {\n                    throw new Error('The queue is empty.');\n                }\n                var value = this._head.value;\n                this._head = this._head.next;\n                this.length--;\n                return value;\n            },\n            contains: function (item) {\n                var current = this._head;\n                while (current) {\n                    if (current.value === item) {\n                        return true;\n                    }\n                    current = current.next;\n                }\n                return false;\n            }\n        });\n        var Set = kendo.Observable.extend({\n            init: function (resource) {\n                var that = this;\n                kendo.Observable.fn.init.call(that);\n                this._hashTable = new HashTable();\n                this.length = 0;\n                if (Utils.isDefined(resource)) {\n                    if (resource instanceof HashTable) {\n                        resource.forEach(function (d) {\n                            this.add(d);\n                        });\n                    } else if (resource instanceof Dictionary) {\n                        resource.forEach(function (k, v) {\n                            this.add({\n                                key: k,\n                                value: v\n                            });\n                        }, this);\n                    }\n                }\n            },\n            contains: function (item) {\n                return this._hashTable.containsKey(item);\n            },\n            add: function (item) {\n                var entry = this._hashTable.get(item);\n                if (!entry) {\n                    this._hashTable.add(item, item);\n                    this.length++;\n                    this.trigger('changed');\n                }\n            },\n            get: function (item) {\n                if (this.contains(item)) {\n                    return this._hashTable.get(item).value;\n                } else {\n                    return null;\n                }\n            },\n            hash: function (item) {\n                return this._hashTable._hash(item);\n            },\n            remove: function (item) {\n                if (this.contains(item)) {\n                    this._hashTable.remove(item);\n                    this.length--;\n                    this.trigger('changed');\n                }\n            },\n            forEach: function (func, context) {\n                this._hashTable.forEach(function (kv) {\n                    func(kv.value);\n                }, context);\n            },\n            toArray: function () {\n                var r = [];\n                this.forEach(function (d) {\n                    r.push(d);\n                });\n                return r;\n            }\n        });\n        var Node = kendo.Class.extend({\n            init: function (id, shape) {\n                this.links = [];\n                this.outgoing = [];\n                this.incoming = [];\n                this.weight = 1;\n                if (Utils.isDefined(id)) {\n                    this.id = id;\n                } else {\n                    this.id = randomId();\n                }\n                if (Utils.isDefined(shape)) {\n                    this.associatedShape = shape;\n                    var b = shape.bounds();\n                    this.width = b.width;\n                    this.height = b.height;\n                    this.x = b.x;\n                    this.y = b.y;\n                } else {\n                    this.associatedShape = null;\n                }\n                this.data = null;\n                this.type = 'Node';\n                this.shortForm = 'Node \\'' + this.id + '\\'';\n                this.isVirtual = false;\n            },\n            isIsolated: function () {\n                return Utils.isEmpty(this.links);\n            },\n            bounds: function (r) {\n                if (!Utils.isDefined(r)) {\n                    return new diagram.Rect(this.x, this.y, this.width, this.height);\n                }\n                this.x = r.x;\n                this.y = r.y;\n                this.width = r.width;\n                this.height = r.height;\n            },\n            isLinkedTo: function (node) {\n                var that = this;\n                return Utils.any(that.links, function (link) {\n                    return link.getComplement(that) === node;\n                });\n            },\n            getChildren: function () {\n                if (this.outgoing.length === 0) {\n                    return [];\n                }\n                var children = [];\n                for (var i = 0, len = this.outgoing.length; i < len; i++) {\n                    var link = this.outgoing[i];\n                    children.push(link.getComplement(this));\n                }\n                return children;\n            },\n            getParents: function () {\n                if (this.incoming.length === 0) {\n                    return [];\n                }\n                var parents = [];\n                for (var i = 0, len = this.incoming.length; i < len; i++) {\n                    var link = this.incoming[i];\n                    parents.push(link.getComplement(this));\n                }\n                return parents;\n            },\n            clone: function () {\n                var copy = new Node();\n                if (Utils.isDefined(this.weight)) {\n                    copy.weight = this.weight;\n                }\n                if (Utils.isDefined(this.balance)) {\n                    copy.balance = this.balance;\n                }\n                if (Utils.isDefined(this.owner)) {\n                    copy.owner = this.owner;\n                }\n                copy.associatedShape = this.associatedShape;\n                copy.x = this.x;\n                copy.y = this.y;\n                copy.width = this.width;\n                copy.height = this.height;\n                return copy;\n            },\n            adjacentTo: function (node) {\n                return this.isLinkedTo(node) !== null;\n            },\n            removeLink: function (link) {\n                if (link.source === this) {\n                    Utils.remove(this.links, link);\n                    Utils.remove(this.outgoing, link);\n                    link.source = null;\n                }\n                if (link.target === this) {\n                    Utils.remove(this.links, link);\n                    Utils.remove(this.incoming, link);\n                    link.target = null;\n                }\n            },\n            hasLinkTo: function (node) {\n                return Utils.any(this.outgoing, function (link) {\n                    return link.target === node;\n                });\n            },\n            degree: function () {\n                return this.links.length;\n            },\n            incidentWith: function (link) {\n                return contains(this.links, link);\n            },\n            getLinksWith: function (node) {\n                return Utils.all(this.links, function (link) {\n                    return link.getComplement(this) === node;\n                }, this);\n            },\n            getNeighbors: function () {\n                var neighbors = [];\n                Utils.forEach(this.incoming, function (e) {\n                    neighbors.push(e.getComplement(this));\n                }, this);\n                Utils.forEach(this.outgoing, function (e) {\n                    neighbors.push(e.getComplement(this));\n                }, this);\n                return neighbors;\n            }\n        });\n        var Link = kendo.Class.extend({\n            init: function (source, target, id, connection) {\n                if (Utils.isUndefined(source)) {\n                    throw 'The source of the new link is not set.';\n                }\n                if (Utils.isUndefined(target)) {\n                    throw 'The target of the new link is not set.';\n                }\n                var sourceFound, targetFound;\n                if (Utils.isString(source)) {\n                    sourceFound = new Node(source);\n                } else {\n                    sourceFound = source;\n                }\n                if (Utils.isString(target)) {\n                    targetFound = new Node(target);\n                } else {\n                    targetFound = target;\n                }\n                this.source = sourceFound;\n                this.target = targetFound;\n                this.source.links.push(this);\n                this.target.links.push(this);\n                this.source.outgoing.push(this);\n                this.target.incoming.push(this);\n                if (Utils.isDefined(id)) {\n                    this.id = id;\n                } else {\n                    this.id = randomId();\n                }\n                if (Utils.isDefined(connection)) {\n                    this.associatedConnection = connection;\n                } else {\n                    this.associatedConnection = null;\n                }\n                this.type = 'Link';\n                this.shortForm = 'Link \\'' + this.source.id + '->' + this.target.id + '\\'';\n            },\n            getComplement: function (node) {\n                if (this.source !== node && this.target !== node) {\n                    throw 'The given node is not incident with this link.';\n                }\n                return this.source === node ? this.target : this.source;\n            },\n            getCommonNode: function (link) {\n                if (this.source === link.source || this.source === link.target) {\n                    return this.source;\n                }\n                if (this.target === link.source || this.target === link.target) {\n                    return this.target;\n                }\n                return null;\n            },\n            isBridging: function (v1, v2) {\n                return this.source === v1 && this.target === v2 || this.source === v2 && this.target === v1;\n            },\n            getNodes: function () {\n                return [\n                    this.source,\n                    this.target\n                ];\n            },\n            incidentWith: function (node) {\n                return this.source === node || this.target === node;\n            },\n            adjacentTo: function (link) {\n                return contains(this.source.links, link) || contains(this.target.links, link);\n            },\n            changeSource: function (node) {\n                Utils.remove(this.source.links, this);\n                Utils.remove(this.source.outgoing, this);\n                node.links.push(this);\n                node.outgoing.push(this);\n                this.source = node;\n            },\n            changeTarget: function (node) {\n                Utils.remove(this.target.links, this);\n                Utils.remove(this.target.incoming, this);\n                node.links.push(this);\n                node.incoming.push(this);\n                this.target = node;\n            },\n            changesNodes: function (v, w) {\n                if (this.source === v) {\n                    this.changeSource(w);\n                } else if (this.target === v) {\n                    this.changeTarget(w);\n                }\n            },\n            reverse: function () {\n                var oldSource = this.source;\n                var oldTarget = this.target;\n                this.source = oldTarget;\n                Utils.remove(oldSource.outgoing, this);\n                this.source.outgoing.push(this);\n                this.target = oldSource;\n                Utils.remove(oldTarget.incoming, this);\n                this.target.incoming.push(this);\n                return this;\n            },\n            directTo: function (target) {\n                if (this.source !== target && this.target !== target) {\n                    throw 'The given node is not incident with this link.';\n                }\n                if (this.target !== target) {\n                    this.reverse();\n                }\n            },\n            createReverseEdge: function () {\n                var r = this.clone();\n                r.reverse();\n                r.reversed = true;\n                return r;\n            },\n            clone: function () {\n                var clone = new Link(this.source, this.target);\n                return clone;\n            }\n        });\n        var Graph = kendo.Class.extend({\n            init: function (idOrDiagram) {\n                this.links = [];\n                this.nodes = [];\n                this._nodeMap = new Dictionary();\n                this.diagram = null;\n                this._root = null;\n                if (Utils.isDefined(idOrDiagram)) {\n                    if (Utils.isString(idOrDiagram)) {\n                        this.id = idOrDiagram;\n                    } else {\n                        this.diagram = idOrDiagram;\n                        this.id = idOrDiagram.id;\n                    }\n                } else {\n                    this.id = randomId();\n                }\n                this.bounds = new Rect();\n                this._hasCachedRelationships = false;\n                this.type = 'Graph';\n            },\n            cacheRelationships: function (forceRebuild) {\n                if (Utils.isUndefined(forceRebuild)) {\n                    forceRebuild = false;\n                }\n                if (this._hasCachedRelationships && !forceRebuild) {\n                    return;\n                }\n                for (var i = 0, len = this.nodes.length; i < len; i++) {\n                    var node = this.nodes[i];\n                    node.children = this.getChildren(node);\n                    node.parents = this.getParents(node);\n                }\n                this._hasCachedRelationships = true;\n            },\n            assignLevels: function (startNode, offset, visited) {\n                if (!startNode) {\n                    throw 'Start node not specified.';\n                }\n                if (Utils.isUndefined(offset)) {\n                    offset = 0;\n                }\n                this.cacheRelationships();\n                if (Utils.isUndefined(visited)) {\n                    visited = new Dictionary();\n                    Utils.forEach(this.nodes, function (n) {\n                        visited.add(n, false);\n                    });\n                }\n                visited.set(startNode, true);\n                startNode.level = offset;\n                var children = startNode.children;\n                for (var i = 0, len = children.length; i < len; i++) {\n                    var child = children[i];\n                    if (!child || visited.get(child)) {\n                        continue;\n                    }\n                    this.assignLevels(child, offset + 1, visited);\n                }\n            },\n            root: function (value) {\n                if (Utils.isUndefined(value)) {\n                    if (!this._root) {\n                        var found = Utils.first(this.nodes, function (n) {\n                            return n.incoming.length === 0;\n                        });\n                        if (found) {\n                            return found;\n                        }\n                        return Utils.first(this.nodes);\n                    } else {\n                        return this._root;\n                    }\n                } else {\n                    this._root = value;\n                }\n            },\n            getConnectedComponents: function () {\n                this.componentIndex = 0;\n                this.setItemIndices();\n                var componentId = Utils.initArray(this.nodes.length, -1);\n                for (var v = 0; v < this.nodes.length; v++) {\n                    if (componentId[v] === -1) {\n                        this._collectConnectedNodes(componentId, v);\n                        this.componentIndex++;\n                    }\n                }\n                var components = [], i;\n                for (i = 0; i < this.componentIndex; ++i) {\n                    components[i] = new Graph();\n                }\n                for (i = 0; i < componentId.length; ++i) {\n                    var graph = components[componentId[i]];\n                    graph.addNodeAndOutgoings(this.nodes[i]);\n                }\n                components.sort(function (a, b) {\n                    return b.nodes.length - a.nodes.length;\n                });\n                return components;\n            },\n            _collectConnectedNodes: function (setIds, nodeIndex) {\n                setIds[nodeIndex] = this.componentIndex;\n                var node = this.nodes[nodeIndex];\n                Utils.forEach(node.links, function (link) {\n                    var next = link.getComplement(node);\n                    var nextId = next.index;\n                    if (setIds[nextId] === -1) {\n                        this._collectConnectedNodes(setIds, nextId);\n                    }\n                }, this);\n            },\n            calcBounds: function () {\n                if (this.isEmpty()) {\n                    this.bounds = new Rect();\n                    return this.bounds;\n                }\n                var b = null;\n                for (var i = 0, len = this.nodes.length; i < len; i++) {\n                    var node = this.nodes[i];\n                    if (!b) {\n                        b = node.bounds();\n                    } else {\n                        b = b.union(node.bounds());\n                    }\n                }\n                this.bounds = b;\n                return this.bounds;\n            },\n            getSpanningTree: function (root) {\n                var tree = new Graph();\n                var map = new Dictionary(), source, target;\n                tree.root = root.clone();\n                tree.root.level = 0;\n                tree.root.id = root.id;\n                map.add(root, tree.root);\n                root.level = 0;\n                var visited = [];\n                var remaining = [];\n                tree._addNode(tree.root);\n                visited.push(root);\n                remaining.push(root);\n                var levelCount = 1;\n                while (remaining.length > 0) {\n                    var next = remaining.pop();\n                    for (var ni = 0; ni < next.links.length; ni++) {\n                        var link = next.links[ni];\n                        var cn = link.getComplement(next);\n                        if (contains(visited, cn)) {\n                            continue;\n                        }\n                        cn.level = next.level + 1;\n                        if (levelCount < cn.level + 1) {\n                            levelCount = cn.level + 1;\n                        }\n                        if (!contains(remaining, cn)) {\n                            remaining.push(cn);\n                        }\n                        if (!contains(visited, cn)) {\n                            visited.push(cn);\n                        }\n                        if (map.containsKey(next)) {\n                            source = map.get(next);\n                        } else {\n                            source = next.clone();\n                            source.level = next.level;\n                            source.id = next.id;\n                            map.add(next, source);\n                        }\n                        if (map.containsKey(cn)) {\n                            target = map.get(cn);\n                        } else {\n                            target = cn.clone();\n                            target.level = cn.level;\n                            target.id = cn.id;\n                            map.add(cn, target);\n                        }\n                        var newLink = new Link(source, target);\n                        tree.addLink(newLink);\n                    }\n                }\n                var treeLevels = [];\n                for (var i = 0; i < levelCount; i++) {\n                    treeLevels.push([]);\n                }\n                Utils.forEach(tree.nodes, function (node) {\n                    treeLevels[node.level].push(node);\n                });\n                tree.treeLevels = treeLevels;\n                tree.cacheRelationships();\n                return tree;\n            },\n            takeRandomNode: function (excludedNodes, incidenceLessThan) {\n                if (Utils.isUndefined(excludedNodes)) {\n                    excludedNodes = [];\n                }\n                if (Utils.isUndefined(incidenceLessThan)) {\n                    incidenceLessThan = 4;\n                }\n                if (this.nodes.length === 0) {\n                    return null;\n                }\n                if (this.nodes.length === 1) {\n                    return contains(excludedNodes, this.nodes[0]) ? null : this.nodes[0];\n                }\n                var pool = $.grep(this.nodes, function (node) {\n                    return !contains(excludedNodes, node) && node.degree() <= incidenceLessThan;\n                });\n                if (Utils.isEmpty(pool)) {\n                    return null;\n                }\n                return pool[Utils.randomInteger(0, pool.length)];\n            },\n            isEmpty: function () {\n                return Utils.isEmpty(this.nodes);\n            },\n            isHealthy: function () {\n                return Utils.all(this.links, function (link) {\n                    return contains(this.nodes, link.source) && contains(this.nodes, link.target);\n                }, this);\n            },\n            getParents: function (n) {\n                if (!this.hasNode(n)) {\n                    throw 'The given node is not part of this graph.';\n                }\n                return n.getParents();\n            },\n            getChildren: function (n) {\n                if (!this.hasNode(n)) {\n                    throw 'The given node is not part of this graph.';\n                }\n                return n.getChildren();\n            },\n            addLink: function (sourceOrLink, target, owner) {\n                if (Utils.isUndefined(sourceOrLink)) {\n                    throw 'The source of the link is not defined.';\n                }\n                if (Utils.isUndefined(target)) {\n                    if (Utils.isDefined(sourceOrLink.type) && sourceOrLink.type === 'Link') {\n                        this.addExistingLink(sourceOrLink);\n                        return;\n                    } else {\n                        throw 'The target of the link is not defined.';\n                    }\n                }\n                var foundSource = this.getNode(sourceOrLink);\n                if (Utils.isUndefined(foundSource)) {\n                    foundSource = this.addNode(sourceOrLink);\n                }\n                var foundTarget = this.getNode(target);\n                if (Utils.isUndefined(foundTarget)) {\n                    foundTarget = this.addNode(target);\n                }\n                var newLink = new Link(foundSource, foundTarget);\n                if (Utils.isDefined(owner)) {\n                    newLink.owner = owner;\n                }\n                this.links.push(newLink);\n                return newLink;\n            },\n            removeAllLinks: function () {\n                while (this.links.length > 0) {\n                    var link = this.links[0];\n                    this.removeLink(link);\n                }\n            },\n            addExistingLink: function (link) {\n                if (this.hasLink(link)) {\n                    return;\n                }\n                this.links.push(link);\n                if (this.hasNode(link.source.id)) {\n                    var s = this.getNode(link.source.id);\n                    link.changeSource(s);\n                } else {\n                    this.addNode(link.source);\n                }\n                if (this.hasNode(link.target.id)) {\n                    var t = this.getNode(link.target.id);\n                    link.changeTarget(t);\n                } else {\n                    this.addNode(link.target);\n                }\n            },\n            hasLink: function (linkOrId) {\n                if (Utils.isString(linkOrId)) {\n                    return Utils.any(this.links, function (link) {\n                        return link.id === linkOrId;\n                    });\n                }\n                if (linkOrId.type === 'Link') {\n                    return contains(this.links, linkOrId);\n                }\n                throw 'The given object is neither an identifier nor a Link.';\n            },\n            getNode: function (nodeOrId) {\n                var id = nodeOrId.id || nodeOrId;\n                if (this._nodeMap.containsKey(id)) {\n                    return this._nodeMap.get(id);\n                }\n            },\n            hasNode: function (nodeOrId) {\n                var id = nodeOrId.id || nodeOrId;\n                return this._nodeMap.containsKey(id);\n            },\n            _addNode: function (node) {\n                this.nodes.push(node);\n                this._nodeMap.add(node.id, node);\n            },\n            _removeNode: function (node) {\n                Utils.remove(this.nodes, node);\n                this._nodeMap.remove(node.id);\n            },\n            removeNode: function (nodeOrId) {\n                var n = nodeOrId;\n                if (Utils.isString(nodeOrId)) {\n                    n = this.getNode(nodeOrId);\n                }\n                if (Utils.isDefined(n)) {\n                    var links = n.links;\n                    n.links = [];\n                    for (var i = 0, len = links.length; i < len; i++) {\n                        var link = links[i];\n                        this.removeLink(link);\n                    }\n                    this._removeNode(n);\n                } else {\n                    throw 'The identifier should be a Node or the Id (string) of a node.';\n                }\n            },\n            areConnected: function (n1, n2) {\n                return Utils.any(this.links, function (link) {\n                    return link.source == n1 && link.target == n2 || link.source == n2 && link.target == n1;\n                });\n            },\n            removeLink: function (link) {\n                Utils.remove(this.links, link);\n                Utils.remove(link.source.outgoing, link);\n                Utils.remove(link.source.links, link);\n                Utils.remove(link.target.incoming, link);\n                Utils.remove(link.target.links, link);\n            },\n            addNode: function (nodeOrId, layoutRect, owner) {\n                var newNode = null;\n                if (!Utils.isDefined(nodeOrId)) {\n                    throw 'No Node or identifier for a new Node is given.';\n                }\n                if (Utils.isString(nodeOrId)) {\n                    if (this.hasNode(nodeOrId)) {\n                        return this.getNode(nodeOrId);\n                    }\n                    newNode = new Node(nodeOrId);\n                } else {\n                    if (this.hasNode(nodeOrId)) {\n                        return this.getNode(nodeOrId);\n                    }\n                    newNode = nodeOrId;\n                }\n                if (Utils.isDefined(layoutRect)) {\n                    newNode.bounds(layoutRect);\n                }\n                if (Utils.isDefined(owner)) {\n                    newNode.owner = owner;\n                }\n                this._addNode(newNode);\n                return newNode;\n            },\n            addNodeAndOutgoings: function (node) {\n                if (!this.hasNode(node)) {\n                    this._addNode(node);\n                }\n                var newLinks = node.outgoing;\n                node.outgoing = [];\n                Utils.forEach(newLinks, function (link) {\n                    this.addExistingLink(link);\n                }, this);\n            },\n            setItemIndices: function () {\n                var i;\n                for (i = 0; i < this.nodes.length; ++i) {\n                    this.nodes[i].index = i;\n                }\n                for (i = 0; i < this.links.length; ++i) {\n                    this.links[i].index = i;\n                }\n            },\n            clone: function (saveMapping) {\n                var copy = new Graph();\n                var save = Utils.isDefined(saveMapping) && saveMapping === true;\n                if (save) {\n                    copy.nodeMap = new Dictionary();\n                    copy.linkMap = new Dictionary();\n                }\n                var map = new Dictionary();\n                Utils.forEach(this.nodes, function (nOriginal) {\n                    var nCopy = nOriginal.clone();\n                    map.set(nOriginal, nCopy);\n                    copy._addNode(nCopy);\n                    if (save) {\n                        copy.nodeMap.set(nCopy, nOriginal);\n                    }\n                });\n                Utils.forEach(this.links, function (linkOriginal) {\n                    if (map.containsKey(linkOriginal.source) && map.containsKey(linkOriginal.target)) {\n                        var linkCopy = copy.addLink(map.get(linkOriginal.source), map.get(linkOriginal.target));\n                        if (save) {\n                            copy.linkMap.set(linkCopy, linkOriginal);\n                        }\n                    }\n                });\n                return copy;\n            },\n            linearize: function (addIds) {\n                return Graph.Utils.linearize(this, addIds);\n            },\n            depthFirstTraversal: function (startNode, action) {\n                if (Utils.isUndefined(startNode)) {\n                    throw 'You need to supply a starting node.';\n                }\n                if (Utils.isUndefined(action)) {\n                    throw 'You need to supply an action.';\n                }\n                if (!this.hasNode(startNode)) {\n                    throw 'The given start-node is not part of this graph';\n                }\n                var foundNode = this.getNode(startNode);\n                var visited = [];\n                this._dftIterator(foundNode, action, visited);\n            },\n            _dftIterator: function (node, action, visited) {\n                action(node);\n                visited.push(node);\n                var children = node.getChildren();\n                for (var i = 0, len = children.length; i < len; i++) {\n                    var child = children[i];\n                    if (contains(visited, child)) {\n                        continue;\n                    }\n                    this._dftIterator(child, action, visited);\n                }\n            },\n            breadthFirstTraversal: function (startNode, action) {\n                if (Utils.isUndefined(startNode)) {\n                    throw 'You need to supply a starting node.';\n                }\n                if (Utils.isUndefined(action)) {\n                    throw 'You need to supply an action.';\n                }\n                if (!this.hasNode(startNode)) {\n                    throw 'The given start-node is not part of this graph';\n                }\n                var foundNode = this.getNode(startNode);\n                var queue = new Queue();\n                var visited = [];\n                queue.enqueue(foundNode);\n                while (queue.length > 0) {\n                    var node = queue.dequeue();\n                    action(node);\n                    visited.push(node);\n                    var children = node.getChildren();\n                    for (var i = 0, len = children.length; i < len; i++) {\n                        var child = children[i];\n                        if (contains(visited, child) || contains(queue, child)) {\n                            continue;\n                        }\n                        queue.enqueue(child);\n                    }\n                }\n            },\n            _stronglyConnectedComponents: function (excludeSingleItems, node, indices, lowLinks, connected, stack, index) {\n                indices.add(node, index);\n                lowLinks.add(node, index);\n                index++;\n                stack.push(node);\n                var children = node.getChildren(), next;\n                for (var i = 0, len = children.length; i < len; i++) {\n                    next = children[i];\n                    if (!indices.containsKey(next)) {\n                        this._stronglyConnectedComponents(excludeSingleItems, next, indices, lowLinks, connected, stack, index);\n                        lowLinks.add(node, Math.min(lowLinks.get(node), lowLinks.get(next)));\n                    } else if (contains(stack, next)) {\n                        lowLinks.add(node, Math.min(lowLinks.get(node), indices.get(next)));\n                    }\n                }\n                if (lowLinks.get(node) === indices.get(node)) {\n                    var component = [];\n                    do {\n                        next = stack.pop();\n                        component.push(next);\n                    } while (next !== node);\n                    if (!excludeSingleItems || component.length > 1) {\n                        connected.push(component);\n                    }\n                }\n            },\n            findCycles: function (excludeSingleItems) {\n                if (Utils.isUndefined(excludeSingleItems)) {\n                    excludeSingleItems = true;\n                }\n                var indices = new Dictionary();\n                var lowLinks = new Dictionary();\n                var connected = [];\n                var stack = [];\n                for (var i = 0, len = this.nodes.length; i < len; i++) {\n                    var node = this.nodes[i];\n                    if (indices.containsKey(node)) {\n                        continue;\n                    }\n                    this._stronglyConnectedComponents(excludeSingleItems, node, indices, lowLinks, connected, stack, 0);\n                }\n                return connected;\n            },\n            isAcyclic: function () {\n                return Utils.isEmpty(this.findCycles());\n            },\n            isSubGraph: function (other) {\n                var otherArray = other.linearize();\n                var thisArray = this.linearize();\n                return Utils.all(otherArray, function (s) {\n                    return contains(thisArray, s);\n                });\n            },\n            makeAcyclic: function () {\n                if (this.isEmpty() || this.nodes.length <= 1 || this.links.length <= 1) {\n                    return [];\n                }\n                if (this.nodes.length == 2) {\n                    var result = [];\n                    if (this.links.length > 1) {\n                        var oneLink = this.links[0];\n                        var oneNode = oneLink.source;\n                        for (var i = 0, len = this.links.length; i < len; i++) {\n                            var link = this.links[i];\n                            if (link.source == oneNode) {\n                                continue;\n                            }\n                            var rev = link.reverse();\n                            result.push(rev);\n                        }\n                    }\n                    return result;\n                }\n                var copy = this.clone(true);\n                var N = this.nodes.length;\n                var intensityCatalog = new Dictionary();\n                var flowIntensity = function (node) {\n                    if (node.outgoing.length === 0) {\n                        return 2 - N;\n                    } else if (node.incoming.length === 0) {\n                        return N - 2;\n                    } else {\n                        return node.outgoing.length - node.incoming.length;\n                    }\n                };\n                var catalogEqualIntensity = function (node, intensityCatalog) {\n                    var intensity = flowIntensity(node, N);\n                    if (!intensityCatalog.containsKey(intensity)) {\n                        intensityCatalog.set(intensity, []);\n                    }\n                    intensityCatalog.get(intensity).push(node);\n                };\n                Utils.forEach(copy.nodes, function (v) {\n                    catalogEqualIntensity(v, intensityCatalog);\n                });\n                var sourceStack = [];\n                var targetStack = [];\n                while (copy.nodes.length > 0) {\n                    var source, target, intensity;\n                    if (intensityCatalog.containsKey(2 - N)) {\n                        var targets = intensityCatalog.get(2 - N);\n                        while (targets.length > 0) {\n                            target = targets.pop();\n                            for (var li = 0; li < target.links.length; li++) {\n                                var targetLink = target.links[li];\n                                source = targetLink.getComplement(target);\n                                intensity = flowIntensity(source, N);\n                                Utils.remove(intensityCatalog.get(intensity), source);\n                                source.removeLink(targetLink);\n                                catalogEqualIntensity(source, intensityCatalog);\n                            }\n                            copy._removeNode(target);\n                            targetStack.unshift(target);\n                        }\n                    }\n                    if (intensityCatalog.containsKey(N - 2)) {\n                        var sources = intensityCatalog.get(N - 2);\n                        while (sources.length > 0) {\n                            source = sources.pop();\n                            for (var si = 0; si < source.links.length; si++) {\n                                var sourceLink = source.links[si];\n                                target = sourceLink.getComplement(source);\n                                intensity = flowIntensity(target, N);\n                                Utils.remove(intensityCatalog.get(intensity), target);\n                                target.removeLink(sourceLink);\n                                catalogEqualIntensity(target, intensityCatalog);\n                            }\n                            sourceStack.push(source);\n                            copy._removeNode(source);\n                        }\n                    }\n                    if (copy.nodes.length > 0) {\n                        for (var k = N - 3; k > 2 - N; k--) {\n                            if (intensityCatalog.containsKey(k) && intensityCatalog.get(k).length > 0) {\n                                var maxdiff = intensityCatalog.get(k);\n                                var v = maxdiff.pop();\n                                for (var ri = 0; ri < v.links.length; ri++) {\n                                    var ril = v.links[ri];\n                                    var u = ril.getComplement(v);\n                                    intensity = flowIntensity(u, N);\n                                    Utils.remove(intensityCatalog.get(intensity), u);\n                                    u.removeLink(ril);\n                                    catalogEqualIntensity(u, intensityCatalog);\n                                }\n                                sourceStack.push(v);\n                                copy._removeNode(v);\n                                break;\n                            }\n                        }\n                    }\n                }\n                sourceStack = sourceStack.concat(targetStack);\n                var vertexOrder = new Dictionary();\n                for (var kk = 0; kk < this.nodes.length; kk++) {\n                    vertexOrder.set(copy.nodeMap.get(sourceStack[kk]), kk);\n                }\n                var reversedEdges = [];\n                Utils.forEach(this.links, function (link) {\n                    if (vertexOrder.get(link.source) > vertexOrder.get(link.target)) {\n                        link.reverse();\n                        reversedEdges.push(link);\n                    }\n                });\n                return reversedEdges;\n            }\n        });\n        Graph.Predefined = {\n            EightGraph: function () {\n                return Graph.Utils.parse([\n                    '1->2',\n                    '2->3',\n                    '3->4',\n                    '4->1',\n                    '3->5',\n                    '5->6',\n                    '6->7',\n                    '7->3'\n                ]);\n            },\n            Mindmap: function () {\n                return Graph.Utils.parse([\n                    '0->1',\n                    '0->2',\n                    '0->3',\n                    '0->4',\n                    '0->5',\n                    '1->6',\n                    '1->7',\n                    '7->8',\n                    '2->9',\n                    '9->10',\n                    '9->11',\n                    '3->12',\n                    '12->13',\n                    '13->14',\n                    '4->15',\n                    '4->16',\n                    '15->17',\n                    '15->18',\n                    '18->19',\n                    '18->20',\n                    '14->21',\n                    '14->22',\n                    '5->23',\n                    '23->24',\n                    '23->25',\n                    '6->26'\n                ]);\n            },\n            ThreeGraph: function () {\n                return Graph.Utils.parse([\n                    '1->2',\n                    '2->3',\n                    '3->1'\n                ]);\n            },\n            BinaryTree: function (levels) {\n                if (Utils.isUndefined(levels)) {\n                    levels = 5;\n                }\n                return Graph.Utils.createBalancedTree(levels, 2);\n            },\n            Linear: function (length) {\n                if (Utils.isUndefined(length)) {\n                    length = 10;\n                }\n                return Graph.Utils.createBalancedTree(length, 1);\n            },\n            Tree: function (levels, siblingsCount) {\n                return Graph.Utils.createBalancedTree(levels, siblingsCount);\n            },\n            Forest: function (levels, siblingsCount, trees) {\n                return Graph.Utils.createBalancedForest(levels, siblingsCount, trees);\n            },\n            Workflow: function () {\n                return Graph.Utils.parse([\n                    '0->1',\n                    '1->2',\n                    '2->3',\n                    '1->4',\n                    '4->3',\n                    '3->5',\n                    '5->6',\n                    '6->3',\n                    '6->7',\n                    '5->4'\n                ]);\n            },\n            Grid: function (n, m) {\n                var g = new diagram.Graph();\n                if (n <= 0 && m <= 0) {\n                    return g;\n                }\n                for (var i = 0; i < n + 1; i++) {\n                    var previous = null;\n                    for (var j = 0; j < m + 1; j++) {\n                        var node = new Node(i.toString() + '.' + j.toString());\n                        g.addNode(node);\n                        if (previous) {\n                            g.addLink(previous, node);\n                        }\n                        if (i > 0) {\n                            var left = g.getNode((i - 1).toString() + '.' + j.toString());\n                            g.addLink(left, node);\n                        }\n                        previous = node;\n                    }\n                }\n                return g;\n            }\n        };\n        Graph.Utils = {\n            parse: function (graphString) {\n                var previousLink, graph = new diagram.Graph(), parts = graphString.slice();\n                for (var i = 0, len = parts.length; i < len; i++) {\n                    var part = parts[i];\n                    if (Utils.isString(part)) {\n                        if (part.indexOf('->') < 0) {\n                            throw 'The link should be specified as \\'a->b\\'.';\n                        }\n                        var p = part.split('->');\n                        if (p.length != 2) {\n                            throw 'The link should be specified as \\'a->b\\'.';\n                        }\n                        previousLink = new Link(p[0], p[1]);\n                        graph.addLink(previousLink);\n                    }\n                    if (Utils.isObject(part)) {\n                        if (!previousLink) {\n                            throw 'Specification found before Link definition.';\n                        }\n                        kendo.deepExtend(previousLink, part);\n                    }\n                }\n                return graph;\n            },\n            linearize: function (graph, addIds) {\n                if (Utils.isUndefined(graph)) {\n                    throw 'Expected an instance of a Graph object in slot one.';\n                }\n                if (Utils.isUndefined(addIds)) {\n                    addIds = false;\n                }\n                var lin = [];\n                for (var i = 0, len = graph.links.length; i < len; i++) {\n                    var link = graph.links[i];\n                    lin.push(link.source.id + '->' + link.target.id);\n                    if (addIds) {\n                        lin.push({ id: link.id });\n                    }\n                }\n                return lin;\n            },\n            _addShape: function (kendoDiagram, p, id, shapeDefaults) {\n                if (Utils.isUndefined(p)) {\n                    p = new diagram.Point(0, 0);\n                }\n                if (Utils.isUndefined(id)) {\n                    id = randomId();\n                }\n                shapeDefaults = kendo.deepExtend({\n                    width: 20,\n                    height: 20,\n                    id: id,\n                    radius: 10,\n                    fill: '#778899',\n                    data: 'circle',\n                    undoable: false,\n                    x: p.x,\n                    y: p.y\n                }, shapeDefaults);\n                return kendoDiagram.addShape(shapeDefaults);\n            },\n            _addConnection: function (diagram, from, to, options) {\n                return diagram.connect(from, to, options);\n            },\n            createDiagramFromGraph: function (diagram, graph, doLayout, randomSize) {\n                if (Utils.isUndefined(diagram)) {\n                    throw 'The diagram surface is undefined.';\n                }\n                if (Utils.isUndefined(graph)) {\n                    throw 'No graph specification defined.';\n                }\n                if (Utils.isUndefined(doLayout)) {\n                    doLayout = true;\n                }\n                if (Utils.isUndefined(randomSize)) {\n                    randomSize = false;\n                }\n                var width = diagram.element.clientWidth || 200;\n                var height = diagram.element.clientHeight || 200;\n                var map = [], node, shape;\n                for (var i = 0, len = graph.nodes.length; i < len; i++) {\n                    node = graph.nodes[i];\n                    var p = node.position;\n                    if (Utils.isUndefined(p)) {\n                        if (Utils.isDefined(node.x) && Utils.isDefined(node.y)) {\n                            p = new Point(node.x, node.y);\n                        } else {\n                            p = new Point(Utils.randomInteger(10, width - 20), Utils.randomInteger(10, height - 20));\n                        }\n                    }\n                    var opt = {};\n                    if (node.id === '0') {\n                    } else if (randomSize) {\n                        kendo.deepExtend(opt, {\n                            width: Math.random() * 150 + 20,\n                            height: Math.random() * 80 + 50,\n                            data: 'rectangle',\n                            fill: { color: '#778899' }\n                        });\n                    }\n                    shape = this._addShape(diagram, p, node.id, opt);\n                    var bounds = shape.bounds();\n                    if (Utils.isDefined(bounds)) {\n                        node.x = bounds.x;\n                        node.y = bounds.y;\n                        node.width = bounds.width;\n                        node.height = bounds.height;\n                    }\n                    map[node.id] = shape;\n                }\n                for (var gli = 0; gli < graph.links.length; gli++) {\n                    var link = graph.links[gli];\n                    var sourceShape = map[link.source.id];\n                    if (Utils.isUndefined(sourceShape)) {\n                        continue;\n                    }\n                    var targetShape = map[link.target.id];\n                    if (Utils.isUndefined(targetShape)) {\n                        continue;\n                    }\n                    this._addConnection(diagram, sourceShape, targetShape, { id: link.id });\n                }\n                if (doLayout) {\n                    var l = new diagram.SpringLayout(diagram);\n                    l.layoutGraph(graph, { limitToView: false });\n                    for (var shi = 0; shi < graph.nodes.length; shi++) {\n                        node = graph.nodes[shi];\n                        shape = map[node.id];\n                        shape.bounds(new Rect(node.x, node.y, node.width, node.height));\n                    }\n                }\n            },\n            createBalancedTree: function (levels, siblingsCount) {\n                if (Utils.isUndefined(levels)) {\n                    levels = 3;\n                }\n                if (Utils.isUndefined(siblingsCount)) {\n                    siblingsCount = 3;\n                }\n                var g = new diagram.Graph(), counter = -1, lastAdded = [], news;\n                if (levels <= 0 || siblingsCount <= 0) {\n                    return g;\n                }\n                var root = new Node((++counter).toString());\n                g.addNode(root);\n                g.root = root;\n                lastAdded.push(root);\n                for (var i = 0; i < levels; i++) {\n                    news = [];\n                    for (var j = 0; j < lastAdded.length; j++) {\n                        var parent = lastAdded[j];\n                        for (var k = 0; k < siblingsCount; k++) {\n                            var item = new Node((++counter).toString());\n                            g.addLink(parent, item);\n                            news.push(item);\n                        }\n                    }\n                    lastAdded = news;\n                }\n                return g;\n            },\n            createBalancedForest: function (levels, siblingsCount, treeCount) {\n                if (Utils.isUndefined(levels)) {\n                    levels = 3;\n                }\n                if (Utils.isUndefined(siblingsCount)) {\n                    siblingsCount = 3;\n                }\n                if (Utils.isUndefined(treeCount)) {\n                    treeCount = 5;\n                }\n                var g = new diagram.Graph(), counter = -1, lastAdded = [], news;\n                if (levels <= 0 || siblingsCount <= 0 || treeCount <= 0) {\n                    return g;\n                }\n                for (var t = 0; t < treeCount; t++) {\n                    var root = new Node((++counter).toString());\n                    g.addNode(root);\n                    lastAdded = [root];\n                    for (var i = 0; i < levels; i++) {\n                        news = [];\n                        for (var j = 0; j < lastAdded.length; j++) {\n                            var parent = lastAdded[j];\n                            for (var k = 0; k < siblingsCount; k++) {\n                                var item = new Node((++counter).toString());\n                                g.addLink(parent, item);\n                                news.push(item);\n                            }\n                        }\n                        lastAdded = news;\n                    }\n                }\n                return g;\n            },\n            createRandomConnectedGraph: function (nodeCount, maxIncidence, isTree) {\n                if (Utils.isUndefined(nodeCount)) {\n                    nodeCount = 40;\n                }\n                if (Utils.isUndefined(maxIncidence)) {\n                    maxIncidence = 4;\n                }\n                if (Utils.isUndefined(isTree)) {\n                    isTree = false;\n                }\n                var g = new diagram.Graph(), counter = -1;\n                if (nodeCount <= 0) {\n                    return g;\n                }\n                var root = new Node((++counter).toString());\n                g.addNode(root);\n                if (nodeCount === 1) {\n                    return g;\n                }\n                if (nodeCount > 1) {\n                    for (var i = 1; i < nodeCount; i++) {\n                        var poolNode = g.takeRandomNode([], maxIncidence);\n                        if (!poolNode) {\n                            break;\n                        }\n                        var newNode = g.addNode(i.toString());\n                        g.addLink(poolNode, newNode);\n                    }\n                    if (!isTree && nodeCount > 1) {\n                        var randomAdditions = Utils.randomInteger(1, nodeCount);\n                        for (var ri = 0; ri < randomAdditions; ri++) {\n                            var n1 = g.takeRandomNode([], maxIncidence);\n                            var n2 = g.takeRandomNode([], maxIncidence);\n                            if (n1 && n2 && !g.areConnected(n1, n2)) {\n                                g.addLink(n1, n2);\n                            }\n                        }\n                    }\n                    return g;\n                }\n            },\n            randomDiagram: function (diagram, shapeCount, maxIncidence, isTree, randomSize) {\n                var g = kendo.dataviz.diagram.Graph.Utils.createRandomConnectedGraph(shapeCount, maxIncidence, isTree);\n                Graph.Utils.createDiagramFromGraph(diagram, g, false, randomSize);\n            }\n        };\n        kendo.deepExtend(diagram, {\n            init: function (element) {\n                kendo.init(element, diagram.ui);\n            },\n            Point: Point,\n            Intersect: Intersect,\n            Geometry: Geometry,\n            Rect: Rect,\n            Size: Size,\n            RectAlign: RectAlign,\n            Matrix: Matrix,\n            MatrixVector: MatrixVector,\n            normalVariable: normalVariable,\n            randomId: randomId,\n            Dictionary: Dictionary,\n            HashTable: HashTable,\n            Queue: Queue,\n            Set: Set,\n            Node: Node,\n            Link: Link,\n            Graph: Graph,\n            PathDefiner: PathDefiner\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/diagram/svg', [\n        'kendo.drawing',\n        'dataviz/diagram/math'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, diagram = kendo.dataviz.diagram, Class = kendo.Class, deepExtend = kendo.deepExtend, Point = diagram.Point, Rect = diagram.Rect, Matrix = diagram.Matrix, Utils = diagram.Utils, isNumber = Utils.isNumber, isString = Utils.isString, MatrixVector = diagram.MatrixVector, g = kendo.geometry, d = kendo.drawing, defined = d.util.defined, inArray = $.inArray;\n        var TRANSPARENT = 'transparent', Markers = {\n                none: 'none',\n                arrowStart: 'ArrowStart',\n                filledCircle: 'FilledCircle',\n                arrowEnd: 'ArrowEnd'\n            }, FULL_CIRCLE_ANGLE = 360, START = 'start', END = 'end', WIDTH = 'width', HEIGHT = 'height', X = 'x', Y = 'y';\n        diagram.Markers = Markers;\n        function diffNumericOptions(options, fields) {\n            var elementOptions = this.options;\n            var hasChanges = false;\n            var value, field;\n            for (var i = 0; i < fields.length; i++) {\n                field = fields[i];\n                value = options[field];\n                if (isNumber(value) && elementOptions[field] !== value) {\n                    elementOptions[field] = value;\n                    hasChanges = true;\n                }\n            }\n            return hasChanges;\n        }\n        var Scale = Class.extend({\n            init: function (x, y) {\n                this.x = x;\n                this.y = y;\n            },\n            toMatrix: function () {\n                return Matrix.scaling(this.x, this.y);\n            },\n            toString: function () {\n                return kendo.format('scale({0},{1})', this.x, this.y);\n            },\n            invert: function () {\n                return new Scale(1 / this.x, 1 / this.y);\n            }\n        });\n        var Translation = Class.extend({\n            init: function (x, y) {\n                this.x = x;\n                this.y = y;\n            },\n            toMatrixVector: function () {\n                return new MatrixVector(0, 0, 0, 0, this.x, this.y);\n            },\n            toMatrix: function () {\n                return Matrix.translation(this.x, this.y);\n            },\n            toString: function () {\n                return kendo.format('translate({0},{1})', this.x, this.y);\n            },\n            plus: function (delta) {\n                this.x += delta.x;\n                this.y += delta.y;\n            },\n            times: function (factor) {\n                this.x *= factor;\n                this.y *= factor;\n            },\n            length: function () {\n                return Math.sqrt(this.x * this.x + this.y * this.y);\n            },\n            normalize: function () {\n                if (this.Length === 0) {\n                    return;\n                }\n                this.times(1 / this.length());\n            },\n            invert: function () {\n                return new Translation(-this.x, -this.y);\n            }\n        });\n        var Rotation = Class.extend({\n            init: function (angle, x, y) {\n                this.x = x || 0;\n                this.y = y || 0;\n                this.angle = angle;\n            },\n            toString: function () {\n                if (this.x && this.y) {\n                    return kendo.format('rotate({0},{1},{2})', this.angle, this.x, this.y);\n                } else {\n                    return kendo.format('rotate({0})', this.angle);\n                }\n            },\n            toMatrix: function () {\n                return Matrix.rotation(this.angle, this.x, this.y);\n            },\n            center: function () {\n                return new Point(this.x, this.y);\n            },\n            invert: function () {\n                return new Rotation(FULL_CIRCLE_ANGLE - this.angle, this.x, this.y);\n            }\n        });\n        Rotation.ZERO = new Rotation(0);\n        Rotation.create = function (rotation) {\n            return new Rotation(rotation.angle, rotation.x, rotation.y);\n        };\n        Rotation.parse = function (str) {\n            var values = str.slice(1, str.length - 1).split(','), angle = values[0], x = values[1], y = values[2];\n            var rotation = new Rotation(angle, x, y);\n            return rotation;\n        };\n        var CompositeTransform = Class.extend({\n            init: function (x, y, scaleX, scaleY, angle, center) {\n                this.translate = new Translation(x, y);\n                if (scaleX !== undefined && scaleY !== undefined) {\n                    this.scale = new Scale(scaleX, scaleY);\n                }\n                if (angle !== undefined) {\n                    this.rotate = center ? new Rotation(angle, center.x, center.y) : new Rotation(angle);\n                }\n            },\n            toString: function () {\n                var toString = function (transform) {\n                    return transform ? transform.toString() : '';\n                };\n                return toString(this.translate) + toString(this.rotate) + toString(this.scale);\n            },\n            render: function (visual) {\n                visual._transform = this;\n                visual._renderTransform();\n            },\n            toMatrix: function () {\n                var m = Matrix.unit();\n                if (this.translate) {\n                    m = m.times(this.translate.toMatrix());\n                }\n                if (this.rotate) {\n                    m = m.times(this.rotate.toMatrix());\n                }\n                if (this.scale) {\n                    m = m.times(this.scale.toMatrix());\n                }\n                return m;\n            },\n            invert: function () {\n                var rotate = this.rotate ? this.rotate.invert() : undefined, rotateMatrix = rotate ? rotate.toMatrix() : Matrix.unit(), scale = this.scale ? this.scale.invert() : undefined, scaleMatrix = scale ? scale.toMatrix() : Matrix.unit();\n                var translatePoint = new Point(-this.translate.x, -this.translate.y);\n                translatePoint = rotateMatrix.times(scaleMatrix).apply(translatePoint);\n                var translate = new Translation(translatePoint.x, translatePoint.y);\n                var transform = new CompositeTransform();\n                transform.translate = translate;\n                transform.rotate = rotate;\n                transform.scale = scale;\n                return transform;\n            }\n        });\n        var AutoSizeableMixin = {\n            _setScale: function () {\n                var options = this.options;\n                var originWidth = this._originWidth;\n                var originHeight = this._originHeight;\n                var scaleX = options.width / originWidth;\n                var scaleY = options.height / originHeight;\n                if (!isNumber(scaleX)) {\n                    scaleX = 1;\n                }\n                if (!isNumber(scaleY)) {\n                    scaleY = 1;\n                }\n                this._transform.scale = new Scale(scaleX, scaleY);\n            },\n            _setTranslate: function () {\n                var options = this.options;\n                var x = options.x || 0;\n                var y = options.y || 0;\n                this._transform.translate = new Translation(x, y);\n            },\n            _initSize: function () {\n                var options = this.options;\n                var transform = false;\n                if (options.autoSize !== false && (defined(options.width) || defined(options.height))) {\n                    this._measure(true);\n                    this._setScale();\n                    transform = true;\n                }\n                if (defined(options.x) || defined(options.y)) {\n                    this._setTranslate();\n                    transform = true;\n                }\n                if (transform) {\n                    this._renderTransform();\n                }\n            },\n            _updateSize: function (options) {\n                var update = false;\n                if (this.options.autoSize !== false && this._diffNumericOptions(options, [\n                        WIDTH,\n                        HEIGHT\n                    ])) {\n                    update = true;\n                    this._measure(true);\n                    this._setScale();\n                }\n                if (this._diffNumericOptions(options, [\n                        X,\n                        Y\n                    ])) {\n                    update = true;\n                    this._setTranslate();\n                }\n                if (update) {\n                    this._renderTransform();\n                }\n                return update;\n            }\n        };\n        var Element = Class.extend({\n            init: function (options) {\n                var element = this;\n                element.options = deepExtend({}, element.options, options);\n                element.id = element.options.id;\n                element._originSize = Rect.empty();\n                element._transform = new CompositeTransform();\n            },\n            visible: function (value) {\n                return this.drawingContainer().visible(value);\n            },\n            redraw: function (options) {\n                if (options && options.id) {\n                    this.id = options.id;\n                }\n            },\n            position: function (x, y) {\n                var options = this.options;\n                if (!defined(x)) {\n                    return new Point(options.x, options.y);\n                }\n                if (defined(y)) {\n                    options.x = x;\n                    options.y = y;\n                } else if (x instanceof Point) {\n                    options.x = x.x;\n                    options.y = x.y;\n                }\n                this._transform.translate = new Translation(options.x, options.y);\n                this._renderTransform();\n            },\n            rotate: function (angle, center) {\n                if (defined(angle)) {\n                    this._transform.rotate = new Rotation(angle, center.x, center.y);\n                    this._renderTransform();\n                }\n                return this._transform.rotate || Rotation.ZERO;\n            },\n            drawingContainer: function () {\n                return this.drawingElement;\n            },\n            _renderTransform: function () {\n                var matrix = this._transform.toMatrix();\n                this.drawingContainer().transform(new g.Matrix(matrix.a, matrix.b, matrix.c, matrix.d, matrix.e, matrix.f));\n            },\n            _hover: function () {\n            },\n            _diffNumericOptions: diffNumericOptions,\n            _measure: function (force) {\n                var rect;\n                if (!this._measured || force) {\n                    var box = this._boundingBox() || new g.Rect();\n                    var startPoint = box.topLeft();\n                    rect = new Rect(startPoint.x, startPoint.y, box.width(), box.height());\n                    this._originSize = rect;\n                    this._originWidth = rect.width;\n                    this._originHeight = rect.height;\n                    this._measured = true;\n                } else {\n                    rect = this._originSize;\n                }\n                return rect;\n            },\n            _boundingBox: function () {\n                return this.drawingElement.rawBBox();\n            }\n        });\n        var VisualBase = Element.extend({\n            init: function (options) {\n                Element.fn.init.call(this, options);\n                options = this.options;\n                options.fill = normalizeDrawingOptions(options.fill);\n                options.stroke = normalizeDrawingOptions(options.stroke);\n            },\n            options: {\n                stroke: {\n                    color: 'gray',\n                    width: 1\n                },\n                fill: { color: TRANSPARENT }\n            },\n            fill: function (color, opacity) {\n                this._fill({\n                    color: getColor(color),\n                    opacity: opacity\n                });\n            },\n            stroke: function (color, width, opacity) {\n                this._stroke({\n                    color: getColor(color),\n                    width: width,\n                    opacity: opacity\n                });\n            },\n            redraw: function (options) {\n                if (options) {\n                    var stroke = options.stroke;\n                    var fill = options.fill;\n                    if (stroke) {\n                        this._stroke(normalizeDrawingOptions(stroke));\n                    }\n                    if (fill) {\n                        this._fill(normalizeDrawingOptions(fill));\n                    }\n                    Element.fn.redraw.call(this, options);\n                }\n            },\n            _hover: function (show) {\n                var drawingElement = this.drawingElement;\n                var options = this.options;\n                var hover = options.hover;\n                if (hover && hover.fill) {\n                    var fill = show ? normalizeDrawingOptions(hover.fill) : options.fill;\n                    drawingElement.fill(fill.color, fill.opacity);\n                }\n            },\n            _stroke: function (strokeOptions) {\n                var options = this.options;\n                deepExtend(options, { stroke: strokeOptions });\n                strokeOptions = options.stroke;\n                var stroke = null;\n                if (strokeOptions.width > 0) {\n                    stroke = {\n                        color: strokeOptions.color,\n                        width: strokeOptions.width,\n                        opacity: strokeOptions.opacity,\n                        dashType: strokeOptions.dashType\n                    };\n                }\n                this.drawingElement.options.set('stroke', stroke);\n            },\n            _fill: function (fillOptions) {\n                var options = this.options;\n                deepExtend(options, { fill: fillOptions || {} });\n                var fill = options.fill;\n                if (fill.gradient) {\n                    var gradient = fill.gradient;\n                    var GradientClass = gradient.type === 'radial' ? d.RadialGradient : d.LinearGradient;\n                    this.drawingElement.fill(new GradientClass(gradient));\n                } else {\n                    this.drawingElement.fill(fill.color, fill.opacity);\n                }\n            }\n        });\n        var TextBlock = VisualBase.extend({\n            init: function (options) {\n                options = this._textColor(options);\n                VisualBase.fn.init.call(this, options);\n                this._font();\n                this._initText();\n                this._initSize();\n            },\n            options: {\n                fontSize: 15,\n                fontFamily: 'sans-serif',\n                stroke: { width: 0 },\n                fill: { color: 'black' },\n                autoSize: true\n            },\n            _initText: function () {\n                var options = this.options;\n                this.drawingElement = new d.Text(defined(options.text) ? options.text : '', new g.Point(), { font: options.font });\n                this._fill();\n                this._stroke();\n            },\n            _textColor: function (options) {\n                if (options && options.color) {\n                    options = deepExtend({}, options, { fill: { color: options.color } });\n                }\n                return options;\n            },\n            _font: function () {\n                var options = this.options;\n                if (options.fontFamily && defined(options.fontSize)) {\n                    var fontOptions = [];\n                    if (options.fontStyle) {\n                        fontOptions.push(options.fontStyle);\n                    }\n                    if (options.fontWeight) {\n                        fontOptions.push(options.fontWeight);\n                    }\n                    fontOptions.push(options.fontSize + (isNumber(options.fontSize) ? 'px' : ''));\n                    fontOptions.push(options.fontFamily);\n                    options.font = fontOptions.join(' ');\n                } else {\n                    delete options.font;\n                }\n            },\n            content: function (text) {\n                return this.drawingElement.content(text);\n            },\n            redraw: function (options) {\n                if (options) {\n                    var sizeChanged = false;\n                    var textOptions = this.options;\n                    options = this._textColor(options);\n                    VisualBase.fn.redraw.call(this, options);\n                    if (options.fontFamily || defined(options.fontSize) || options.fontStyle || options.fontWeight) {\n                        deepExtend(textOptions, {\n                            fontFamily: options.fontFamily,\n                            fontSize: options.fontSize,\n                            fontStyle: options.fontStyle,\n                            fontWeight: options.fontWeight\n                        });\n                        this._font();\n                        this.drawingElement.options.set('font', textOptions.font);\n                        sizeChanged = true;\n                    }\n                    if (options.text) {\n                        this.content(options.text);\n                        sizeChanged = true;\n                    }\n                    if (!this._updateSize(options) && sizeChanged) {\n                        this._initSize();\n                    }\n                }\n            }\n        });\n        deepExtend(TextBlock.fn, AutoSizeableMixin);\n        var Rectangle = VisualBase.extend({\n            init: function (options) {\n                VisualBase.fn.init.call(this, options);\n                this._initPath();\n                this._setPosition();\n            },\n            _setPosition: function () {\n                var options = this.options;\n                var x = options.x;\n                var y = options.y;\n                if (defined(x) || defined(y)) {\n                    this.position(x || 0, y || 0);\n                }\n            },\n            redraw: function (options) {\n                if (options) {\n                    VisualBase.fn.redraw.call(this, options);\n                    if (this._diffNumericOptions(options, [\n                            WIDTH,\n                            HEIGHT\n                        ])) {\n                        this._drawPath();\n                    }\n                    if (this._diffNumericOptions(options, [\n                            X,\n                            Y\n                        ])) {\n                        this._setPosition();\n                    }\n                }\n            },\n            _initPath: function () {\n                var options = this.options;\n                this.drawingElement = new d.Path({\n                    stroke: options.stroke,\n                    closed: true\n                });\n                this._fill();\n                this._drawPath();\n            },\n            _drawPath: function () {\n                var drawingElement = this.drawingElement;\n                var sizeOptions = sizeOptionsOrDefault(this.options);\n                var width = sizeOptions.width;\n                var height = sizeOptions.height;\n                drawingElement.segments.elements([\n                    createSegment(0, 0),\n                    createSegment(width, 0),\n                    createSegment(width, height),\n                    createSegment(0, height)\n                ]);\n            }\n        });\n        var MarkerBase = VisualBase.extend({\n            init: function (options) {\n                VisualBase.fn.init.call(this, options);\n                var anchor = this.options.anchor;\n                this.anchor = new g.Point(anchor.x, anchor.y);\n                this.createElement();\n            },\n            options: {\n                stroke: {\n                    color: TRANSPARENT,\n                    width: 0\n                },\n                fill: { color: 'black' }\n            },\n            _transformToPath: function (point, path) {\n                var transform = path.transform();\n                if (point && transform) {\n                    point = point.transformCopy(transform);\n                }\n                return point;\n            },\n            redraw: function (options) {\n                if (options) {\n                    if (options.position) {\n                        this.options.position = options.position;\n                    }\n                    VisualBase.fn.redraw.call(this, options);\n                }\n            }\n        });\n        var CircleMarker = MarkerBase.extend({\n            options: {\n                radius: 4,\n                anchor: {\n                    x: 0,\n                    y: 0\n                }\n            },\n            createElement: function () {\n                var options = this.options;\n                this.drawingElement = new d.Circle(new g.Circle(this.anchor, options.radius), {\n                    fill: options.fill,\n                    stroke: options.stroke\n                });\n            },\n            positionMarker: function (path) {\n                var options = this.options;\n                var position = options.position;\n                var segments = path.segments;\n                var targetSegment;\n                var point;\n                if (position == START) {\n                    targetSegment = segments[0];\n                } else {\n                    targetSegment = segments[segments.length - 1];\n                }\n                if (targetSegment) {\n                    point = this._transformToPath(targetSegment.anchor(), path);\n                    this.drawingElement.transform(g.transform().translate(point.x, point.y));\n                }\n            }\n        });\n        var ArrowMarker = MarkerBase.extend({\n            options: {\n                path: 'M 0 0 L 10 5 L 0 10 L 3 5 z',\n                anchor: {\n                    x: 10,\n                    y: 5\n                }\n            },\n            createElement: function () {\n                var options = this.options;\n                this.drawingElement = d.Path.parse(options.path, {\n                    fill: options.fill,\n                    stroke: options.stroke\n                });\n            },\n            positionMarker: function (path) {\n                var points = this._linePoints(path);\n                var start = points.start;\n                var end = points.end;\n                var transform = g.transform();\n                if (start) {\n                    transform.rotate(lineAngle(start, end), end);\n                }\n                if (end) {\n                    var anchor = this.anchor;\n                    var translate = end.clone().translate(-anchor.x, -anchor.y);\n                    transform.translate(translate.x, translate.y);\n                }\n                this.drawingElement.transform(transform);\n            },\n            _linePoints: function (path) {\n                var options = this.options;\n                var segments = path.segments;\n                var startPoint, endPoint, targetSegment;\n                if (options.position == START) {\n                    targetSegment = segments[0];\n                    if (targetSegment) {\n                        endPoint = targetSegment.anchor();\n                        startPoint = targetSegment.controlOut();\n                        var nextSegment = segments[1];\n                        if (!startPoint && nextSegment) {\n                            startPoint = nextSegment.anchor();\n                        }\n                    }\n                } else {\n                    targetSegment = segments[segments.length - 1];\n                    if (targetSegment) {\n                        endPoint = targetSegment.anchor();\n                        startPoint = targetSegment.controlIn();\n                        var prevSegment = segments[segments.length - 2];\n                        if (!startPoint && prevSegment) {\n                            startPoint = prevSegment.anchor();\n                        }\n                    }\n                }\n                if (endPoint) {\n                    return {\n                        start: this._transformToPath(startPoint, path),\n                        end: this._transformToPath(endPoint, path)\n                    };\n                }\n            }\n        });\n        var MarkerPathMixin = {\n            _getPath: function (position) {\n                var path = this.drawingElement;\n                if (path instanceof d.MultiPath) {\n                    if (position == START) {\n                        path = path.paths[0];\n                    } else {\n                        path = path.paths[path.paths.length - 1];\n                    }\n                }\n                if (path && path.segments.length) {\n                    return path;\n                }\n            },\n            _normalizeMarkerOptions: function (options) {\n                var startCap = options.startCap;\n                var endCap = options.endCap;\n                if (isString(startCap)) {\n                    options.startCap = { type: startCap };\n                }\n                if (isString(endCap)) {\n                    options.endCap = { type: endCap };\n                }\n            },\n            _removeMarker: function (position) {\n                var marker = this._markers[position];\n                if (marker) {\n                    this.drawingContainer().remove(marker.drawingElement);\n                    delete this._markers[position];\n                }\n            },\n            _createMarkers: function () {\n                var options = this.options;\n                this._normalizeMarkerOptions(options);\n                this._markers = {};\n                this._markers[START] = this._createMarker(options.startCap, START);\n                this._markers[END] = this._createMarker(options.endCap, END);\n            },\n            _createMarker: function (options, position) {\n                var type = (options || {}).type;\n                var path = this._getPath(position);\n                var markerType, marker;\n                if (!path) {\n                    this._removeMarker(position);\n                    return;\n                }\n                if (type == Markers.filledCircle) {\n                    markerType = CircleMarker;\n                } else if (type == Markers.arrowStart || type == Markers.arrowEnd) {\n                    markerType = ArrowMarker;\n                } else {\n                    this._removeMarker(position);\n                }\n                if (markerType) {\n                    marker = new markerType(deepExtend({}, options, { position: position }));\n                    marker.positionMarker(path);\n                    this.drawingContainer().append(marker.drawingElement);\n                    return marker;\n                }\n            },\n            _positionMarker: function (position) {\n                var marker = this._markers[position];\n                if (marker) {\n                    var path = this._getPath(position);\n                    if (path) {\n                        marker.positionMarker(path);\n                    } else {\n                        this._removeMarker(position);\n                    }\n                }\n            },\n            _capMap: {\n                start: 'startCap',\n                end: 'endCap'\n            },\n            _redrawMarker: function (pathChange, position, options) {\n                this._normalizeMarkerOptions(options);\n                var pathOptions = this.options;\n                var cap = this._capMap[position];\n                var pathCapType = (pathOptions[cap] || {}).type;\n                var optionsCap = options[cap];\n                var created = false;\n                if (optionsCap) {\n                    pathOptions[cap] = deepExtend({}, pathOptions[cap], optionsCap);\n                    if (optionsCap.type && pathCapType != optionsCap.type) {\n                        this._removeMarker(position);\n                        this._markers[position] = this._createMarker(pathOptions[cap], position);\n                        created = true;\n                    } else if (this._markers[position]) {\n                        this._markers[position].redraw(optionsCap);\n                    }\n                } else if (pathChange && !this._markers[position] && pathOptions[cap]) {\n                    this._markers[position] = this._createMarker(pathOptions[cap], position);\n                    created = true;\n                }\n                return created;\n            },\n            _redrawMarkers: function (pathChange, options) {\n                if (!this._redrawMarker(pathChange, START, options) && pathChange) {\n                    this._positionMarker(START);\n                }\n                if (!this._redrawMarker(pathChange, END, options) && pathChange) {\n                    this._positionMarker(END);\n                }\n            }\n        };\n        var Path = VisualBase.extend({\n            init: function (options) {\n                VisualBase.fn.init.call(this, options);\n                this.container = new d.Group();\n                this._createElements();\n                this._initSize();\n            },\n            options: { autoSize: true },\n            drawingContainer: function () {\n                return this.container;\n            },\n            data: function (value) {\n                var options = this.options;\n                if (value) {\n                    if (options.data != value) {\n                        options.data = value;\n                        this._setData(value);\n                        this._initSize();\n                        this._redrawMarkers(true, {});\n                    }\n                } else {\n                    return options.data;\n                }\n            },\n            redraw: function (options) {\n                if (options) {\n                    VisualBase.fn.redraw.call(this, options);\n                    var pathOptions = this.options;\n                    var data = options.data;\n                    if (defined(data) && pathOptions.data != data) {\n                        pathOptions.data = data;\n                        this._setData(data);\n                        if (!this._updateSize(options)) {\n                            this._initSize();\n                        }\n                        this._redrawMarkers(true, options);\n                    } else {\n                        this._updateSize(options);\n                        this._redrawMarkers(false, options);\n                    }\n                }\n            },\n            _createElements: function () {\n                var options = this.options;\n                this.drawingElement = d.Path.parse(options.data || '', { stroke: options.stroke });\n                this._fill();\n                this.container.append(this.drawingElement);\n                this._createMarkers();\n            },\n            _setData: function (data) {\n                var drawingElement = this.drawingElement;\n                var multipath = d.Path.parse(data || '');\n                var paths = multipath.paths.slice(0);\n                multipath.paths.elements([]);\n                drawingElement.paths.elements(paths);\n            }\n        });\n        deepExtend(Path.fn, AutoSizeableMixin);\n        deepExtend(Path.fn, MarkerPathMixin);\n        var Line = VisualBase.extend({\n            init: function (options) {\n                VisualBase.fn.init.call(this, options);\n                this.container = new d.Group();\n                this._initPath();\n                this._createMarkers();\n            },\n            drawingContainer: function () {\n                return this.container;\n            },\n            redraw: function (options) {\n                if (options) {\n                    options = options || {};\n                    var from = options.from;\n                    var to = options.to;\n                    if (from) {\n                        this.options.from = from;\n                    }\n                    if (to) {\n                        this.options.to = to;\n                    }\n                    if (from || to) {\n                        this._drawPath();\n                        this._redrawMarkers(true, options);\n                    } else {\n                        this._redrawMarkers(false, options);\n                    }\n                    VisualBase.fn.redraw.call(this, options);\n                }\n            },\n            _initPath: function () {\n                var options = this.options;\n                var drawingElement = this.drawingElement = new d.Path({ stroke: options.stroke });\n                this._fill();\n                this._drawPath();\n                this.container.append(drawingElement);\n            },\n            _drawPath: function () {\n                var options = this.options;\n                var drawingElement = this.drawingElement;\n                var from = options.from || new Point();\n                var to = options.to || new Point();\n                drawingElement.segments.elements([\n                    createSegment(from.x, from.y),\n                    createSegment(to.x, to.y)\n                ]);\n            }\n        });\n        deepExtend(Line.fn, MarkerPathMixin);\n        var Polyline = VisualBase.extend({\n            init: function (options) {\n                VisualBase.fn.init.call(this, options);\n                this.container = new d.Group();\n                this._initPath();\n                this._createMarkers();\n            },\n            drawingContainer: function () {\n                return this.container;\n            },\n            points: function (points) {\n                var options = this.options;\n                if (points) {\n                    options.points = points;\n                    this._updatePath();\n                } else {\n                    return options.points;\n                }\n            },\n            redraw: function (options) {\n                if (options) {\n                    var points = options.points;\n                    VisualBase.fn.redraw.call(this, options);\n                    if (points && this._pointsDiffer(points)) {\n                        this.points(points);\n                        this._redrawMarkers(true, options);\n                    } else {\n                        this._redrawMarkers(false, options);\n                    }\n                }\n            },\n            _initPath: function () {\n                var options = this.options;\n                this.drawingElement = new d.Path({ stroke: options.stroke });\n                this._fill();\n                this.container.append(this.drawingElement);\n                if (options.points) {\n                    this._updatePath();\n                }\n            },\n            _pointsDiffer: function (points) {\n                var currentPoints = this.options.points;\n                var differ = currentPoints.length !== points.length;\n                if (!differ) {\n                    for (var i = 0; i < points.length; i++) {\n                        if (currentPoints[i].x !== points[i].x || currentPoints[i].y !== points[i].y) {\n                            differ = true;\n                            break;\n                        }\n                    }\n                }\n                return differ;\n            },\n            _updatePath: function () {\n                var drawingElement = this.drawingElement;\n                var options = this.options;\n                var points = options.points;\n                var segments = [];\n                var point;\n                for (var i = 0; i < points.length; i++) {\n                    point = points[i];\n                    segments.push(createSegment(point.x, point.y));\n                }\n                drawingElement.segments.elements(segments);\n            },\n            options: { points: [] }\n        });\n        deepExtend(Polyline.fn, MarkerPathMixin);\n        var Image = Element.extend({\n            init: function (options) {\n                Element.fn.init.call(this, options);\n                this._initImage();\n            },\n            redraw: function (options) {\n                if (options) {\n                    if (options.source) {\n                        this.drawingElement.src(options.source);\n                    }\n                    if (this._diffNumericOptions(options, [\n                            WIDTH,\n                            HEIGHT,\n                            X,\n                            Y\n                        ])) {\n                        this.drawingElement.rect(this._rect());\n                    }\n                    Element.fn.redraw.call(this, options);\n                }\n            },\n            _initImage: function () {\n                var options = this.options;\n                var rect = this._rect();\n                this.drawingElement = new d.Image(options.source, rect, {});\n            },\n            _rect: function () {\n                var sizeOptions = sizeOptionsOrDefault(this.options);\n                var origin = new g.Point(sizeOptions.x, sizeOptions.y);\n                var size = new g.Size(sizeOptions.width, sizeOptions.height);\n                return new g.Rect(origin, size);\n            }\n        });\n        var Group = Element.extend({\n            init: function (options) {\n                this.children = [];\n                Element.fn.init.call(this, options);\n                this.drawingElement = new d.Group();\n                this._initSize();\n            },\n            options: { autoSize: false },\n            append: function (visual) {\n                this.drawingElement.append(visual.drawingContainer());\n                this.children.push(visual);\n                this._childrenChange = true;\n            },\n            remove: function (visual) {\n                if (this._remove(visual)) {\n                    this._childrenChange = true;\n                }\n            },\n            _remove: function (visual) {\n                var index = inArray(visual, this.children);\n                if (index >= 0) {\n                    this.drawingElement.removeAt(index);\n                    this.children.splice(index, 1);\n                    return true;\n                }\n            },\n            clear: function () {\n                this.drawingElement.clear();\n                this.children = [];\n                this._childrenChange = true;\n            },\n            toFront: function (visuals) {\n                var visual;\n                for (var i = 0; i < visuals.length; i++) {\n                    visual = visuals[i];\n                    if (this._remove(visual)) {\n                        this.append(visual);\n                    }\n                }\n            },\n            toBack: function (visuals) {\n                this._reorderChildren(visuals, 0);\n            },\n            toIndex: function (visuals, indices) {\n                this._reorderChildren(visuals, indices);\n            },\n            _reorderChildren: function (visuals, indices) {\n                var group = this.drawingElement;\n                var drawingChildren = group.children.slice(0);\n                var children = this.children;\n                var fixedPosition = isNumber(indices);\n                var i, index, toIndex, drawingElement, visual;\n                for (i = 0; i < visuals.length; i++) {\n                    visual = visuals[i];\n                    drawingElement = visual.drawingContainer();\n                    index = inArray(visual, children);\n                    if (index >= 0) {\n                        drawingChildren.splice(index, 1);\n                        children.splice(index, 1);\n                        toIndex = fixedPosition ? indices : indices[i];\n                        drawingChildren.splice(toIndex, 0, drawingElement);\n                        children.splice(toIndex, 0, visual);\n                    }\n                }\n                group.clear();\n                group.append.apply(group, drawingChildren);\n            },\n            redraw: function (options) {\n                if (options) {\n                    if (this._childrenChange) {\n                        this._childrenChange = false;\n                        if (!this._updateSize(options)) {\n                            this._initSize();\n                        }\n                    } else {\n                        this._updateSize(options);\n                    }\n                    Element.fn.redraw.call(this, options);\n                }\n            },\n            _boundingBox: function () {\n                var children = this.children;\n                var boundingBox;\n                var visual, childBoundingBox;\n                for (var i = 0; i < children.length; i++) {\n                    visual = children[i];\n                    if (visual.visible() && visual._includeInBBox !== false) {\n                        childBoundingBox = visual.drawingContainer().clippedBBox(null);\n                        if (childBoundingBox) {\n                            if (boundingBox) {\n                                boundingBox = g.Rect.union(boundingBox, childBoundingBox);\n                            } else {\n                                boundingBox = childBoundingBox;\n                            }\n                        }\n                    }\n                }\n                return boundingBox;\n            }\n        });\n        deepExtend(Group.fn, AutoSizeableMixin);\n        var Layout = Group.extend({\n            init: function (rect, options) {\n                this.children = [];\n                Element.fn.init.call(this, options);\n                this.drawingElement = new d.Layout(toDrawingRect(rect), options);\n                this._initSize();\n            },\n            rect: function (rect) {\n                if (rect) {\n                    this.drawingElement.rect(toDrawingRect(rect));\n                } else {\n                    var drawingRect = this.drawingElement.rect();\n                    if (drawingRect) {\n                        return new Rect(drawingRect.origin.x, drawingRect.origin.y, drawingRect.size.width, drawingRect.size.height);\n                    }\n                }\n            },\n            reflow: function () {\n                this.drawingElement.reflow();\n            },\n            redraw: function (options) {\n                kendo.deepExtend(this.drawingElement.options, options);\n                Group.fn.redraw.call(this, options);\n            }\n        });\n        var Circle = VisualBase.extend({\n            init: function (options) {\n                VisualBase.fn.init.call(this, options);\n                this._initCircle();\n                this._initSize();\n            },\n            redraw: function (options) {\n                if (options) {\n                    var circleOptions = this.options;\n                    if (options.center) {\n                        deepExtend(circleOptions, { center: options.center });\n                        this._center.move(circleOptions.center.x, circleOptions.center.y);\n                    }\n                    if (this._diffNumericOptions(options, ['radius'])) {\n                        this._circle.setRadius(circleOptions.radius);\n                    }\n                    this._updateSize(options);\n                    VisualBase.fn.redraw.call(this, options);\n                }\n            },\n            _initCircle: function () {\n                var options = this.options;\n                var width = options.width;\n                var height = options.height;\n                var radius = options.radius;\n                if (!defined(radius)) {\n                    if (!defined(width)) {\n                        width = height;\n                    }\n                    if (!defined(height)) {\n                        height = width;\n                    }\n                    options.radius = radius = Math.min(width, height) / 2;\n                }\n                var center = options.center || {\n                    x: radius,\n                    y: radius\n                };\n                this._center = new g.Point(center.x, center.y);\n                this._circle = new g.Circle(this._center, radius);\n                this.drawingElement = new d.Circle(this._circle, { stroke: options.stroke });\n                this._fill();\n            }\n        });\n        deepExtend(Circle.fn, AutoSizeableMixin);\n        var Canvas = Class.extend({\n            init: function (element, options) {\n                options = options || {};\n                this.element = element;\n                this.surface = d.Surface.create(element, options);\n                if (kendo.isFunction(this.surface.translate)) {\n                    this.translate = this._translate;\n                }\n                this.drawingElement = new d.Group();\n                this._viewBox = new Rect(0, 0, options.width, options.height);\n                this.size(this._viewBox);\n            },\n            bounds: function () {\n                var box = this.drawingElement.clippedBBox();\n                return new Rect(0, 0, box.width(), box.height());\n            },\n            size: function (size) {\n                var viewBox = this._viewBox;\n                if (defined(size)) {\n                    viewBox.width = size.width;\n                    viewBox.height = size.height;\n                    this.surface.setSize(size);\n                }\n                return {\n                    width: viewBox.width,\n                    height: viewBox.height\n                };\n            },\n            _translate: function (x, y) {\n                var viewBox = this._viewBox;\n                if (defined(x) && defined(y)) {\n                    viewBox.x = x;\n                    viewBox.y = y;\n                    this.surface.translate({\n                        x: x,\n                        y: y\n                    });\n                }\n                return {\n                    x: viewBox.x,\n                    y: viewBox.y\n                };\n            },\n            draw: function () {\n                this.surface.draw(this.drawingElement);\n            },\n            append: function (visual) {\n                this.drawingElement.append(visual.drawingContainer());\n                return this;\n            },\n            remove: function (visual) {\n                this.drawingElement.remove(visual.drawingContainer());\n            },\n            insertBefore: function () {\n            },\n            clear: function () {\n                this.drawingElement.clear();\n            },\n            destroy: function (clearHtml) {\n                this.surface.destroy();\n                if (clearHtml) {\n                    $(this.element).remove();\n                }\n            }\n        });\n        function sizeOptionsOrDefault(options) {\n            return {\n                x: options.x || 0,\n                y: options.y || 0,\n                width: options.width || 0,\n                height: options.height || 0\n            };\n        }\n        function normalizeDrawingOptions(options) {\n            if (options) {\n                var drawingOptions = options;\n                if (isString(drawingOptions)) {\n                    drawingOptions = { color: drawingOptions };\n                }\n                if (drawingOptions.color) {\n                    drawingOptions.color = getColor(drawingOptions.color);\n                }\n                return drawingOptions;\n            }\n        }\n        function getColor(value) {\n            var color;\n            if (value != TRANSPARENT) {\n                color = new d.Color(value).toHex();\n            } else {\n                color = value;\n            }\n            return color;\n        }\n        function lineAngle(p1, p2) {\n            var xDiff = p2.x - p1.x;\n            var yDiff = p2.y - p1.y;\n            var angle = d.util.deg(Math.atan2(yDiff, xDiff));\n            return angle;\n        }\n        function createSegment(x, y) {\n            return new d.Segment(new g.Point(x, y));\n        }\n        function toDrawingRect(rect) {\n            if (rect) {\n                return new g.Rect([\n                    rect.x,\n                    rect.y\n                ], [\n                    rect.width,\n                    rect.height\n                ]);\n            }\n        }\n        kendo.deepExtend(diagram, {\n            init: function (element) {\n                kendo.init(element, diagram.ui);\n            },\n            diffNumericOptions: diffNumericOptions,\n            Element: Element,\n            Scale: Scale,\n            Translation: Translation,\n            Rotation: Rotation,\n            Circle: Circle,\n            Group: Group,\n            Rectangle: Rectangle,\n            Canvas: Canvas,\n            Path: Path,\n            Layout: Layout,\n            Line: Line,\n            MarkerBase: MarkerBase,\n            ArrowMarker: ArrowMarker,\n            CircleMarker: CircleMarker,\n            Polyline: Polyline,\n            CompositeTransform: CompositeTransform,\n            TextBlock: TextBlock,\n            Image: Image,\n            VisualBase: VisualBase\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/diagram/services', [\n        'kendo.drawing',\n        'dataviz/diagram/svg'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, dataviz = kendo.dataviz, diagram = dataviz.diagram, Class = kendo.Class, Group = diagram.Group, Rect = diagram.Rect, Rectangle = diagram.Rectangle, Utils = diagram.Utils, isUndefined = Utils.isUndefined, Point = diagram.Point, Circle = diagram.Circle, Ticker = diagram.Ticker, deepExtend = kendo.deepExtend, Movable = kendo.ui.Movable, browser = kendo.support.browser, util = kendo.drawing.util, defined = util.defined, inArray = $.inArray, proxy = $.proxy;\n        var Cursors = {\n                arrow: 'default',\n                grip: 'pointer',\n                cross: 'pointer',\n                add: 'pointer',\n                move: 'move',\n                select: 'pointer',\n                south: 's-resize',\n                east: 'e-resize',\n                west: 'w-resize',\n                north: 'n-resize',\n                rowresize: 'row-resize',\n                colresize: 'col-resize'\n            }, HIT_TEST_DISTANCE = 10, AUTO = 'Auto', TOP = 'Top', RIGHT = 'Right', LEFT = 'Left', BOTTOM = 'Bottom', DEFAULT_SNAP_SIZE = 10, DEFAULT_SNAP_ANGLE = 10, DRAG_START = 'dragStart', DRAG = 'drag', DRAG_END = 'dragEnd', ITEMROTATE = 'itemRotate', ITEMBOUNDSCHANGE = 'itemBoundsChange', MIN_SNAP_SIZE = 5, MIN_SNAP_ANGLE = 5, MOUSE_ENTER = 'mouseEnter', MOUSE_LEAVE = 'mouseLeave', ZOOM_START = 'zoomStart', ZOOM_END = 'zoomEnd', SCROLL_MIN = -20000, SCROLL_MAX = 20000, FRICTION = 0.9, FRICTION_MOBILE = 0.93, VELOCITY_MULTIPLIER = 5, TRANSPARENT = 'transparent', PAN = 'pan', ROTATED = 'rotated', SOURCE = 'source', TARGET = 'target', HANDLE_NAMES = {\n                '-1': SOURCE,\n                '1': TARGET\n            };\n        diagram.Cursors = Cursors;\n        var PositionAdapter = kendo.Class.extend({\n            init: function (layoutState) {\n                this.layoutState = layoutState;\n                this.diagram = layoutState.diagram;\n            },\n            initState: function () {\n                this.froms = [];\n                this.tos = [];\n                this.subjects = [];\n                function pusher(id, bounds) {\n                    var shape = this.diagram.getShapeById(id);\n                    if (shape) {\n                        this.subjects.push(shape);\n                        this.froms.push(shape.bounds().topLeft());\n                        this.tos.push(bounds.topLeft());\n                    }\n                }\n                this.layoutState.nodeMap.forEach(pusher, this);\n            },\n            update: function (tick) {\n                if (this.subjects.length <= 0) {\n                    return;\n                }\n                for (var i = 0; i < this.subjects.length; i++) {\n                    this.subjects[i].position(new Point(this.froms[i].x + (this.tos[i].x - this.froms[i].x) * tick, this.froms[i].y + (this.tos[i].y - this.froms[i].y) * tick));\n                }\n            }\n        });\n        var LayoutUndoUnit = Class.extend({\n            init: function (initialState, finalState, animate) {\n                if (isUndefined(animate)) {\n                    this.animate = false;\n                } else {\n                    this.animate = animate;\n                }\n                this._initialState = initialState;\n                this._finalState = finalState;\n                this.title = 'Diagram layout';\n            },\n            undo: function () {\n                this.setState(this._initialState);\n            },\n            redo: function () {\n                this.setState(this._finalState);\n            },\n            setState: function (state) {\n                var diagram = state.diagram;\n                if (this.animate) {\n                    state.linkMap.forEach(function (id, points) {\n                        var conn = diagram.getShapeById(id);\n                        conn.visible(false);\n                        if (conn) {\n                            conn.points(points);\n                        }\n                    });\n                    var ticker = new Ticker();\n                    ticker.addAdapter(new PositionAdapter(state));\n                    ticker.onComplete(function () {\n                        state.linkMap.forEach(function (id) {\n                            var conn = diagram.getShapeById(id);\n                            conn.visible(true);\n                        });\n                    });\n                    ticker.play();\n                } else {\n                    state.nodeMap.forEach(function (id, bounds) {\n                        var shape = diagram.getShapeById(id);\n                        if (shape) {\n                            shape.position(bounds.topLeft());\n                        }\n                    });\n                    state.linkMap.forEach(function (id, points) {\n                        var conn = diagram.getShapeById(id);\n                        if (conn) {\n                            conn.points(points);\n                        }\n                    });\n                }\n            }\n        });\n        var CompositeUnit = Class.extend({\n            init: function (unit) {\n                this.units = [];\n                this.title = 'Composite unit';\n                if (unit !== undefined) {\n                    this.units.push(unit);\n                }\n            },\n            add: function (undoUnit) {\n                this.units.push(undoUnit);\n            },\n            undo: function () {\n                for (var i = 0; i < this.units.length; i++) {\n                    this.units[i].undo();\n                }\n            },\n            redo: function () {\n                for (var i = 0; i < this.units.length; i++) {\n                    this.units[i].redo();\n                }\n            }\n        });\n        var ConnectionEditUnit = Class.extend({\n            init: function (item, redoSource, redoTarget) {\n                this.item = item;\n                this._redoSource = redoSource;\n                this._redoTarget = redoTarget;\n                if (defined(redoSource)) {\n                    this._undoSource = item.source();\n                }\n                if (defined(redoTarget)) {\n                    this._undoTarget = item.target();\n                }\n                this.title = 'Connection Editing';\n            },\n            undo: function () {\n                if (this._undoSource !== undefined) {\n                    this.item._updateConnector(this._undoSource, 'source');\n                }\n                if (this._undoTarget !== undefined) {\n                    this.item._updateConnector(this._undoTarget, 'target');\n                }\n                this.item.updateModel();\n            },\n            redo: function () {\n                if (this._redoSource !== undefined) {\n                    this.item._updateConnector(this._redoSource, 'source');\n                }\n                if (this._redoTarget !== undefined) {\n                    this.item._updateConnector(this._redoTarget, 'target');\n                }\n                this.item.updateModel();\n            }\n        });\n        var ConnectionEditUndoUnit = Class.extend({\n            init: function (item, undoSource, undoTarget) {\n                this.item = item;\n                this._undoSource = undoSource;\n                this._undoTarget = undoTarget;\n                this._redoSource = item.source();\n                this._redoTarget = item.target();\n                this.title = 'Connection Editing';\n            },\n            undo: function () {\n                this.item._updateConnector(this._undoSource, 'source');\n                this.item._updateConnector(this._undoTarget, 'target');\n                this.item.updateModel();\n            },\n            redo: function () {\n                this.item._updateConnector(this._redoSource, 'source');\n                this.item._updateConnector(this._redoTarget, 'target');\n                this.item.updateModel();\n            }\n        });\n        var DeleteConnectionUnit = Class.extend({\n            init: function (connection) {\n                this.connection = connection;\n                this.diagram = connection.diagram;\n                this.targetConnector = connection.targetConnector;\n                this.title = 'Delete connection';\n            },\n            undo: function () {\n                this.diagram._addConnection(this.connection, false);\n            },\n            redo: function () {\n                this.diagram.remove(this.connection, false);\n            }\n        });\n        var DeleteShapeUnit = Class.extend({\n            init: function (shape) {\n                this.shape = shape;\n                this.diagram = shape.diagram;\n                this.title = 'Deletion';\n            },\n            undo: function () {\n                this.diagram._addShape(this.shape, false);\n                this.shape.select(false);\n            },\n            redo: function () {\n                this.shape.select(false);\n                this.diagram.remove(this.shape, false);\n            }\n        });\n        var TransformUnit = Class.extend({\n            init: function (shapes, undoStates, adorner) {\n                this.shapes = shapes;\n                this.undoStates = undoStates;\n                this.title = 'Transformation';\n                this.redoStates = [];\n                this.adorner = adorner;\n                for (var i = 0; i < this.shapes.length; i++) {\n                    var shape = this.shapes[i];\n                    this.redoStates.push(shape.bounds());\n                }\n            },\n            undo: function () {\n                for (var i = 0; i < this.shapes.length; i++) {\n                    var shape = this.shapes[i];\n                    shape.bounds(this.undoStates[i]);\n                    if (shape.hasOwnProperty('layout')) {\n                        shape.layout(shape, this.redoStates[i], this.undoStates[i]);\n                    }\n                    shape.updateModel();\n                }\n                if (this.adorner) {\n                    this.adorner.refreshBounds();\n                    this.adorner.refresh();\n                }\n            },\n            redo: function () {\n                for (var i = 0; i < this.shapes.length; i++) {\n                    var shape = this.shapes[i];\n                    shape.bounds(this.redoStates[i]);\n                    if (shape.hasOwnProperty('layout')) {\n                        shape.layout(shape, this.undoStates[i], this.redoStates[i]);\n                    }\n                    shape.updateModel();\n                }\n                if (this.adorner) {\n                    this.adorner.refreshBounds();\n                    this.adorner.refresh();\n                }\n            }\n        });\n        var AddConnectionUnit = Class.extend({\n            init: function (connection, diagram) {\n                this.connection = connection;\n                this.diagram = diagram;\n                this.title = 'New connection';\n            },\n            undo: function () {\n                this.diagram.remove(this.connection, false);\n            },\n            redo: function () {\n                this.diagram._addConnection(this.connection, false);\n            }\n        });\n        var AddShapeUnit = Class.extend({\n            init: function (shape, diagram) {\n                this.shape = shape;\n                this.diagram = diagram;\n                this.title = 'New shape';\n            },\n            undo: function () {\n                this.diagram.deselect();\n                this.diagram.remove(this.shape, false);\n            },\n            redo: function () {\n                this.diagram._addShape(this.shape, false);\n            }\n        });\n        var PanUndoUnit = Class.extend({\n            init: function (initialPosition, finalPosition, diagram) {\n                this.initial = initialPosition;\n                this.finalPos = finalPosition;\n                this.diagram = diagram;\n                this.title = 'Pan Unit';\n            },\n            undo: function () {\n                this.diagram.pan(this.initial);\n            },\n            redo: function () {\n                this.diagram.pan(this.finalPos);\n            }\n        });\n        var RotateUnit = Class.extend({\n            init: function (adorner, shapes, undoRotates) {\n                this.shapes = shapes;\n                this.undoRotates = undoRotates;\n                this.title = 'Rotation';\n                this.redoRotates = [];\n                this.redoAngle = adorner._angle;\n                this.adorner = adorner;\n                this.center = adorner._innerBounds.center();\n                for (var i = 0; i < this.shapes.length; i++) {\n                    var shape = this.shapes[i];\n                    this.redoRotates.push(shape.rotate().angle);\n                }\n            },\n            undo: function () {\n                var i, shape;\n                for (i = 0; i < this.shapes.length; i++) {\n                    shape = this.shapes[i];\n                    shape.rotate(this.undoRotates[i], this.center, false);\n                    if (shape.hasOwnProperty('layout')) {\n                        shape.layout(shape);\n                    }\n                    shape.updateModel();\n                }\n                if (this.adorner) {\n                    this.adorner._initialize();\n                    this.adorner.refresh();\n                }\n            },\n            redo: function () {\n                var i, shape;\n                for (i = 0; i < this.shapes.length; i++) {\n                    shape = this.shapes[i];\n                    shape.rotate(this.redoRotates[i], this.center, false);\n                    if (shape.hasOwnProperty('layout')) {\n                        shape.layout(shape);\n                    }\n                    shape.updateModel();\n                }\n                if (this.adorner) {\n                    this.adorner._initialize();\n                    this.adorner.refresh();\n                }\n            }\n        });\n        var ToFrontUnit = Class.extend({\n            init: function (diagram, items, initialIndices) {\n                this.diagram = diagram;\n                this.indices = initialIndices;\n                this.items = items;\n                this.title = 'Rotate Unit';\n            },\n            undo: function () {\n                this.diagram._toIndex(this.items, this.indices);\n            },\n            redo: function () {\n                this.diagram.toFront(this.items, false);\n            }\n        });\n        var ToBackUnit = Class.extend({\n            init: function (diagram, items, initialIndices) {\n                this.diagram = diagram;\n                this.indices = initialIndices;\n                this.items = items;\n                this.title = 'Rotate Unit';\n            },\n            undo: function () {\n                this.diagram._toIndex(this.items, this.indices);\n            },\n            redo: function () {\n                this.diagram.toBack(this.items, false);\n            }\n        });\n        var UndoRedoService = kendo.Observable.extend({\n            init: function (options) {\n                kendo.Observable.fn.init.call(this, options);\n                this.bind(this.events, options);\n                this.stack = [];\n                this.index = 0;\n                this.capacity = 100;\n            },\n            events: [\n                'undone',\n                'redone'\n            ],\n            begin: function () {\n                this.composite = new CompositeUnit();\n            },\n            cancel: function () {\n                this.composite = undefined;\n            },\n            commit: function (execute) {\n                if (this.composite.units.length > 0) {\n                    this._restart(this.composite, execute);\n                }\n                this.composite = undefined;\n            },\n            addCompositeItem: function (undoUnit) {\n                if (this.composite) {\n                    this.composite.add(undoUnit);\n                } else {\n                    this.add(undoUnit);\n                }\n            },\n            add: function (undoUnit, execute) {\n                this._restart(undoUnit, execute);\n            },\n            pop: function () {\n                if (this.index > 0) {\n                    this.stack.pop();\n                    this.index--;\n                }\n            },\n            count: function () {\n                return this.stack.length;\n            },\n            undo: function () {\n                if (this.index > 0) {\n                    this.index--;\n                    this.stack[this.index].undo();\n                    this.trigger('undone');\n                }\n            },\n            redo: function () {\n                if (this.stack.length > 0 && this.index < this.stack.length) {\n                    this.stack[this.index].redo();\n                    this.index++;\n                    this.trigger('redone');\n                }\n            },\n            _restart: function (composite, execute) {\n                this.stack.splice(this.index, this.stack.length - this.index);\n                this.stack.push(composite);\n                if (execute !== false) {\n                    this.redo();\n                } else {\n                    this.index++;\n                }\n                if (this.stack.length > this.capacity) {\n                    this.stack.splice(0, this.stack.length - this.capacity);\n                    this.index = this.capacity;\n                }\n            },\n            clear: function () {\n                this.stack = [];\n                this.index = 0;\n            }\n        });\n        var EmptyTool = Class.extend({\n            init: function (toolService) {\n                this.toolService = toolService;\n            },\n            start: function () {\n            },\n            move: function () {\n            },\n            end: function () {\n            },\n            tryActivate: function () {\n                return false;\n            },\n            getCursor: function () {\n                return Cursors.arrow;\n            }\n        });\n        var ScrollerTool = EmptyTool.extend({\n            init: function (toolService) {\n                var tool = this;\n                var friction = kendo.support.mobileOS ? FRICTION_MOBILE : FRICTION;\n                EmptyTool.fn.init.call(tool, toolService);\n                var diagram = tool.toolService.diagram, canvas = diagram.canvas;\n                var scroller = diagram.scroller = tool.scroller = $(diagram.scrollable).kendoMobileScroller({\n                    friction: friction,\n                    velocityMultiplier: VELOCITY_MULTIPLIER,\n                    mousewheelScrolling: false,\n                    zoom: false,\n                    scroll: proxy(tool._move, tool)\n                }).data('kendoMobileScroller');\n                if (canvas.translate) {\n                    tool.movableCanvas = new Movable(canvas.element);\n                }\n                var virtualScroll = function (dimension, min, max) {\n                    dimension.makeVirtual();\n                    dimension.virtualSize(min || SCROLL_MIN, max || SCROLL_MAX);\n                };\n                virtualScroll(scroller.dimensions.x);\n                virtualScroll(scroller.dimensions.y);\n                scroller.disable();\n            },\n            tryActivate: function (p, meta) {\n                var toolService = this.toolService;\n                var options = toolService.diagram.options.pannable;\n                var enabled = meta.ctrlKey;\n                if (defined(options.key)) {\n                    if (!options.key || options.key == 'none') {\n                        enabled = noMeta(meta) && !defined(toolService.hoveredItem);\n                    } else {\n                        enabled = meta[options.key + 'Key'];\n                    }\n                }\n                return options !== false && enabled && !defined(toolService.hoveredAdorner) && !defined(toolService._hoveredConnector);\n            },\n            start: function () {\n                this.scroller.enable();\n            },\n            move: function () {\n            },\n            _move: function (args) {\n                var tool = this, diagram = tool.toolService.diagram, canvas = diagram.canvas, scrollPos = new Point(args.scrollLeft, args.scrollTop);\n                if (canvas.translate) {\n                    diagram._storePan(scrollPos.times(-1));\n                    tool.movableCanvas.moveTo(scrollPos);\n                    canvas.translate(scrollPos.x, scrollPos.y);\n                } else {\n                    scrollPos = scrollPos.plus(diagram._pan.times(-1));\n                }\n                diagram.trigger(PAN, { pan: scrollPos });\n            },\n            end: function () {\n                this.scroller.disable();\n            },\n            getCursor: function () {\n                return Cursors.move;\n            }\n        });\n        var PointerTool = Class.extend({\n            init: function (toolService) {\n                this.toolService = toolService;\n            },\n            tryActivate: function () {\n                return true;\n            },\n            start: function (p, meta) {\n                var toolService = this.toolService, diagram = toolService.diagram, hoveredItem = toolService.hoveredItem;\n                if (hoveredItem) {\n                    toolService.selectSingle(hoveredItem, meta);\n                    if (hoveredItem.adorner) {\n                        this.adorner = hoveredItem.adorner;\n                        this.handle = this.adorner._hitTest(p);\n                    }\n                }\n                if (!this.handle) {\n                    this.handle = diagram._resizingAdorner._hitTest(p);\n                    if (this.handle) {\n                        this.adorner = diagram._resizingAdorner;\n                    }\n                }\n                if (this.adorner) {\n                    if (!this.adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_START, {\n                            shapes: this.adorner.shapes,\n                            connections: []\n                        })) {\n                        this.adorner.start(p);\n                    } else {\n                        toolService.startPoint = p;\n                        toolService.end(p);\n                    }\n                }\n            },\n            move: function (p) {\n                if (this.adorner) {\n                    this.adorner.move(this.handle, p);\n                    if (this.adorner.isDragHandle(this.handle)) {\n                        this.toolService.diagram.trigger(DRAG, {\n                            shapes: this.adorner.shapes,\n                            connections: []\n                        });\n                    }\n                }\n            },\n            end: function () {\n                var diagram = this.toolService.diagram, adorner = this.adorner, unit;\n                if (adorner) {\n                    if (!adorner.isDragHandle(this.handle) || !diagram.trigger(DRAG_END, {\n                            shapes: adorner.shapes,\n                            connections: []\n                        })) {\n                        unit = adorner.stop();\n                        if (unit) {\n                            diagram.undoRedoService.add(unit, false);\n                        }\n                    } else {\n                        adorner.cancel();\n                    }\n                }\n                this.adorner = undefined;\n                this.handle = undefined;\n            },\n            getCursor: function (p) {\n                return this.toolService.hoveredItem ? this.toolService.hoveredItem._getCursor(p) : Cursors.arrow;\n            }\n        });\n        var SelectionTool = Class.extend({\n            init: function (toolService) {\n                this.toolService = toolService;\n            },\n            tryActivate: function (p, meta) {\n                var toolService = this.toolService;\n                var selectable = toolService.diagram.options.selectable;\n                var enabled = selectable && selectable.multiple !== false;\n                if (enabled) {\n                    if (selectable.key && selectable.key != 'none') {\n                        enabled = meta[selectable.key + 'Key'];\n                    } else {\n                        enabled = noMeta(meta);\n                    }\n                }\n                return enabled && !defined(toolService.hoveredItem) && !defined(toolService.hoveredAdorner);\n            },\n            start: function (p) {\n                var diagram = this.toolService.diagram;\n                diagram.deselect();\n                diagram.selector.start(p);\n            },\n            move: function (p) {\n                var diagram = this.toolService.diagram;\n                diagram.selector.move(p);\n            },\n            end: function (p, meta) {\n                var diagram = this.toolService.diagram, hoveredItem = this.toolService.hoveredItem;\n                var rect = diagram.selector.bounds();\n                if ((!hoveredItem || !hoveredItem.isSelected) && !meta.ctrlKey) {\n                    diagram.deselect();\n                }\n                if (!rect.isEmpty()) {\n                    diagram.selectArea(rect);\n                }\n                diagram.selector.end();\n            },\n            getCursor: function () {\n                return Cursors.arrow;\n            }\n        });\n        var ConnectionTool = Class.extend({\n            init: function (toolService) {\n                this.toolService = toolService;\n                this.type = 'ConnectionTool';\n            },\n            tryActivate: function () {\n                return this.toolService._hoveredConnector;\n            },\n            start: function (p, meta) {\n                var toolService = this.toolService, diagram = toolService.diagram, connector = toolService._hoveredConnector, connection = diagram._createConnection({}, connector._c, p);\n                if (canDrag(connection) && !diagram.trigger(DRAG_START, {\n                        shapes: [],\n                        connections: [connection],\n                        connectionHandle: TARGET\n                    }) && diagram._addConnection(connection)) {\n                    toolService._connectionManipulation(connection, connector._c.shape, true);\n                    toolService._removeHover();\n                    toolService.selectSingle(toolService.activeConnection, meta);\n                    if (meta.type == 'touchmove') {\n                        diagram._cachedTouchTarget = connector.visual;\n                    }\n                } else {\n                    connection.source(null);\n                    toolService.end(p);\n                }\n            },\n            move: function (p) {\n                var toolService = this.toolService;\n                var connection = toolService.activeConnection;\n                connection.target(p);\n                toolService.diagram.trigger(DRAG, {\n                    shapes: [],\n                    connections: [connection],\n                    connectionHandle: TARGET\n                });\n                return true;\n            },\n            end: function (p) {\n                var toolService = this.toolService, d = toolService.diagram, connection = toolService.activeConnection, hoveredItem = toolService.hoveredItem, connector = toolService._hoveredConnector, target, cachedTouchTarget = d._cachedTouchTarget;\n                if (!connection) {\n                    return;\n                }\n                if (connector && connector._c != connection.sourceConnector) {\n                    target = connector._c;\n                } else if (hoveredItem && hoveredItem instanceof diagram.Shape) {\n                    target = hoveredItem.getConnector(AUTO) || hoveredItem.getConnector(p);\n                } else {\n                    target = p;\n                }\n                connection.target(target);\n                if (!d.trigger(DRAG_END, {\n                        shapes: [],\n                        connections: [connection],\n                        connectionHandle: TARGET\n                    })) {\n                    connection.updateModel();\n                    d._syncConnectionChanges();\n                } else {\n                    d.remove(connection, false);\n                    d.undoRedoService.pop();\n                }\n                toolService._connectionManipulation();\n                if (cachedTouchTarget) {\n                    d._connectorsAdorner.visual.remove(cachedTouchTarget);\n                    d._cachedTouchTarget = null;\n                }\n            },\n            getCursor: function () {\n                return Cursors.arrow;\n            }\n        });\n        var ConnectionEditTool = Class.extend({\n            init: function (toolService) {\n                this.toolService = toolService;\n                this.type = 'ConnectionTool';\n            },\n            tryActivate: function (p, meta) {\n                var toolService = this.toolService, diagram = toolService.diagram, selectable = diagram.options.selectable, item = toolService.hoveredItem, isActive = selectable !== false && item && item.path && !(item.isSelected && meta.ctrlKey);\n                if (isActive) {\n                    this._c = item;\n                }\n                return isActive;\n            },\n            start: function (p, meta) {\n                var toolService = this.toolService;\n                var connection = this._c;\n                toolService.selectSingle(connection, meta);\n                var adorner = connection.adorner;\n                var handle, name;\n                if (adorner) {\n                    handle = adorner._hitTest(p);\n                    name = HANDLE_NAMES[handle];\n                }\n                if (canDrag(connection) && adorner && !toolService.diagram.trigger(DRAG_START, {\n                        shapes: [],\n                        connections: [connection],\n                        connectionHandle: name\n                    })) {\n                    this.handle = handle;\n                    this.handleName = name;\n                    adorner.start(p);\n                } else {\n                    toolService.startPoint = p;\n                    toolService.end(p);\n                }\n            },\n            move: function (p) {\n                var adorner = this._c.adorner;\n                if (canDrag(this._c) && adorner) {\n                    adorner.move(this.handle, p);\n                    this.toolService.diagram.trigger(DRAG, {\n                        shapes: [],\n                        connections: [this._c],\n                        connectionHandle: this.handleName\n                    });\n                    return true;\n                }\n            },\n            end: function (p) {\n                var connection = this._c;\n                var adorner = connection.adorner;\n                var toolService = this.toolService;\n                var diagram = toolService.diagram;\n                if (adorner) {\n                    if (canDrag(connection)) {\n                        var unit = adorner.stop(p);\n                        if (!diagram.trigger(DRAG_END, {\n                                shapes: [],\n                                connections: [connection],\n                                connectionHandle: this.handleName\n                            })) {\n                            diagram.undoRedoService.add(unit, false);\n                            connection.updateModel();\n                            diagram._syncConnectionChanges();\n                        } else {\n                            unit.undo();\n                        }\n                    }\n                }\n            },\n            getCursor: function () {\n                return Cursors.move;\n            }\n        });\n        function testKey(key, str) {\n            return str.charCodeAt(0) == key || str.toUpperCase().charCodeAt(0) == key;\n        }\n        var ToolService = Class.extend({\n            init: function (diagram) {\n                this.diagram = diagram;\n                this.tools = [\n                    new ScrollerTool(this),\n                    new ConnectionEditTool(this),\n                    new ConnectionTool(this),\n                    new SelectionTool(this),\n                    new PointerTool(this)\n                ];\n                this.activeTool = undefined;\n            },\n            start: function (p, meta) {\n                meta = deepExtend({}, meta);\n                if (this.activeTool) {\n                    this.activeTool.end(p, meta);\n                }\n                this._updateHoveredItem(p);\n                this._activateTool(p, meta);\n                this.activeTool.start(p, meta);\n                this._updateCursor(p);\n                this.diagram.focus();\n                this.diagram.canvas.surface.suspendTracking();\n                this.startPoint = p;\n                return true;\n            },\n            move: function (p, meta) {\n                meta = deepExtend({}, meta);\n                var updateHovered = true;\n                if (this.activeTool) {\n                    updateHovered = this.activeTool.move(p, meta);\n                }\n                if (updateHovered) {\n                    this._updateHoveredItem(p);\n                }\n                this._updateCursor(p);\n                return true;\n            },\n            end: function (p, meta) {\n                meta = deepExtend({}, meta);\n                if (this.activeTool) {\n                    this.activeTool.end(p, meta);\n                }\n                this.diagram.canvas.surface.resumeTracking();\n                this.activeTool = undefined;\n                this._updateCursor(p);\n                return true;\n            },\n            keyDown: function (key, meta) {\n                var diagram = this.diagram;\n                meta = deepExtend({\n                    ctrlKey: false,\n                    metaKey: false,\n                    altKey: false\n                }, meta);\n                if ((meta.ctrlKey || meta.metaKey) && !meta.altKey) {\n                    if (testKey(key, 'a')) {\n                        diagram.selectAll();\n                        diagram._destroyToolBar();\n                        return true;\n                    } else if (testKey(key, 'z')) {\n                        diagram.undo();\n                        diagram._destroyToolBar();\n                        return true;\n                    } else if (testKey(key, 'y')) {\n                        diagram.redo();\n                        diagram._destroyToolBar();\n                        return true;\n                    } else if (testKey(key, 'c')) {\n                        diagram.copy();\n                        diagram._destroyToolBar();\n                    } else if (testKey(key, 'x')) {\n                        diagram.cut();\n                        diagram._destroyToolBar();\n                    } else if (testKey(key, 'v')) {\n                        diagram.paste();\n                        diagram._destroyToolBar();\n                    } else if (testKey(key, 'l')) {\n                        diagram.layout();\n                        diagram._destroyToolBar();\n                    } else if (testKey(key, 'd')) {\n                        diagram._destroyToolBar();\n                        diagram.copy();\n                        diagram.paste();\n                    }\n                } else if (key === 46 || key === 8) {\n                    var toRemove = this.diagram._triggerRemove(diagram.select());\n                    if (toRemove.length) {\n                        this.diagram.remove(toRemove, true);\n                        this.diagram._syncChanges();\n                        this.diagram._destroyToolBar();\n                    }\n                    return true;\n                } else if (key === 27) {\n                    this._discardNewConnection();\n                    diagram.deselect();\n                    diagram._destroyToolBar();\n                    return true;\n                }\n            },\n            wheel: function (p, meta) {\n                var diagram = this.diagram, delta = meta.delta, z = diagram.zoom(), options = diagram.options, zoomRate = options.zoomRate, zoomOptions = {\n                        point: p,\n                        meta: meta,\n                        zoom: z\n                    };\n                if (diagram.trigger(ZOOM_START, zoomOptions)) {\n                    return;\n                }\n                if (delta < 0) {\n                    z += zoomRate;\n                } else {\n                    z -= zoomRate;\n                }\n                z = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, z)), 2);\n                zoomOptions.zoom = z;\n                diagram.zoom(z, zoomOptions);\n                diagram.trigger(ZOOM_END, zoomOptions);\n                return true;\n            },\n            setTool: function (tool, index) {\n                tool.toolService = this;\n                this.tools[index] = tool;\n            },\n            selectSingle: function (item, meta) {\n                var diagram = this.diagram;\n                var selectable = diagram.options.selectable;\n                if (selectable && !item.isSelected && item.options.selectable !== false) {\n                    var addToSelection = meta.ctrlKey && selectable.multiple !== false;\n                    diagram.select(item, { addToSelection: addToSelection });\n                }\n            },\n            _discardNewConnection: function () {\n                if (this.newConnection) {\n                    this.diagram.remove(this.newConnection);\n                    this.newConnection = undefined;\n                }\n            },\n            _activateTool: function (p, meta) {\n                for (var i = 0; i < this.tools.length; i++) {\n                    var tool = this.tools[i];\n                    if (tool.tryActivate(p, meta)) {\n                        this.activeTool = tool;\n                        break;\n                    }\n                }\n            },\n            _updateCursor: function (p) {\n                var element = this.diagram.element;\n                var cursor = this.activeTool ? this.activeTool.getCursor(p) : this.hoveredAdorner ? this.hoveredAdorner._getCursor(p) : this.hoveredItem ? this.hoveredItem._getCursor(p) : Cursors.arrow;\n                element.css({ cursor: cursor });\n                if (browser.msie && browser.version == 7) {\n                    element[0].style.cssText = element[0].style.cssText;\n                }\n            },\n            _connectionManipulation: function (connection, disabledShape, isNew) {\n                this.activeConnection = connection;\n                this.disabledShape = disabledShape;\n                if (isNew) {\n                    this.newConnection = this.activeConnection;\n                } else {\n                    this.newConnection = undefined;\n                }\n            },\n            _updateHoveredItem: function (p) {\n                var hit = this._hitTest(p);\n                var diagram = this.diagram;\n                if (hit != this.hoveredItem && (!this.disabledShape || hit != this.disabledShape)) {\n                    if (this.hoveredItem) {\n                        diagram.trigger(MOUSE_LEAVE, { item: this.hoveredItem });\n                        this.hoveredItem._hover(false);\n                    }\n                    if (hit && hit.options.enable) {\n                        diagram.trigger(MOUSE_ENTER, { item: hit });\n                        this.hoveredItem = hit;\n                        this.hoveredItem._hover(true);\n                    } else {\n                        this.hoveredItem = undefined;\n                    }\n                }\n            },\n            _removeHover: function () {\n                if (this.hoveredItem) {\n                    this.hoveredItem._hover(false);\n                    this.hoveredItem = undefined;\n                }\n            },\n            _hitTest: function (point) {\n                var hit, d = this.diagram, item, i;\n                if (this._hoveredConnector) {\n                    this._hoveredConnector._hover(false);\n                    this._hoveredConnector = undefined;\n                }\n                if (d._connectorsAdorner._visible) {\n                    hit = d._connectorsAdorner._hitTest(point);\n                    if (hit) {\n                        return hit;\n                    }\n                }\n                hit = this.diagram._resizingAdorner._hitTest(point);\n                if (hit) {\n                    this.hoveredAdorner = d._resizingAdorner;\n                    if (hit.x !== 0 || hit.y !== 0) {\n                        return;\n                    }\n                    hit = undefined;\n                } else {\n                    this.hoveredAdorner = undefined;\n                }\n                if (!this.activeTool || this.activeTool.type !== 'ConnectionTool') {\n                    var selectedConnections = [];\n                    for (i = 0; i < d._selectedItems.length; i++) {\n                        item = d._selectedItems[i];\n                        if (item instanceof diagram.Connection) {\n                            selectedConnections.push(item);\n                        }\n                    }\n                    hit = this._hitTestItems(selectedConnections, point);\n                }\n                return hit || this._hitTestElements(point);\n            },\n            _hitTestElements: function (point) {\n                var diagram = this.diagram;\n                var shapeHit = this._hitTestItems(diagram.shapes, point);\n                var connectionHit = this._hitTestItems(diagram.connections, point);\n                var hit;\n                if ((!this.activeTool || this.activeTool.type != 'ConnectionTool') && shapeHit && connectionHit && !hitTestShapeConnectors(shapeHit, point)) {\n                    var mainLayer = diagram.mainLayer;\n                    var shapeIdx = inArray(shapeHit.visual, mainLayer.children);\n                    var connectionIdx = inArray(connectionHit.visual, mainLayer.children);\n                    hit = shapeIdx > connectionIdx ? shapeHit : connectionHit;\n                }\n                return hit || shapeHit || connectionHit;\n            },\n            _hitTestItems: function (array, point) {\n                var i, item, hit;\n                for (i = array.length - 1; i >= 0; i--) {\n                    item = array[i];\n                    hit = item._hitTest(point);\n                    if (hit) {\n                        return hit;\n                    }\n                }\n            }\n        });\n        var ConnectionRouterBase = kendo.Class.extend({\n            init: function () {\n            }\n        });\n        var LinearConnectionRouter = ConnectionRouterBase.extend({\n            init: function (connection) {\n                var that = this;\n                ConnectionRouterBase.fn.init.call(that);\n                this.connection = connection;\n            },\n            hitTest: function (p) {\n                var rec = this.getBounds().inflate(HIT_TEST_DISTANCE);\n                if (!rec.contains(p)) {\n                    return false;\n                }\n                return diagram.Geometry.distanceToPolyline(p, this.connection.allPoints()) < HIT_TEST_DISTANCE;\n            },\n            getBounds: function () {\n                var points = this.connection.allPoints(), s = points[0], e = points[points.length - 1], right = Math.max(s.x, e.x), left = Math.min(s.x, e.x), top = Math.min(s.y, e.y), bottom = Math.max(s.y, e.y);\n                for (var i = 1; i < points.length - 1; ++i) {\n                    right = Math.max(right, points[i].x);\n                    left = Math.min(left, points[i].x);\n                    top = Math.min(top, points[i].y);\n                    bottom = Math.max(bottom, points[i].y);\n                }\n                return new Rect(left, top, right - left, bottom - top);\n            }\n        });\n        var PolylineRouter = LinearConnectionRouter.extend({\n            init: function (connection) {\n                var that = this;\n                LinearConnectionRouter.fn.init.call(that);\n                this.connection = connection;\n            },\n            route: function () {\n            }\n        });\n        var CascadingRouter = LinearConnectionRouter.extend({\n            SAME_SIDE_DISTANCE_RATIO: 5,\n            init: function (connection) {\n                var that = this;\n                LinearConnectionRouter.fn.init.call(that);\n                this.connection = connection;\n            },\n            routePoints: function (start, end, sourceConnector, targetConnector) {\n                var result;\n                if (sourceConnector && targetConnector) {\n                    result = this._connectorPoints(start, end, sourceConnector, targetConnector);\n                } else {\n                    result = this._floatingPoints(start, end, sourceConnector);\n                }\n                return result;\n            },\n            route: function () {\n                var sourceConnector = this.connection._resolvedSourceConnector;\n                var targetConnector = this.connection._resolvedTargetConnector;\n                var start = this.connection.sourcePoint();\n                var end = this.connection.targetPoint();\n                var points = this.routePoints(start, end, sourceConnector, targetConnector);\n                this.connection.points(points);\n            },\n            _connectorSides: [\n                {\n                    name: 'Top',\n                    axis: 'y',\n                    boundsPoint: 'topLeft',\n                    secondarySign: 1\n                },\n                {\n                    name: 'Left',\n                    axis: 'x',\n                    boundsPoint: 'topLeft',\n                    secondarySign: 1\n                },\n                {\n                    name: 'Bottom',\n                    axis: 'y',\n                    boundsPoint: 'bottomRight',\n                    secondarySign: -1\n                },\n                {\n                    name: 'Right',\n                    axis: 'x',\n                    boundsPoint: 'bottomRight',\n                    secondarySign: -1\n                }\n            ],\n            _connectorSide: function (connector, targetPoint) {\n                var position = connector.position();\n                var shapeBounds = connector.shape.bounds(ROTATED);\n                var bounds = {\n                    topLeft: shapeBounds.topLeft(),\n                    bottomRight: shapeBounds.bottomRight()\n                };\n                var sides = this._connectorSides;\n                var min = util.MAX_NUM;\n                var sideDistance;\n                var minSide;\n                var axis;\n                var side;\n                for (var idx = 0; idx < sides.length; idx++) {\n                    side = sides[idx];\n                    axis = side.axis;\n                    sideDistance = Math.round(Math.abs(position[axis] - bounds[side.boundsPoint][axis]));\n                    if (sideDistance < min) {\n                        min = sideDistance;\n                        minSide = side;\n                    } else if (sideDistance === min && (position[axis] - targetPoint[axis]) * side.secondarySign > (position[minSide.axis] - targetPoint[minSide.axis]) * minSide.secondarySign) {\n                        minSide = side;\n                    }\n                }\n                return minSide.name;\n            },\n            _sameSideDistance: function (connector) {\n                var bounds = connector.shape.bounds(ROTATED);\n                return Math.min(bounds.width, bounds.height) / this.SAME_SIDE_DISTANCE_RATIO;\n            },\n            _connectorPoints: function (start, end, sourceConnector, targetConnector) {\n                var sourceConnectorSide = this._connectorSide(sourceConnector, end);\n                var targetConnectorSide = this._connectorSide(targetConnector, start);\n                var deltaX = end.x - start.x;\n                var deltaY = end.y - start.y;\n                var sameSideDistance = this._sameSideDistance(sourceConnector);\n                var result = [];\n                var pointX, pointY;\n                if (sourceConnectorSide === TOP || sourceConnectorSide == BOTTOM) {\n                    if (targetConnectorSide == TOP || targetConnectorSide == BOTTOM) {\n                        if (sourceConnectorSide == targetConnectorSide) {\n                            if (sourceConnectorSide == TOP) {\n                                pointY = Math.min(start.y, end.y) - sameSideDistance;\n                            } else {\n                                pointY = Math.max(start.y, end.y) + sameSideDistance;\n                            }\n                            result = [\n                                new Point(start.x, pointY),\n                                new Point(end.x, pointY)\n                            ];\n                        } else {\n                            result = [\n                                new Point(start.x, start.y + deltaY / 2),\n                                new Point(end.x, start.y + deltaY / 2)\n                            ];\n                        }\n                    } else {\n                        result = [new Point(start.x, end.y)];\n                    }\n                } else {\n                    if (targetConnectorSide == LEFT || targetConnectorSide == RIGHT) {\n                        if (sourceConnectorSide == targetConnectorSide) {\n                            if (sourceConnectorSide == LEFT) {\n                                pointX = Math.min(start.x, end.x) - sameSideDistance;\n                            } else {\n                                pointX = Math.max(start.x, end.x) + sameSideDistance;\n                            }\n                            result = [\n                                new Point(pointX, start.y),\n                                new Point(pointX, end.y)\n                            ];\n                        } else {\n                            result = [\n                                new Point(start.x + deltaX / 2, start.y),\n                                new Point(start.x + deltaX / 2, start.y + deltaY)\n                            ];\n                        }\n                    } else {\n                        result = [new Point(end.x, start.y)];\n                    }\n                }\n                return result;\n            },\n            _floatingPoints: function (start, end, sourceConnector) {\n                var sourceConnectorSide = sourceConnector ? this._connectorSide(sourceConnector, end) : null;\n                var cascadeStartHorizontal = this._startHorizontal(start, end, sourceConnectorSide);\n                var points = [\n                    start,\n                    start,\n                    end,\n                    end\n                ];\n                var deltaX = end.x - start.x;\n                var deltaY = end.y - start.y;\n                var length = points.length;\n                var shiftX;\n                var shiftY;\n                for (var idx = 1; idx < length - 1; ++idx) {\n                    if (cascadeStartHorizontal) {\n                        if (idx % 2 !== 0) {\n                            shiftX = deltaX / (length / 2);\n                            shiftY = 0;\n                        } else {\n                            shiftX = 0;\n                            shiftY = deltaY / ((length - 1) / 2);\n                        }\n                    } else {\n                        if (idx % 2 !== 0) {\n                            shiftX = 0;\n                            shiftY = deltaY / (length / 2);\n                        } else {\n                            shiftX = deltaX / ((length - 1) / 2);\n                            shiftY = 0;\n                        }\n                    }\n                    points[idx] = new Point(points[idx - 1].x + shiftX, points[idx - 1].y + shiftY);\n                }\n                idx--;\n                if (cascadeStartHorizontal && idx % 2 !== 0 || !cascadeStartHorizontal && idx % 2 === 0) {\n                    points[length - 2] = new Point(points[length - 1].x, points[length - 2].y);\n                } else {\n                    points[length - 2] = new Point(points[length - 2].x, points[length - 1].y);\n                }\n                return [\n                    points[1],\n                    points[2]\n                ];\n            },\n            _startHorizontal: function (start, end, sourceSide) {\n                var horizontal;\n                if (sourceSide !== null && (sourceSide === RIGHT || sourceSide === LEFT)) {\n                    horizontal = true;\n                } else {\n                    horizontal = Math.abs(start.x - end.x) > Math.abs(start.y - end.y);\n                }\n                return horizontal;\n            }\n        });\n        var AdornerBase = Class.extend({\n            init: function (diagram, options) {\n                var that = this;\n                that.diagram = diagram;\n                that.options = deepExtend({}, that.options, options);\n                that.visual = new Group();\n                that.diagram._adorners.push(that);\n            },\n            refresh: function () {\n            }\n        });\n        var ConnectionEditAdorner = AdornerBase.extend({\n            init: function (connection, options) {\n                var that = this, diagram;\n                that.connection = connection;\n                diagram = that.connection.diagram;\n                that._ts = diagram.toolService;\n                AdornerBase.fn.init.call(that, diagram, options);\n                var sp = that.connection.sourcePoint();\n                var tp = that.connection.targetPoint();\n                that.spVisual = new Circle(deepExtend(that.options.handles, { center: sp }));\n                that.epVisual = new Circle(deepExtend(that.options.handles, { center: tp }));\n                that.visual.append(that.spVisual);\n                that.visual.append(that.epVisual);\n            },\n            options: { handles: {} },\n            _getCursor: function () {\n                return Cursors.move;\n            },\n            start: function (p) {\n                this.handle = this._hitTest(p);\n                this.startPoint = p;\n                this._initialSource = this.connection.source();\n                this._initialTarget = this.connection.target();\n                switch (this.handle) {\n                case -1:\n                    if (this.connection.targetConnector) {\n                        this._ts._connectionManipulation(this.connection, this.connection.targetConnector.shape);\n                    }\n                    break;\n                case 1:\n                    if (this.connection.sourceConnector) {\n                        this._ts._connectionManipulation(this.connection, this.connection.sourceConnector.shape);\n                    }\n                    break;\n                }\n            },\n            move: function (handle, p) {\n                switch (handle) {\n                case -1:\n                    this.connection.source(p);\n                    break;\n                case 1:\n                    this.connection.target(p);\n                    break;\n                default:\n                    var delta = p.minus(this.startPoint);\n                    this.startPoint = p;\n                    if (!this.connection.sourceConnector) {\n                        this.connection.source(this.connection.sourcePoint().plus(delta));\n                    }\n                    if (!this.connection.targetConnector) {\n                        this.connection.target(this.connection.targetPoint().plus(delta));\n                    }\n                    break;\n                }\n                this.refresh();\n                return true;\n            },\n            stop: function (p) {\n                var ts = this.diagram.toolService, item = ts.hoveredItem, target;\n                if (ts._hoveredConnector) {\n                    target = ts._hoveredConnector._c;\n                } else if (item && item instanceof diagram.Shape) {\n                    target = item.getConnector(AUTO) || item.getConnector(p);\n                } else {\n                    target = p;\n                }\n                if (this.handle === -1) {\n                    this.connection.source(target);\n                } else if (this.handle === 1) {\n                    this.connection.target(target);\n                }\n                this.handle = undefined;\n                this._ts._connectionManipulation();\n                return new ConnectionEditUndoUnit(this.connection, this._initialSource, this._initialTarget);\n            },\n            _hitTest: function (point) {\n                var sourcePoint = this.connection.sourcePoint();\n                var targetPoint = this.connection.targetPoint();\n                var radiusX = this.options.handles.width / 2 + HIT_TEST_DISTANCE;\n                var radiusY = this.options.handles.height / 2 + HIT_TEST_DISTANCE;\n                var sourcePointDistance = sourcePoint.distanceTo(point);\n                var targetPointDistance = targetPoint.distanceTo(point);\n                var sourceHandle = new Rect(sourcePoint.x, sourcePoint.y).inflate(radiusX, radiusY).contains(point);\n                var targetHandle = new Rect(targetPoint.x, targetPoint.y).inflate(radiusX, radiusY).contains(point);\n                var handle = 0;\n                if (sourceHandle && (!targetHandle || sourcePointDistance < targetPointDistance)) {\n                    handle = -1;\n                } else if (targetHandle && (!sourceHandle || targetPointDistance < sourcePointDistance)) {\n                    handle = 1;\n                }\n                return handle;\n            },\n            refresh: function () {\n                this.spVisual.redraw({ center: this.diagram.modelToLayer(this.connection.sourcePoint()) });\n                this.epVisual.redraw({ center: this.diagram.modelToLayer(this.connection.targetPoint()) });\n            }\n        });\n        var ConnectorsAdorner = AdornerBase.extend({\n            init: function (diagram, options) {\n                var that = this;\n                AdornerBase.fn.init.call(that, diagram, options);\n                that._refreshHandler = function (e) {\n                    if (e.item == that.shape) {\n                        that.refresh();\n                    }\n                };\n            },\n            show: function (shape) {\n                var that = this, len, i, ctr;\n                that._visible = true;\n                that.shape = shape;\n                that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler);\n                len = shape.connectors.length;\n                that.connectors = [];\n                that._clearVisual();\n                for (i = 0; i < len; i++) {\n                    ctr = new ConnectorVisual(shape.connectors[i]);\n                    that.connectors.push(ctr);\n                    that.visual.append(ctr.visual);\n                }\n                that.visual.visible(true);\n                that.refresh();\n            },\n            _clearVisual: function () {\n                var that = this;\n                if (that.diagram._cachedTouchTarget) {\n                    that._keepCachedTouchTarget();\n                } else {\n                    that.visual.clear();\n                }\n            },\n            _keepCachedTouchTarget: function () {\n                var that = this, visualChildren = that.visual.children;\n                var childrenCount = visualChildren.length;\n                var index = inArray(that.diagram._cachedTouchTarget, visualChildren);\n                for (var i = childrenCount - 1; i >= 0; i--) {\n                    if (i == index) {\n                        continue;\n                    }\n                    that.visual.remove(visualChildren[i]);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                that.diagram.unbind(ITEMBOUNDSCHANGE, that._refreshHandler);\n                that.shape = undefined;\n                that._visible = undefined;\n                that.visual.visible(false);\n            },\n            _hitTest: function (p) {\n                var ctr, i;\n                for (i = 0; i < this.connectors.length; i++) {\n                    ctr = this.connectors[i];\n                    if (ctr._hitTest(p)) {\n                        ctr._hover(true);\n                        this.diagram.toolService._hoveredConnector = ctr;\n                        break;\n                    }\n                }\n            },\n            refresh: function () {\n                if (this.shape) {\n                    var bounds = this.shape.bounds();\n                    bounds = this.diagram.modelToLayer(bounds);\n                    this.visual.position(bounds.topLeft());\n                    $.each(this.connectors, function () {\n                        this.refresh();\n                    });\n                }\n            }\n        });\n        function hitToOppositeSide(hit, bounds) {\n            var result;\n            if (hit.x == -1 && hit.y == -1) {\n                result = bounds.bottomRight();\n            } else if (hit.x == 1 && hit.y == 1) {\n                result = bounds.topLeft();\n            } else if (hit.x == -1 && hit.y == 1) {\n                result = bounds.topRight();\n            } else if (hit.x == 1 && hit.y == -1) {\n                result = bounds.bottomLeft();\n            } else if (hit.x === 0 && hit.y == -1) {\n                result = bounds.bottom();\n            } else if (hit.x === 0 && hit.y == 1) {\n                result = bounds.top();\n            } else if (hit.x == 1 && hit.y === 0) {\n                result = bounds.left();\n            } else if (hit.x == -1 && hit.y === 0) {\n                result = bounds.right();\n            }\n            return result;\n        }\n        var ResizingAdorner = AdornerBase.extend({\n            init: function (diagram, options) {\n                var that = this;\n                AdornerBase.fn.init.call(that, diagram, options);\n                that._manipulating = false;\n                that.map = [];\n                that.shapes = [];\n                that._initSelection();\n                that._createHandles();\n                that.redraw();\n                that.diagram.bind('select', function (e) {\n                    that._initialize(e.selected);\n                });\n                that._refreshHandler = function () {\n                    if (!that._internalChange) {\n                        that.refreshBounds();\n                        that.refresh();\n                    }\n                };\n                that._rotatedHandler = function () {\n                    if (that.shapes.length == 1) {\n                        that._angle = that.shapes[0].rotate().angle;\n                    }\n                    that._refreshHandler();\n                };\n                that.diagram.bind(ITEMBOUNDSCHANGE, that._refreshHandler).bind(ITEMROTATE, that._rotatedHandler);\n                that.refreshBounds();\n                that.refresh();\n            },\n            options: {\n                handles: {\n                    fill: { color: '#fff' },\n                    stroke: { color: '#282828' },\n                    height: 7,\n                    width: 7,\n                    hover: {\n                        fill: { color: '#282828' },\n                        stroke: { color: '#282828' }\n                    }\n                },\n                selectable: {\n                    stroke: {\n                        color: '#778899',\n                        width: 1,\n                        dashType: 'dash'\n                    },\n                    fill: { color: TRANSPARENT }\n                },\n                offset: 10\n            },\n            _initSelection: function () {\n                var that = this;\n                var diagram = that.diagram;\n                var selectable = diagram.options.selectable;\n                var options = deepExtend({}, that.options.selectable, selectable);\n                that.rect = new Rectangle(options);\n                that.visual.append(that.rect);\n            },\n            _resizable: function () {\n                return this.options.editable && this.options.editable.resize !== false;\n            },\n            _handleOptions: function () {\n                return (this.options.editable.resize || {}).handles || this.options.handles;\n            },\n            _createHandles: function () {\n                var handles, item, y, x;\n                if (this._resizable()) {\n                    handles = this._handleOptions();\n                    for (x = -1; x <= 1; x++) {\n                        for (y = -1; y <= 1; y++) {\n                            if (x !== 0 || y !== 0) {\n                                item = new Rectangle(handles);\n                                item.drawingElement._hover = proxy(this._hover, this);\n                                this.map.push({\n                                    x: x,\n                                    y: y,\n                                    visual: item\n                                });\n                                this.visual.append(item);\n                            }\n                        }\n                    }\n                }\n            },\n            bounds: function (value) {\n                if (value) {\n                    this._innerBounds = value.clone();\n                    this._bounds = this.diagram.modelToLayer(value).inflate(this.options.offset, this.options.offset);\n                } else {\n                    return this._bounds;\n                }\n            },\n            _hitTest: function (p) {\n                var tp = this.diagram.modelToLayer(p), i, hit, handleBounds, handlesCount = this.map.length, handle;\n                if (this._angle) {\n                    tp = tp.clone().rotate(this._bounds.center(), this._angle);\n                }\n                if (this._resizable()) {\n                    for (i = 0; i < handlesCount; i++) {\n                        handle = this.map[i];\n                        hit = new Point(handle.x, handle.y);\n                        handleBounds = this._getHandleBounds(hit);\n                        handleBounds.offset(this._bounds.x, this._bounds.y);\n                        if (handleBounds.contains(tp)) {\n                            return hit;\n                        }\n                    }\n                }\n                if (this._bounds.contains(tp)) {\n                    return new Point(0, 0);\n                }\n            },\n            _getHandleBounds: function (p) {\n                if (this._resizable()) {\n                    var handles = this._handleOptions(), w = handles.width, h = handles.height, r = new Rect(0, 0, w, h);\n                    if (p.x < 0) {\n                        r.x = -w / 2;\n                    } else if (p.x === 0) {\n                        r.x = Math.floor(this._bounds.width / 2) - w / 2;\n                    } else if (p.x > 0) {\n                        r.x = this._bounds.width + 1 - w / 2;\n                    }\n                    if (p.y < 0) {\n                        r.y = -h / 2;\n                    } else if (p.y === 0) {\n                        r.y = Math.floor(this._bounds.height / 2) - h / 2;\n                    } else if (p.y > 0) {\n                        r.y = this._bounds.height + 1 - h / 2;\n                    }\n                    return r;\n                }\n            },\n            _getCursor: function (point) {\n                var hit = this._hitTest(point);\n                if (hit && hit.x >= -1 && hit.x <= 1 && hit.y >= -1 && hit.y <= 1 && this._resizable()) {\n                    var angle = this._angle;\n                    if (angle) {\n                        angle = 360 - angle;\n                        hit.rotate(new Point(0, 0), angle);\n                        hit = new Point(Math.round(hit.x), Math.round(hit.y));\n                    }\n                    if (hit.x == -1 && hit.y == -1) {\n                        return 'nw-resize';\n                    }\n                    if (hit.x == 1 && hit.y == 1) {\n                        return 'se-resize';\n                    }\n                    if (hit.x == -1 && hit.y == 1) {\n                        return 'sw-resize';\n                    }\n                    if (hit.x == 1 && hit.y == -1) {\n                        return 'ne-resize';\n                    }\n                    if (hit.x === 0 && hit.y == -1) {\n                        return 'n-resize';\n                    }\n                    if (hit.x === 0 && hit.y == 1) {\n                        return 's-resize';\n                    }\n                    if (hit.x == 1 && hit.y === 0) {\n                        return 'e-resize';\n                    }\n                    if (hit.x == -1 && hit.y === 0) {\n                        return 'w-resize';\n                    }\n                }\n                return this._manipulating ? Cursors.move : Cursors.select;\n            },\n            _initialize: function () {\n                var that = this, i, item, items = that.diagram.select();\n                that.shapes = [];\n                for (i = 0; i < items.length; i++) {\n                    item = items[i];\n                    if (item instanceof diagram.Shape) {\n                        that.shapes.push(item);\n                        item._rotationOffset = new Point();\n                    }\n                }\n                that._angle = that.shapes.length == 1 ? that.shapes[0].rotate().angle : 0;\n                that._startAngle = that._angle;\n                that._rotates();\n                that._positions();\n                that.refreshBounds();\n                that.refresh();\n                that.redraw();\n            },\n            _rotates: function () {\n                var that = this, i, shape;\n                that.initialRotates = [];\n                for (i = 0; i < that.shapes.length; i++) {\n                    shape = that.shapes[i];\n                    that.initialRotates.push(shape.rotate().angle);\n                }\n            },\n            _positions: function () {\n                var that = this, i, shape;\n                that.initialStates = [];\n                for (i = 0; i < that.shapes.length; i++) {\n                    shape = that.shapes[i];\n                    that.initialStates.push(shape.bounds());\n                }\n            },\n            _hover: function (value, element) {\n                if (this._resizable()) {\n                    var handleOptions = this._handleOptions(), hover = handleOptions.hover, stroke = handleOptions.stroke, fill = handleOptions.fill;\n                    if (value && Utils.isDefined(hover.stroke)) {\n                        stroke = deepExtend({}, stroke, hover.stroke);\n                    }\n                    if (value && Utils.isDefined(hover.fill)) {\n                        fill = hover.fill;\n                    }\n                    element.stroke(stroke.color, stroke.width, stroke.opacity);\n                    element.fill(fill.color, fill.opacity);\n                }\n            },\n            start: function (p) {\n                this._sp = p;\n                this._cp = p;\n                this._lp = p;\n                this._manipulating = true;\n                this._internalChange = true;\n                this.shapeStates = [];\n                for (var i = 0; i < this.shapes.length; i++) {\n                    var shape = this.shapes[i];\n                    this.shapeStates.push(shape.bounds());\n                }\n            },\n            redraw: function () {\n                var i, handle, visibleHandles = this._resizable();\n                for (i = 0; i < this.map.length; i++) {\n                    handle = this.map[i];\n                    handle.visual.visible(visibleHandles);\n                }\n            },\n            angle: function (value) {\n                if (defined(value)) {\n                    this._angle = value;\n                }\n                return this._angle;\n            },\n            rotate: function () {\n                var center = this._innerBounds.center();\n                var currentAngle = this.angle();\n                this._internalChange = true;\n                for (var i = 0; i < this.shapes.length; i++) {\n                    var shape = this.shapes[i];\n                    currentAngle = (currentAngle + this.initialRotates[i] - this._startAngle) % 360;\n                    shape.rotate(currentAngle, center);\n                }\n                this.refresh();\n            },\n            move: function (handle, p) {\n                var delta, dragging, dtl = new Point(), dbr = new Point(), bounds, center, shape, i, angle, newBounds, changed = 0, staticPoint, scaleX, scaleY;\n                if (handle.y === -2 && handle.x === -1) {\n                    center = this._innerBounds.center();\n                    this._angle = this._truncateAngle(Utils.findAngle(center, p));\n                    for (i = 0; i < this.shapes.length; i++) {\n                        shape = this.shapes[i];\n                        angle = (this._angle + this.initialRotates[i] - this._startAngle) % 360;\n                        shape.rotate(angle, center);\n                        if (shape.hasOwnProperty('layout')) {\n                            shape.layout(shape);\n                        }\n                        this._rotating = true;\n                    }\n                    this.refresh();\n                } else {\n                    if (this.shouldSnap()) {\n                        var thr = this._truncateDistance(p.minus(this._lp));\n                        if (thr.x === 0 && thr.y === 0) {\n                            this._cp = p;\n                            return;\n                        }\n                        delta = thr;\n                        this._lp = new Point(this._lp.x + thr.x, this._lp.y + thr.y);\n                    } else {\n                        delta = p.minus(this._cp);\n                    }\n                    if (this.isDragHandle(handle)) {\n                        dbr = dtl = delta;\n                        dragging = true;\n                    } else {\n                        if (this._angle) {\n                            delta.rotate(new Point(0, 0), this._angle);\n                        }\n                        if (handle.x == -1) {\n                            dtl.x = delta.x;\n                        } else if (handle.x == 1) {\n                            dbr.x = delta.x;\n                        }\n                        if (handle.y == -1) {\n                            dtl.y = delta.y;\n                        } else if (handle.y == 1) {\n                            dbr.y = delta.y;\n                        }\n                    }\n                    if (!dragging) {\n                        staticPoint = hitToOppositeSide(handle, this._innerBounds);\n                        scaleX = (this._innerBounds.width + delta.x * handle.x) / this._innerBounds.width;\n                        scaleY = (this._innerBounds.height + delta.y * handle.y) / this._innerBounds.height;\n                    }\n                    for (i = 0; i < this.shapes.length; i++) {\n                        shape = this.shapes[i];\n                        bounds = shape.bounds();\n                        if (dragging) {\n                            if (!canDrag(shape)) {\n                                continue;\n                            }\n                            newBounds = this._displaceBounds(bounds, dtl, dbr, dragging);\n                        } else {\n                            newBounds = bounds.clone();\n                            newBounds.scale(scaleX, scaleY, staticPoint, this._innerBounds.center(), shape.rotate().angle);\n                            var newCenter = newBounds.center();\n                            newCenter.rotate(bounds.center(), -this._angle);\n                            newBounds = new Rect(newCenter.x - newBounds.width / 2, newCenter.y - newBounds.height / 2, newBounds.width, newBounds.height);\n                        }\n                        if (newBounds.width >= shape.options.minWidth && newBounds.height >= shape.options.minHeight) {\n                            var oldBounds = bounds;\n                            shape.bounds(newBounds);\n                            if (shape.hasOwnProperty('layout')) {\n                                shape.layout(shape, oldBounds, newBounds);\n                            }\n                            if (oldBounds.width !== newBounds.width || oldBounds.height !== newBounds.height) {\n                                shape.rotate(shape.rotate().angle);\n                            }\n                            changed += 1;\n                        }\n                    }\n                    if (changed) {\n                        if (changed == i) {\n                            newBounds = this._displaceBounds(this._innerBounds, dtl, dbr, dragging);\n                            this.bounds(newBounds);\n                        } else {\n                            this.refreshBounds();\n                        }\n                        this.refresh();\n                    }\n                    this._positions();\n                }\n                this._cp = p;\n            },\n            isDragHandle: function (handle) {\n                return handle.x === 0 && handle.y === 0;\n            },\n            cancel: function () {\n                var shapes = this.shapes;\n                var states = this.shapeStates;\n                for (var idx = 0; idx < shapes.length; idx++) {\n                    shapes[idx].bounds(states[idx]);\n                }\n                this.refreshBounds();\n                this.refresh();\n                this._manipulating = undefined;\n                this._internalChange = undefined;\n                this._rotating = undefined;\n            },\n            _truncatePositionToGuides: function (bounds) {\n                if (this.diagram.ruler) {\n                    return this.diagram.ruler.truncatePositionToGuides(bounds);\n                }\n                return bounds;\n            },\n            _truncateSizeToGuides: function (bounds) {\n                if (this.diagram.ruler) {\n                    return this.diagram.ruler.truncateSizeToGuides(bounds);\n                }\n                return bounds;\n            },\n            _truncateAngle: function (a) {\n                var snap = this.snapOptions();\n                var snapAngle = Math.max(snap.angle || DEFAULT_SNAP_ANGLE, MIN_SNAP_ANGLE);\n                return snap ? Math.floor(a % 360 / snapAngle) * snapAngle : a % 360;\n            },\n            _truncateDistance: function (d) {\n                if (d instanceof diagram.Point) {\n                    return new diagram.Point(this._truncateDistance(d.x), this._truncateDistance(d.y));\n                } else {\n                    var snap = this.snapOptions() || {};\n                    var snapSize = Math.max(snap.size || DEFAULT_SNAP_SIZE, MIN_SNAP_SIZE);\n                    return snap ? Math.floor(d / snapSize) * snapSize : d;\n                }\n            },\n            snapOptions: function () {\n                var editable = this.diagram.options.editable;\n                var snap = ((editable || {}).drag || {}).snap || {};\n                return snap;\n            },\n            shouldSnap: function () {\n                var editable = this.diagram.options.editable;\n                var drag = (editable || {}).drag;\n                var snap = (drag || {}).snap;\n                return editable !== false && drag !== false && snap !== false;\n            },\n            _displaceBounds: function (bounds, dtl, dbr, dragging) {\n                var tl = bounds.topLeft().plus(dtl), br = bounds.bottomRight().plus(dbr), newBounds = Rect.fromPoints(tl, br), newCenter;\n                if (!dragging) {\n                    newCenter = newBounds.center();\n                    newCenter.rotate(bounds.center(), -this._angle);\n                    newBounds = new Rect(newCenter.x - newBounds.width / 2, newCenter.y - newBounds.height / 2, newBounds.width, newBounds.height);\n                }\n                return newBounds;\n            },\n            stop: function () {\n                var unit, i, shape;\n                if (this._cp != this._sp) {\n                    if (this._rotating) {\n                        unit = new RotateUnit(this, this.shapes, this.initialRotates);\n                        this._rotating = false;\n                    } else if (this._diffStates()) {\n                        if (this.diagram.ruler) {\n                            for (i = 0; i < this.shapes.length; i++) {\n                                shape = this.shapes[i];\n                                var bounds = shape.bounds();\n                                bounds = this._truncateSizeToGuides(this._truncatePositionToGuides(bounds));\n                                shape.bounds(bounds);\n                                this.refreshBounds();\n                                this.refresh();\n                            }\n                        }\n                        for (i = 0; i < this.shapes.length; i++) {\n                            shape = this.shapes[i];\n                            shape.updateModel();\n                        }\n                        unit = new TransformUnit(this.shapes, this.shapeStates, this);\n                        this.diagram._syncShapeChanges();\n                    }\n                }\n                this._manipulating = undefined;\n                this._internalChange = undefined;\n                this._rotating = undefined;\n                return unit;\n            },\n            _diffStates: function () {\n                var shapes = this.shapes;\n                var states = this.shapeStates;\n                for (var idx = 0; idx < shapes.length; idx++) {\n                    if (!shapes[idx].bounds().equals(states[idx])) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            refreshBounds: function () {\n                var bounds = this.shapes.length == 1 ? this.shapes[0].bounds().clone() : this.diagram.boundingBox(this.shapes, true);\n                this.bounds(bounds);\n            },\n            refresh: function () {\n                var that = this, b, bounds;\n                if (this.shapes.length > 0) {\n                    bounds = this.bounds();\n                    this.visual.visible(true);\n                    this.visual.position(bounds.topLeft());\n                    $.each(this.map, function () {\n                        b = that._getHandleBounds(new Point(this.x, this.y));\n                        this.visual.position(b.topLeft());\n                    });\n                    this.visual.position(bounds.topLeft());\n                    var center = new Point(bounds.width / 2, bounds.height / 2);\n                    this.visual.rotate(this._angle, center);\n                    this.rect.redraw({\n                        width: bounds.width,\n                        height: bounds.height\n                    });\n                    if (this.rotationThumb) {\n                        var thumb = this.options.editable.rotate.thumb;\n                        this._rotationThumbBounds = new Rect(bounds.center().x, bounds.y + thumb.y, 0, 0).inflate(thumb.width);\n                        this.rotationThumb.redraw({ x: bounds.width / 2 - thumb.width / 2 });\n                    }\n                } else {\n                    this.visual.visible(false);\n                }\n            }\n        });\n        var Selector = Class.extend({\n            init: function (diagram) {\n                var selectable = diagram.options.selectable;\n                this.options = deepExtend({}, this.options, selectable);\n                this.visual = new Rectangle(this.options);\n                this.diagram = diagram;\n            },\n            options: {\n                stroke: {\n                    color: '#778899',\n                    width: 1,\n                    dashType: 'dash'\n                },\n                fill: { color: TRANSPARENT }\n            },\n            start: function (p) {\n                this._sp = this._ep = p;\n                this.refresh();\n                this.diagram._adorn(this, true);\n            },\n            end: function () {\n                this._sp = this._ep = undefined;\n                this.diagram._adorn(this, false);\n            },\n            bounds: function (value) {\n                if (value) {\n                    this._bounds = value;\n                }\n                return this._bounds;\n            },\n            move: function (p) {\n                this._ep = p;\n                this.refresh();\n            },\n            refresh: function () {\n                if (this._sp) {\n                    var visualBounds = Rect.fromPoints(this.diagram.modelToLayer(this._sp), this.diagram.modelToLayer(this._ep));\n                    this.bounds(Rect.fromPoints(this._sp, this._ep));\n                    this.visual.position(visualBounds.topLeft());\n                    this.visual.redraw({\n                        height: visualBounds.height + 1,\n                        width: visualBounds.width + 1\n                    });\n                }\n            }\n        });\n        var ConnectorVisual = Class.extend({\n            init: function (connector) {\n                this.options = deepExtend({}, connector.options);\n                this._c = connector;\n                this.visual = new Circle(this.options);\n                this.refresh();\n            },\n            _hover: function (value) {\n                var options = this.options, hover = options.hover, stroke = options.stroke, fill = options.fill;\n                if (value && Utils.isDefined(hover.stroke)) {\n                    stroke = deepExtend({}, stroke, hover.stroke);\n                }\n                if (value && Utils.isDefined(hover.fill)) {\n                    fill = hover.fill;\n                }\n                this.visual.redraw({\n                    stroke: stroke,\n                    fill: fill\n                });\n            },\n            refresh: function () {\n                var p = this._c.shape.diagram.modelToView(this._c.position()), relative = p.minus(this._c.shape.bounds('transformed').topLeft()), value = new Rect(p.x, p.y, 0, 0);\n                value.inflate(this.options.width / 2, this.options.height / 2);\n                this._visualBounds = value;\n                this.visual.redraw({ center: new Point(relative.x, relative.y) });\n            },\n            _hitTest: function (p) {\n                var tp = this._c.shape.diagram.modelToView(p);\n                return this._visualBounds.contains(tp);\n            }\n        });\n        function canDrag(element) {\n            var editable = element.options.editable;\n            return editable && editable.drag !== false;\n        }\n        function hitTestShapeConnectors(shape, point) {\n            var connector, position, rect;\n            for (var idx = 0; idx < shape.connectors.length; idx++) {\n                connector = shape.connectors[idx];\n                position = connector.position();\n                rect = new Rect(position.x, position.y);\n                rect.inflate(HIT_TEST_DISTANCE, HIT_TEST_DISTANCE);\n                if (rect.contains(point)) {\n                    return connector;\n                }\n            }\n        }\n        function noMeta(meta) {\n            return meta.ctrlKey === false && meta.altKey === false && meta.shiftKey === false;\n        }\n        deepExtend(diagram, {\n            CompositeUnit: CompositeUnit,\n            TransformUnit: TransformUnit,\n            PanUndoUnit: PanUndoUnit,\n            AddShapeUnit: AddShapeUnit,\n            AddConnectionUnit: AddConnectionUnit,\n            DeleteShapeUnit: DeleteShapeUnit,\n            DeleteConnectionUnit: DeleteConnectionUnit,\n            ConnectionEditAdorner: ConnectionEditAdorner,\n            ConnectionTool: ConnectionTool,\n            ConnectorVisual: ConnectorVisual,\n            UndoRedoService: UndoRedoService,\n            ResizingAdorner: ResizingAdorner,\n            Selector: Selector,\n            ToolService: ToolService,\n            ConnectorsAdorner: ConnectorsAdorner,\n            LayoutUndoUnit: LayoutUndoUnit,\n            ConnectionEditUnit: ConnectionEditUnit,\n            ToFrontUnit: ToFrontUnit,\n            ToBackUnit: ToBackUnit,\n            ConnectionRouterBase: ConnectionRouterBase,\n            PolylineRouter: PolylineRouter,\n            CascadingRouter: CascadingRouter,\n            SelectionTool: SelectionTool,\n            ScrollerTool: ScrollerTool,\n            PointerTool: PointerTool,\n            ConnectionEditTool: ConnectionEditTool,\n            RotateUnit: RotateUnit\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/diagram/layout', ['dataviz/diagram/math'], f);\n}(function () {\n    (function ($, undefined) {\n        var kendo = window.kendo, diagram = kendo.dataviz.diagram, Graph = diagram.Graph, Node = diagram.Node, Link = diagram.Link, deepExtend = kendo.deepExtend, Size = diagram.Size, Rect = diagram.Rect, Dictionary = diagram.Dictionary, Set = diagram.Set, HyperTree = diagram.Graph, Utils = diagram.Utils, Point = diagram.Point, EPSILON = 0.000001, DEG_TO_RAD = Math.PI / 180, contains = Utils.contains, grep = $.grep;\n        var LayoutBase = kendo.Class.extend({\n            defaultOptions: {\n                type: 'Tree',\n                subtype: 'Down',\n                roots: null,\n                animate: false,\n                limitToView: false,\n                friction: 0.9,\n                nodeDistance: 50,\n                iterations: 300,\n                horizontalSeparation: 90,\n                verticalSeparation: 50,\n                underneathVerticalTopOffset: 15,\n                underneathHorizontalOffset: 15,\n                underneathVerticalSeparation: 15,\n                grid: {\n                    width: 1500,\n                    offsetX: 50,\n                    offsetY: 50,\n                    componentSpacingX: 20,\n                    componentSpacingY: 20\n                },\n                layerSeparation: 50,\n                layeredIterations: 2,\n                startRadialAngle: 0,\n                endRadialAngle: 360,\n                radialSeparation: 150,\n                radialFirstLevelSeparation: 200,\n                keepComponentsInOneRadialLayout: false,\n                ignoreContainers: true,\n                layoutContainerChildren: false,\n                ignoreInvisible: true,\n                animateTransitions: false\n            },\n            init: function () {\n            },\n            gridLayoutComponents: function (components) {\n                if (!components) {\n                    throw 'No components supplied.';\n                }\n                Utils.forEach(components, function (c) {\n                    c.calcBounds();\n                });\n                components.sort(function (a, b) {\n                    return b.bounds.width - a.bounds.width;\n                });\n                var maxWidth = this.options.grid.width, offsetX = this.options.grid.componentSpacingX, offsetY = this.options.grid.componentSpacingY, height = 0, startX = this.options.grid.offsetX, startY = this.options.grid.offsetY, x = startX, y = startY, i, resultLinkSet = [], resultNodeSet = [];\n                while (components.length > 0) {\n                    if (x >= maxWidth) {\n                        x = startX;\n                        y += height + offsetY;\n                        height = 0;\n                    }\n                    var component = components.pop();\n                    this.moveToOffset(component, new Point(x, y));\n                    for (i = 0; i < component.nodes.length; i++) {\n                        resultNodeSet.push(component.nodes[i]);\n                    }\n                    for (i = 0; i < component.links.length; i++) {\n                        resultLinkSet.push(component.links[i]);\n                    }\n                    var boundingRect = component.bounds;\n                    var currentHeight = boundingRect.height;\n                    if (currentHeight <= 0 || isNaN(currentHeight)) {\n                        currentHeight = 0;\n                    }\n                    var currentWidth = boundingRect.width;\n                    if (currentWidth <= 0 || isNaN(currentWidth)) {\n                        currentWidth = 0;\n                    }\n                    if (currentHeight >= height) {\n                        height = currentHeight;\n                    }\n                    x += currentWidth + offsetX;\n                }\n                return {\n                    nodes: resultNodeSet,\n                    links: resultLinkSet\n                };\n            },\n            moveToOffset: function (component, p) {\n                var i, j, bounds = component.bounds, deltax = p.x - bounds.x, deltay = p.y - bounds.y;\n                for (i = 0; i < component.nodes.length; i++) {\n                    var node = component.nodes[i];\n                    var nodeBounds = node.bounds();\n                    if (nodeBounds.width === 0 && nodeBounds.height === 0 && nodeBounds.x === 0 && nodeBounds.y === 0) {\n                        nodeBounds = new Rect(0, 0, 0, 0);\n                    }\n                    nodeBounds.x += deltax;\n                    nodeBounds.y += deltay;\n                    node.bounds(nodeBounds);\n                }\n                for (i = 0; i < component.links.length; i++) {\n                    var link = component.links[i];\n                    if (link.points) {\n                        var newpoints = [];\n                        var points = link.points;\n                        for (j = 0; j < points.length; j++) {\n                            var pt = points[j];\n                            pt.x += deltax;\n                            pt.y += deltay;\n                            newpoints.push(pt);\n                        }\n                        link.points = newpoints;\n                    }\n                }\n                this.currentHorizontalOffset += bounds.width + this.options.grid.offsetX;\n                return new Point(deltax, deltay);\n            },\n            transferOptions: function (options) {\n                this.options = kendo.deepExtend({}, this.defaultOptions);\n                if (Utils.isUndefined(options)) {\n                    return;\n                }\n                this.options = kendo.deepExtend(this.options, options || {});\n            }\n        });\n        var DiagramToHyperTreeAdapter = kendo.Class.extend({\n            init: function (diagram) {\n                this.nodeMap = new Dictionary();\n                this.shapeMap = new Dictionary();\n                this.nodes = [];\n                this.edges = [];\n                this.edgeMap = new Dictionary();\n                this.finalNodes = [];\n                this.finalLinks = [];\n                this.ignoredConnections = [];\n                this.ignoredShapes = [];\n                this.hyperMap = new Dictionary();\n                this.hyperTree = new Graph();\n                this.finalGraph = null;\n                this.diagram = diagram;\n            },\n            convert: function (options) {\n                if (Utils.isUndefined(this.diagram)) {\n                    throw 'No diagram to convert.';\n                }\n                this.options = kendo.deepExtend({\n                    ignoreInvisible: true,\n                    ignoreContainers: true,\n                    layoutContainerChildren: false\n                }, options || {});\n                this.clear();\n                this._renormalizeShapes();\n                this._renormalizeConnections();\n                this.finalNodes = new Dictionary(this.nodes);\n                this.finalLinks = new Dictionary(this.edges);\n                this.finalGraph = new Graph();\n                this.finalNodes.forEach(function (n) {\n                    this.finalGraph.addNode(n);\n                }, this);\n                this.finalLinks.forEach(function (l) {\n                    this.finalGraph.addExistingLink(l);\n                }, this);\n                return this.finalGraph;\n            },\n            mapConnection: function (connection) {\n                return this.edgeMap.get(connection.id);\n            },\n            mapShape: function (shape) {\n                return this.nodeMap.get(shape.id);\n            },\n            getEdge: function (a, b) {\n                return Utils.first(a.links, function (link) {\n                    return link.getComplement(a) === b;\n                });\n            },\n            clear: function () {\n                this.finalGraph = null;\n                this.hyperTree = !this.options.ignoreContainers && this.options.layoutContainerChildren ? new HyperTree() : null;\n                this.hyperMap = !this.options.ignoreContainers && this.options.layoutContainerChildren ? new Dictionary() : null;\n                this.nodeMap = new Dictionary();\n                this.shapeMap = new Dictionary();\n                this.nodes = [];\n                this.edges = [];\n                this.edgeMap = new Dictionary();\n                this.ignoredConnections = [];\n                this.ignoredShapes = [];\n                this.finalNodes = [];\n                this.finalLinks = [];\n            },\n            listToRoot: function (containerGraph) {\n                var list = [];\n                var s = containerGraph.container;\n                if (!s) {\n                    return list;\n                }\n                list.push(s);\n                while (s.parentContainer) {\n                    s = s.parentContainer;\n                    list.push(s);\n                }\n                list.reverse();\n                return list;\n            },\n            firstNonIgnorableContainer: function (shape) {\n                if (shape.isContainer && !this._isIgnorableItem(shape)) {\n                    return shape;\n                }\n                return !shape.parentContainer ? null : this.firstNonIgnorableContainer(shape.parentContainer);\n            },\n            isContainerConnection: function (a, b) {\n                if (a.isContainer && this.isDescendantOf(a, b)) {\n                    return true;\n                }\n                return b.isContainer && this.isDescendantOf(b, a);\n            },\n            isDescendantOf: function (scope, a) {\n                if (!scope.isContainer) {\n                    throw 'Expecting a container.';\n                }\n                if (scope === a) {\n                    return false;\n                }\n                if (contains(scope.children, a)) {\n                    return true;\n                }\n                var containers = [];\n                for (var i = 0, len = scope.children.length; i < len; i++) {\n                    var c = scope.children[i];\n                    if (c.isContainer && this.isDescendantOf(c, a)) {\n                        containers.push(c);\n                    }\n                }\n                return containers.length > 0;\n            },\n            isIgnorableItem: function (shape) {\n                if (this.options.ignoreInvisible) {\n                    if (shape.isCollapsed && this._isVisible(shape)) {\n                        return false;\n                    }\n                    if (!shape.isCollapsed && this._isVisible(shape)) {\n                        return false;\n                    }\n                    return true;\n                } else {\n                    return shape.isCollapsed && !this._isTop(shape);\n                }\n            },\n            isShapeMapped: function (shape) {\n                return shape.isCollapsed && !this._isVisible(shape) && !this._isTop(shape);\n            },\n            leastCommonAncestor: function (a, b) {\n                if (!a) {\n                    throw 'Parameter should not be null.';\n                }\n                if (!b) {\n                    throw 'Parameter should not be null.';\n                }\n                if (!this.hyperTree) {\n                    throw 'No hypertree available.';\n                }\n                var al = this.listToRoot(a);\n                var bl = this.listToRoot(b);\n                var found = null;\n                if (Utils.isEmpty(al) || Utils.isEmpty(bl)) {\n                    return this.hyperTree.root.data;\n                }\n                var xa = al[0];\n                var xb = bl[0];\n                var i = 0;\n                while (xa === xb) {\n                    found = al[i];\n                    i++;\n                    if (i >= al.length || i >= bl.length) {\n                        break;\n                    }\n                    xa = al[i];\n                    xb = bl[i];\n                }\n                if (!found) {\n                    return this.hyperTree.root.data;\n                } else {\n                    return grep(this.hyperTree.nodes, function (n) {\n                        return n.data.container === found;\n                    });\n                }\n            },\n            _isTop: function (item) {\n                return !item.parentContainer;\n            },\n            _isVisible: function (shape) {\n                if (!shape.visible()) {\n                    return false;\n                }\n                return !shape.parentContainer ? shape.visible() : this._isVisible(shape.parentContainer);\n            },\n            _isCollapsed: function (shape) {\n                if (shape.isContainer && shape.isCollapsed) {\n                    return true;\n                }\n                return shape.parentContainer && this._isCollapsed(shape.parentContainer);\n            },\n            _renormalizeShapes: function () {\n                if (this.options.ignoreContainers) {\n                    for (var i = 0, len = this.diagram.shapes.length; i < len; i++) {\n                        var shape = this.diagram.shapes[i];\n                        if (this.options.ignoreInvisible && !this._isVisible(shape) || shape.isContainer) {\n                            this.ignoredShapes.push(shape);\n                            continue;\n                        }\n                        var node = new Node(shape.id, shape);\n                        node.isVirtual = false;\n                        this.nodeMap.add(shape.id, node);\n                        this.nodes.push(node);\n                    }\n                } else {\n                    throw 'Containers are not supported yet, but stay tuned.';\n                }\n            },\n            _renormalizeConnections: function () {\n                if (this.diagram.connections.length === 0) {\n                    return;\n                }\n                for (var i = 0, len = this.diagram.connections.length; i < len; i++) {\n                    var conn = this.diagram.connections[i];\n                    if (this.isIgnorableItem(conn)) {\n                        this.ignoredConnections.push(conn);\n                        continue;\n                    }\n                    var source = !conn.sourceConnector ? null : conn.sourceConnector.shape;\n                    var sink = !conn.targetConnector ? null : conn.targetConnector.shape;\n                    if (!source || !sink) {\n                        this.ignoredConnections.push(conn);\n                        continue;\n                    }\n                    if (contains(this.ignoredShapes, source) && !this.shapeMap.containsKey(source)) {\n                        this.ignoredConnections.push(conn);\n                        continue;\n                    }\n                    if (contains(this.ignoredShapes, sink) && !this.shapeMap.containsKey(sink)) {\n                        this.ignoredConnections.push(conn);\n                        continue;\n                    }\n                    if (this.shapeMap.containsKey(source)) {\n                        source = this.shapeMap[source];\n                    }\n                    if (this.shapeMap.containsKey(sink)) {\n                        sink = this.shapeMap[sink];\n                    }\n                    var sourceNode = this.mapShape(source);\n                    var sinkNode = this.mapShape(sink);\n                    if (sourceNode === sinkNode || this.areConnectedAlready(sourceNode, sinkNode)) {\n                        this.ignoredConnections.push(conn);\n                        continue;\n                    }\n                    if (sourceNode === null || sinkNode === null) {\n                        throw 'A shape was not mapped to a node.';\n                    }\n                    if (this.options.ignoreContainers) {\n                        if (sourceNode.isVirtual || sinkNode.isVirtual) {\n                            this.ignoredConnections.push(conn);\n                            continue;\n                        }\n                        var newEdge = new Link(sourceNode, sinkNode, conn.id, conn);\n                        this.edgeMap.add(conn.id, newEdge);\n                        this.edges.push(newEdge);\n                    } else {\n                        throw 'Containers are not supported yet, but stay tuned.';\n                    }\n                }\n            },\n            areConnectedAlready: function (n, m) {\n                return Utils.any(this.edges, function (l) {\n                    return l.source === n && l.target === m || l.source === m && l.target === n;\n                });\n            }\n        });\n        var SpringLayout = LayoutBase.extend({\n            init: function (diagram) {\n                var that = this;\n                LayoutBase.fn.init.call(that);\n                if (Utils.isUndefined(diagram)) {\n                    throw 'Diagram is not specified.';\n                }\n                this.diagram = diagram;\n            },\n            layout: function (options) {\n                this.transferOptions(options);\n                var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n                var graph = adapter.convert(options);\n                if (graph.isEmpty()) {\n                    return;\n                }\n                var components = graph.getConnectedComponents();\n                if (Utils.isEmpty(components)) {\n                    return;\n                }\n                for (var i = 0; i < components.length; i++) {\n                    var component = components[i];\n                    this.layoutGraph(component, options);\n                }\n                var finalNodeSet = this.gridLayoutComponents(components);\n                return new diagram.LayoutState(this.diagram, finalNodeSet);\n            },\n            layoutGraph: function (graph, options) {\n                if (Utils.isDefined(options)) {\n                    this.transferOptions(options);\n                }\n                this.graph = graph;\n                var initialTemperature = this.options.nodeDistance * 9;\n                this.temperature = initialTemperature;\n                var guessBounds = this._expectedBounds();\n                this.width = guessBounds.width;\n                this.height = guessBounds.height;\n                for (var step = 0; step < this.options.iterations; step++) {\n                    this.refineStage = step >= this.options.iterations * 5 / 6;\n                    this.tick();\n                    this.temperature = this.refineStage ? initialTemperature / 30 : initialTemperature * (1 - step / (2 * this.options.iterations));\n                }\n            },\n            tick: function () {\n                var i;\n                for (i = 0; i < this.graph.nodes.length; i++) {\n                    this._repulsion(this.graph.nodes[i]);\n                }\n                for (i = 0; i < this.graph.links.length; i++) {\n                    this._attraction(this.graph.links[i]);\n                }\n                for (i = 0; i < this.graph.nodes.length; i++) {\n                    var node = this.graph.nodes[i];\n                    var offset = Math.sqrt(node.dx * node.dx + node.dy * node.dy);\n                    if (offset === 0) {\n                        return;\n                    }\n                    node.x += Math.min(offset, this.temperature) * node.dx / offset;\n                    node.y += Math.min(offset, this.temperature) * node.dy / offset;\n                    if (this.options.limitToView) {\n                        node.x = Math.min(this.width, Math.max(node.width / 2, node.x));\n                        node.y = Math.min(this.height, Math.max(node.height / 2, node.y));\n                    }\n                }\n            },\n            _shake: function (node) {\n                var rho = Math.random() * this.options.nodeDistance / 4;\n                var alpha = Math.random() * 2 * Math.PI;\n                node.x += rho * Math.cos(alpha);\n                node.y -= rho * Math.sin(alpha);\n            },\n            _InverseSquareForce: function (d, n, m) {\n                var force;\n                if (!this.refineStage) {\n                    force = Math.pow(d, 2) / Math.pow(this.options.nodeDistance, 2);\n                } else {\n                    var deltax = n.x - m.x;\n                    var deltay = n.y - m.y;\n                    var wn = n.width / 2;\n                    var hn = n.height / 2;\n                    var wm = m.width / 2;\n                    var hm = m.height / 2;\n                    force = Math.pow(deltax, 2) / Math.pow(wn + wm + this.options.nodeDistance, 2) + Math.pow(deltay, 2) / Math.pow(hn + hm + this.options.nodeDistance, 2);\n                }\n                return force * 4 / 3;\n            },\n            _SquareForce: function (d, n, m) {\n                return 1 / this._InverseSquareForce(d, n, m);\n            },\n            _repulsion: function (n) {\n                n.dx = 0;\n                n.dy = 0;\n                Utils.forEach(this.graph.nodes, function (m) {\n                    if (m === n) {\n                        return;\n                    }\n                    while (n.x === m.x && n.y === m.y) {\n                        this._shake(m);\n                    }\n                    var vx = n.x - m.x;\n                    var vy = n.y - m.y;\n                    var distance = Math.sqrt(vx * vx + vy * vy);\n                    var r = this._SquareForce(distance, n, m) * 2;\n                    n.dx += vx / distance * r;\n                    n.dy += vy / distance * r;\n                }, this);\n            },\n            _attraction: function (link) {\n                var t = link.target;\n                var s = link.source;\n                if (s === t) {\n                    return;\n                }\n                while (s.x === t.x && s.y === t.y) {\n                    this._shake(t);\n                }\n                var vx = s.x - t.x;\n                var vy = s.y - t.y;\n                var distance = Math.sqrt(vx * vx + vy * vy);\n                var a = this._InverseSquareForce(distance, s, t) * 5;\n                var dx = vx / distance * a;\n                var dy = vy / distance * a;\n                t.dx += dx;\n                t.dy += dy;\n                s.dx -= dx;\n                s.dy -= dy;\n            },\n            _expectedBounds: function () {\n                var size, N = this.graph.nodes.length, ratio = 1.5, multiplier = 4;\n                if (N === 0) {\n                    return size;\n                }\n                size = Utils.fold(this.graph.nodes, function (s, node) {\n                    var area = node.width * node.height;\n                    if (area > 0) {\n                        s += Math.sqrt(area);\n                        return s;\n                    }\n                    return 0;\n                }, 0, this);\n                var av = size / N;\n                var squareSize = av * Math.ceil(Math.sqrt(N));\n                var width = squareSize * Math.sqrt(ratio);\n                var height = squareSize / Math.sqrt(ratio);\n                return {\n                    width: width * multiplier,\n                    height: height * multiplier\n                };\n            }\n        });\n        var TreeLayoutProcessor = kendo.Class.extend({\n            init: function (options) {\n                this.center = null;\n                this.options = options;\n            },\n            layout: function (treeGraph, root) {\n                this.graph = treeGraph;\n                if (!this.graph.nodes || this.graph.nodes.length === 0) {\n                    return;\n                }\n                if (!contains(this.graph.nodes, root)) {\n                    throw 'The given root is not in the graph.';\n                }\n                this.center = root;\n                this.graph.cacheRelationships();\n                this.layoutSwitch();\n            },\n            layoutLeft: function (left) {\n                this.setChildrenDirection(this.center, 'Left', false);\n                this.setChildrenLayout(this.center, 'Default', false);\n                var h = 0, w = 0, y, i, node;\n                for (i = 0; i < left.length; i++) {\n                    node = left[i];\n                    node.TreeDirection = 'Left';\n                    var s = this.measure(node, Size.Empty);\n                    w = Math.max(w, s.Width);\n                    h += s.height + this.options.verticalSeparation;\n                }\n                h -= this.options.verticalSeparation;\n                var x = this.center.x - this.options.horizontalSeparation;\n                y = this.center.y + (this.center.height - h) / 2;\n                for (i = 0; i < left.length; i++) {\n                    node = left[i];\n                    var p = new Point(x - node.Size.width, y);\n                    this.arrange(node, p);\n                    y += node.Size.height + this.options.verticalSeparation;\n                }\n            },\n            layoutRight: function (right) {\n                this.setChildrenDirection(this.center, 'Right', false);\n                this.setChildrenLayout(this.center, 'Default', false);\n                var h = 0, w = 0, y, i, node;\n                for (i = 0; i < right.length; i++) {\n                    node = right[i];\n                    node.TreeDirection = 'Right';\n                    var s = this.measure(node, Size.Empty);\n                    w = Math.max(w, s.Width);\n                    h += s.height + this.options.verticalSeparation;\n                }\n                h -= this.options.verticalSeparation;\n                var x = this.center.x + this.options.horizontalSeparation + this.center.width;\n                y = this.center.y + (this.center.height - h) / 2;\n                for (i = 0; i < right.length; i++) {\n                    node = right[i];\n                    var p = new Point(x, y);\n                    this.arrange(node, p);\n                    y += node.Size.height + this.options.verticalSeparation;\n                }\n            },\n            layoutUp: function (up) {\n                this.setChildrenDirection(this.center, 'Up', false);\n                this.setChildrenLayout(this.center, 'Default', false);\n                var w = 0, y, node, i;\n                for (i = 0; i < up.length; i++) {\n                    node = up[i];\n                    node.TreeDirection = 'Up';\n                    var s = this.measure(node, Size.Empty);\n                    w += s.width + this.options.horizontalSeparation;\n                }\n                w -= this.options.horizontalSeparation;\n                var x = this.center.x + this.center.width / 2 - w / 2;\n                for (i = 0; i < up.length; i++) {\n                    node = up[i];\n                    y = this.center.y - this.options.verticalSeparation - node.Size.height;\n                    var p = new Point(x, y);\n                    this.arrange(node, p);\n                    x += node.Size.width + this.options.horizontalSeparation;\n                }\n            },\n            layoutDown: function (down) {\n                var node, i;\n                this.setChildrenDirection(this.center, 'Down', false);\n                this.setChildrenLayout(this.center, 'Default', false);\n                var w = 0, y;\n                for (i = 0; i < down.length; i++) {\n                    node = down[i];\n                    node.treeDirection = 'Down';\n                    var s = this.measure(node, Size.Empty);\n                    w += s.width + this.options.horizontalSeparation;\n                }\n                w -= this.options.horizontalSeparation;\n                var x = this.center.x + this.center.width / 2 - w / 2;\n                y = this.center.y + this.options.verticalSeparation + this.center.height;\n                for (i = 0; i < down.length; i++) {\n                    node = down[i];\n                    var p = new Point(x, y);\n                    this.arrange(node, p);\n                    x += node.Size.width + this.options.horizontalSeparation;\n                }\n            },\n            layoutRadialTree: function () {\n                this.setChildrenDirection(this.center, 'Radial', false);\n                this.setChildrenLayout(this.center, 'Default', false);\n                this.previousRoot = null;\n                var startAngle = this.options.startRadialAngle * DEG_TO_RAD;\n                var endAngle = this.options.endRadialAngle * DEG_TO_RAD;\n                if (endAngle <= startAngle) {\n                    throw 'Final angle should not be less than the start angle.';\n                }\n                this.maxDepth = 0;\n                this.origin = new Point(this.center.x, this.center.y);\n                this.calculateAngularWidth(this.center, 0);\n                if (this.maxDepth > 0) {\n                    this.radialLayout(this.center, this.options.radialFirstLevelSeparation, startAngle, endAngle);\n                }\n                this.center.Angle = endAngle - startAngle;\n            },\n            tipOverTree: function (down, startFromLevel) {\n                if (Utils.isUndefined(startFromLevel)) {\n                    startFromLevel = 0;\n                }\n                this.setChildrenDirection(this.center, 'Down', false);\n                this.setChildrenLayout(this.center, 'Default', false);\n                this.setChildrenLayout(this.center, 'Underneath', false, startFromLevel);\n                var w = 0, y, node, i;\n                for (i = 0; i < down.length; i++) {\n                    node = down[i];\n                    node.TreeDirection = 'Down';\n                    var s = this.measure(node, Size.Empty);\n                    w += s.width + this.options.horizontalSeparation;\n                }\n                w -= this.options.horizontalSeparation;\n                w -= down[down.length - 1].width;\n                w += down[down.length - 1].associatedShape.bounds().width;\n                var x = this.center.x + this.center.width / 2 - w / 2;\n                y = this.center.y + this.options.verticalSeparation + this.center.height;\n                for (i = 0; i < down.length; i++) {\n                    node = down[i];\n                    var p = new Point(x, y);\n                    this.arrange(node, p);\n                    x += node.Size.width + this.options.horizontalSeparation;\n                }\n            },\n            calculateAngularWidth: function (n, d) {\n                if (d > this.maxDepth) {\n                    this.maxDepth = d;\n                }\n                var aw = 0, w = 1000, h = 1000, diameter = d === 0 ? 0 : Math.sqrt(w * w + h * h) / d;\n                if (n.children.length > 0) {\n                    for (var i = 0, len = n.children.length; i < len; i++) {\n                        var child = n.children[i];\n                        aw += this.calculateAngularWidth(child, d + 1);\n                    }\n                    aw = Math.max(diameter, aw);\n                } else {\n                    aw = diameter;\n                }\n                n.sectorAngle = aw;\n                return aw;\n            },\n            sortChildren: function (n) {\n                var basevalue = 0, i;\n                if (n.parents.length > 1) {\n                    throw 'Node is not part of a tree.';\n                }\n                var p = n.parents[0];\n                if (p) {\n                    var pl = new Point(p.x, p.y);\n                    var nl = new Point(n.x, n.y);\n                    basevalue = this.normalizeAngle(Math.atan2(pl.y - nl.y, pl.x - nl.x));\n                }\n                var count = n.children.length;\n                if (count === 0) {\n                    return null;\n                }\n                var angle = [];\n                var idx = [];\n                for (i = 0; i < count; ++i) {\n                    var c = n.children[i];\n                    var l = new Point(c.x, c.y);\n                    idx[i] = i;\n                    angle[i] = this.normalizeAngle(-basevalue + Math.atan2(l.y - l.y, l.x - l.x));\n                }\n                Utils.bisort(angle, idx);\n                var col = [];\n                var children = n.children;\n                for (i = 0; i < count; ++i) {\n                    col.push(children[idx[i]]);\n                }\n                return col;\n            },\n            normalizeAngle: function (angle) {\n                while (angle > Math.PI * 2) {\n                    angle -= 2 * Math.PI;\n                }\n                while (angle < 0) {\n                    angle += Math.PI * 2;\n                }\n                return angle;\n            },\n            radialLayout: function (node, radius, startAngle, endAngle) {\n                var deltaTheta = endAngle - startAngle;\n                var deltaThetaHalf = deltaTheta / 2;\n                var parentSector = node.sectorAngle;\n                var fraction = 0;\n                var sorted = this.sortChildren(node);\n                for (var i = 0, len = sorted.length; i < len; i++) {\n                    var childNode = sorted[i];\n                    var cp = childNode;\n                    var childAngleFraction = cp.sectorAngle / parentSector;\n                    if (childNode.children.length > 0) {\n                        this.radialLayout(childNode, radius + this.options.radialSeparation, startAngle + fraction * deltaTheta, startAngle + (fraction + childAngleFraction) * deltaTheta);\n                    }\n                    this.setPolarLocation(childNode, radius, startAngle + fraction * deltaTheta + childAngleFraction * deltaThetaHalf);\n                    cp.angle = childAngleFraction * deltaTheta;\n                    fraction += childAngleFraction;\n                }\n            },\n            setPolarLocation: function (node, radius, angle) {\n                node.x = this.origin.x + radius * Math.cos(angle);\n                node.y = this.origin.y + radius * Math.sin(angle);\n                node.BoundingRectangle = new Rect(node.x, node.y, node.width, node.height);\n            },\n            setChildrenDirection: function (node, direction, includeStart) {\n                var rootDirection = node.treeDirection;\n                this.graph.depthFirstTraversal(node, function (n) {\n                    n.treeDirection = direction;\n                });\n                if (!includeStart) {\n                    node.treeDirection = rootDirection;\n                }\n            },\n            setChildrenLayout: function (node, layout, includeStart, startFromLevel) {\n                if (Utils.isUndefined(startFromLevel)) {\n                    startFromLevel = 0;\n                }\n                var rootLayout = node.childrenLayout;\n                if (startFromLevel > 0) {\n                    this.graph.assignLevels(node);\n                    this.graph.depthFirstTraversal(node, function (s) {\n                        if (s.level >= startFromLevel + 1) {\n                            s.childrenLayout = layout;\n                        }\n                    });\n                } else {\n                    this.graph.depthFirstTraversal(node, function (s) {\n                        s.childrenLayout = layout;\n                    });\n                    if (!includeStart) {\n                        node.childrenLayout = rootLayout;\n                    }\n                }\n            },\n            measure: function (node, givenSize) {\n                var w = 0, h = 0, s;\n                var result = new Size(0, 0);\n                if (!node) {\n                    throw '';\n                }\n                var b = node.associatedShape.bounds();\n                var shapeWidth = b.width;\n                var shapeHeight = b.height;\n                if (node.parents.length !== 1) {\n                    throw 'Node not in a spanning tree.';\n                }\n                var parent = node.parents[0];\n                if (node.treeDirection === 'Undefined') {\n                    node.treeDirection = parent.treeDirection;\n                }\n                if (Utils.isEmpty(node.children)) {\n                    result = new Size(Math.abs(shapeWidth) < EPSILON ? 50 : shapeWidth, Math.abs(shapeHeight) < EPSILON ? 25 : shapeHeight);\n                } else if (node.children.length === 1) {\n                    switch (node.treeDirection) {\n                    case 'Radial':\n                        s = this.measure(node.children[0], givenSize);\n                        w = shapeWidth + this.options.radialSeparation * Math.cos(node.AngleToParent) + s.width;\n                        h = shapeHeight + Math.abs(this.options.radialSeparation * Math.sin(node.AngleToParent)) + s.height;\n                        break;\n                    case 'Left':\n                    case 'Right':\n                        switch (node.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                            break;\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            s = this.measure(node.children[0], givenSize);\n                            w = shapeWidth + s.width + this.options.underneathHorizontalOffset;\n                            h = shapeHeight + this.options.underneathVerticalTopOffset + s.height;\n                            break;\n                        case 'Default':\n                            s = this.measure(node.children[0], givenSize);\n                            w = shapeWidth + this.options.horizontalSeparation + s.width;\n                            h = Math.max(shapeHeight, s.height);\n                            break;\n                        default:\n                            throw 'Unhandled TreeDirection in the Radial layout measuring.';\n                        }\n                        break;\n                    case 'Up':\n                    case 'Down':\n                        switch (node.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            s = this.measure(node.children[0], givenSize);\n                            w = Math.max(shapeWidth, s.width + this.options.underneathHorizontalOffset);\n                            h = shapeHeight + this.options.underneathVerticalTopOffset + s.height;\n                            break;\n                        case 'Default':\n                            s = this.measure(node.children[0], givenSize);\n                            h = shapeHeight + this.options.verticalSeparation + s.height;\n                            w = Math.max(shapeWidth, s.width);\n                            break;\n                        default:\n                            throw 'Unhandled TreeDirection in the Down layout measuring.';\n                        }\n                        break;\n                    default:\n                        throw 'Unhandled TreeDirection in the layout measuring.';\n                    }\n                    result = new Size(w, h);\n                } else {\n                    var i, childNode;\n                    switch (node.treeDirection) {\n                    case 'Left':\n                    case 'Right':\n                        switch (node.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            w = shapeWidth;\n                            h = shapeHeight + this.options.underneathVerticalTopOffset;\n                            for (i = 0; i < node.children.length; i++) {\n                                childNode = node.children[i];\n                                s = this.measure(childNode, givenSize);\n                                w = Math.max(w, s.width + this.options.underneathHorizontalOffset);\n                                h += s.height + this.options.underneathVerticalSeparation;\n                            }\n                            h -= this.options.underneathVerticalSeparation;\n                            break;\n                        case 'Default':\n                            w = shapeWidth;\n                            h = 0;\n                            for (i = 0; i < node.children.length; i++) {\n                                childNode = node.children[i];\n                                s = this.measure(childNode, givenSize);\n                                w = Math.max(w, shapeWidth + this.options.horizontalSeparation + s.width);\n                                h += s.height + this.options.verticalSeparation;\n                            }\n                            h -= this.options.verticalSeparation;\n                            break;\n                        default:\n                            throw 'Unhandled TreeDirection in the Right layout measuring.';\n                        }\n                        break;\n                    case 'Up':\n                    case 'Down':\n                        switch (node.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            w = shapeWidth;\n                            h = shapeHeight + this.options.underneathVerticalTopOffset;\n                            for (i = 0; i < node.children.length; i++) {\n                                childNode = node.children[i];\n                                s = this.measure(childNode, givenSize);\n                                w = Math.max(w, s.width + this.options.underneathHorizontalOffset);\n                                h += s.height + this.options.underneathVerticalSeparation;\n                            }\n                            h -= this.options.underneathVerticalSeparation;\n                            break;\n                        case 'Default':\n                            w = 0;\n                            h = 0;\n                            for (i = 0; i < node.children.length; i++) {\n                                childNode = node.children[i];\n                                s = this.measure(childNode, givenSize);\n                                w += s.width + this.options.horizontalSeparation;\n                                h = Math.max(h, s.height + this.options.verticalSeparation + shapeHeight);\n                            }\n                            w -= this.options.horizontalSeparation;\n                            break;\n                        default:\n                            throw 'Unhandled TreeDirection in the Down layout measuring.';\n                        }\n                        break;\n                    default:\n                        throw 'Unhandled TreeDirection in the layout measuring.';\n                    }\n                    result = new Size(w, h);\n                }\n                node.SectorAngle = Math.sqrt(w * w / 4 + h * h / 4);\n                node.Size = result;\n                return result;\n            },\n            arrange: function (n, p) {\n                var i, pp, child, node, childrenwidth, b = n.associatedShape.bounds();\n                var shapeWidth = b.width;\n                var shapeHeight = b.height;\n                if (Utils.isEmpty(n.children)) {\n                    n.x = p.x;\n                    n.y = p.y;\n                    n.BoundingRectangle = new Rect(p.x, p.y, shapeWidth, shapeHeight);\n                } else {\n                    var x, y;\n                    var selfLocation;\n                    switch (n.treeDirection) {\n                    case 'Left':\n                        switch (n.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            selfLocation = p;\n                            n.x = selfLocation.x;\n                            n.y = selfLocation.y;\n                            n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                            y = p.y + shapeHeight + this.options.underneathVerticalTopOffset;\n                            for (i = 0; i < node.children.length; i++) {\n                                node = node.children[i];\n                                x = selfLocation.x - node.associatedShape.width - this.options.underneathHorizontalOffset;\n                                pp = new Point(x, y);\n                                this.arrange(node, pp);\n                                y += node.Size.height + this.options.underneathVerticalSeparation;\n                            }\n                            break;\n                        case 'Default':\n                            selfLocation = new Point(p.x + n.Size.width - shapeWidth, p.y + (n.Size.height - shapeHeight) / 2);\n                            n.x = selfLocation.x;\n                            n.y = selfLocation.y;\n                            n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                            x = selfLocation.x - this.options.horizontalSeparation;\n                            y = p.y;\n                            for (i = 0; i < n.children.length; i++) {\n                                node = n.children[i];\n                                pp = new Point(x - node.Size.width, y);\n                                this.arrange(node, pp);\n                                y += node.Size.height + this.options.verticalSeparation;\n                            }\n                            break;\n                        default:\n                            throw 'Unsupported TreeDirection';\n                        }\n                        break;\n                    case 'Right':\n                        switch (n.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            selfLocation = p;\n                            n.x = selfLocation.x;\n                            n.y = selfLocation.y;\n                            n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                            x = p.x + shapeWidth + this.options.underneathHorizontalOffset;\n                            y = p.y + shapeHeight + this.options.underneathVerticalTopOffset;\n                            for (i = 0; i < n.children.length; i++) {\n                                node = n.children[i];\n                                pp = new Point(x, y);\n                                this.arrange(node, pp);\n                                y += node.Size.height + this.options.underneathVerticalSeparation;\n                            }\n                            break;\n                        case 'Default':\n                            selfLocation = new Point(p.x, p.y + (n.Size.height - shapeHeight) / 2);\n                            n.x = selfLocation.x;\n                            n.y = selfLocation.y;\n                            n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                            x = p.x + shapeWidth + this.options.horizontalSeparation;\n                            y = p.y;\n                            for (i = 0; i < n.children.length; i++) {\n                                node = n.children[i];\n                                pp = new Point(x, y);\n                                this.arrange(node, pp);\n                                y += node.Size.height + this.options.verticalSeparation;\n                            }\n                            break;\n                        default:\n                            throw 'Unsupported TreeDirection';\n                        }\n                        break;\n                    case 'Up':\n                        selfLocation = new Point(p.x + (n.Size.width - shapeWidth) / 2, p.y + n.Size.height - shapeHeight);\n                        n.x = selfLocation.x;\n                        n.y = selfLocation.y;\n                        n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                        if (Math.abs(selfLocation.x - p.x) < EPSILON) {\n                            childrenwidth = 0;\n                            for (i = 0; i < n.children.length; i++) {\n                                child = n.children[i];\n                                childrenwidth += child.Size.width + this.options.horizontalSeparation;\n                            }\n                            childrenwidth -= this.options.horizontalSeparation;\n                            x = p.x + (shapeWidth - childrenwidth) / 2;\n                        } else {\n                            x = p.x;\n                        }\n                        for (i = 0; i < n.children.length; i++) {\n                            node = n.children[i];\n                            y = selfLocation.y - this.options.verticalSeparation - node.Size.height;\n                            pp = new Point(x, y);\n                            this.arrange(node, pp);\n                            x += node.Size.width + this.options.horizontalSeparation;\n                        }\n                        break;\n                    case 'Down':\n                        switch (n.childrenLayout) {\n                        case 'TopAlignedWithParent':\n                        case 'BottomAlignedWithParent':\n                            break;\n                        case 'Underneath':\n                            selfLocation = p;\n                            n.x = selfLocation.x;\n                            n.y = selfLocation.y;\n                            n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                            x = p.x + this.options.underneathHorizontalOffset;\n                            y = p.y + shapeHeight + this.options.underneathVerticalTopOffset;\n                            for (i = 0; i < n.children.length; i++) {\n                                node = n.children[i];\n                                pp = new Point(x, y);\n                                this.arrange(node, pp);\n                                y += node.Size.height + this.options.underneathVerticalSeparation;\n                            }\n                            break;\n                        case 'Default':\n                            selfLocation = new Point(p.x + (n.Size.width - shapeWidth) / 2, p.y);\n                            n.x = selfLocation.x;\n                            n.y = selfLocation.y;\n                            n.BoundingRectangle = new Rect(n.x, n.y, n.width, n.height);\n                            if (Math.abs(selfLocation.x - p.x) < EPSILON) {\n                                childrenwidth = 0;\n                                for (i = 0; i < n.children.length; i++) {\n                                    child = n.children[i];\n                                    childrenwidth += child.Size.width + this.options.horizontalSeparation;\n                                }\n                                childrenwidth -= this.options.horizontalSeparation;\n                                x = p.x + (shapeWidth - childrenwidth) / 2;\n                            } else {\n                                x = p.x;\n                            }\n                            for (i = 0; i < n.children.length; i++) {\n                                node = n.children[i];\n                                y = selfLocation.y + this.options.verticalSeparation + shapeHeight;\n                                pp = new Point(x, y);\n                                this.arrange(node, pp);\n                                x += node.Size.width + this.options.horizontalSeparation;\n                            }\n                            break;\n                        default:\n                            throw 'Unsupported TreeDirection';\n                        }\n                        break;\n                    case 'None':\n                        break;\n                    default:\n                        throw 'Unsupported TreeDirection';\n                    }\n                }\n            },\n            layoutSwitch: function () {\n                if (!this.center) {\n                    return;\n                }\n                if (Utils.isEmpty(this.center.children)) {\n                    return;\n                }\n                var type = this.options.subtype;\n                if (Utils.isUndefined(type)) {\n                    type = 'Down';\n                }\n                var single, male, female, leftcount;\n                var children = this.center.children;\n                switch (type.toLowerCase()) {\n                case 'radial':\n                case 'radialtree':\n                    this.layoutRadialTree();\n                    break;\n                case 'mindmaphorizontal':\n                case 'mindmap':\n                    single = this.center.children;\n                    if (this.center.children.length === 1) {\n                        this.layoutRight(single);\n                    } else {\n                        leftcount = children.length / 2;\n                        male = grep(this.center.children, function (n) {\n                            return Utils.indexOf(children, n) < leftcount;\n                        });\n                        female = grep(this.center.children, function (n) {\n                            return Utils.indexOf(children, n) >= leftcount;\n                        });\n                        this.layoutLeft(male);\n                        this.layoutRight(female);\n                    }\n                    break;\n                case 'mindmapvertical':\n                    single = this.center.children;\n                    if (this.center.children.length === 1) {\n                        this.layoutDown(single);\n                    } else {\n                        leftcount = children.length / 2;\n                        male = grep(this.center.children, function (n) {\n                            return Utils.indexOf(children, n) < leftcount;\n                        });\n                        female = grep(this.center.children, function (n) {\n                            return Utils.indexOf(children, n) >= leftcount;\n                        });\n                        this.layoutUp(male);\n                        this.layoutDown(female);\n                    }\n                    break;\n                case 'right':\n                    this.layoutRight(this.center.children);\n                    break;\n                case 'left':\n                    this.layoutLeft(this.center.children);\n                    break;\n                case 'up':\n                case 'bottom':\n                    this.layoutUp(this.center.children);\n                    break;\n                case 'down':\n                case 'top':\n                    this.layoutDown(this.center.children);\n                    break;\n                case 'tipover':\n                case 'tipovertree':\n                    if (this.options.tipOverTreeStartLevel < 0) {\n                        throw 'The tip-over level should be a positive integer.';\n                    }\n                    this.tipOverTree(this.center.children, this.options.tipOverTreeStartLevel);\n                    break;\n                case 'undefined':\n                case 'none':\n                    break;\n                }\n            }\n        });\n        var TreeLayout = LayoutBase.extend({\n            init: function (diagram) {\n                var that = this;\n                LayoutBase.fn.init.call(that);\n                if (Utils.isUndefined(diagram)) {\n                    throw 'No diagram specified.';\n                }\n                this.diagram = diagram;\n            },\n            layout: function (options) {\n                this.transferOptions(options);\n                var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n                this.graph = adapter.convert();\n                var finalNodeSet = this.layoutComponents();\n                return new diagram.LayoutState(this.diagram, finalNodeSet);\n            },\n            layoutComponents: function () {\n                if (this.graph.isEmpty()) {\n                    return;\n                }\n                var components = this.graph.getConnectedComponents();\n                if (Utils.isEmpty(components)) {\n                    return;\n                }\n                var layout = new TreeLayoutProcessor(this.options);\n                var trees = [];\n                for (var i = 0; i < components.length; i++) {\n                    var component = components[i];\n                    var treeGraph = this.getTree(component);\n                    if (!treeGraph) {\n                        throw 'Failed to find a spanning tree for the component.';\n                    }\n                    var root = treeGraph.root;\n                    var tree = treeGraph.tree;\n                    layout.layout(tree, root);\n                    trees.push(tree);\n                }\n                return this.gridLayoutComponents(trees);\n            },\n            getTree: function (graph) {\n                var root = null;\n                if (this.options.roots && this.options.roots.length > 0) {\n                    for (var i = 0, len = graph.nodes.length; i < len; i++) {\n                        var node = graph.nodes[i];\n                        for (var j = 0; j < this.options.roots.length; j++) {\n                            var givenRootShape = this.options.roots[j];\n                            if (givenRootShape === node.associatedShape) {\n                                root = node;\n                                break;\n                            }\n                        }\n                    }\n                }\n                if (!root) {\n                    root = graph.root();\n                    if (!root) {\n                        throw 'Unable to find a root for the tree.';\n                    }\n                }\n                return this.getTreeForRoot(graph, root);\n            },\n            getTreeForRoot: function (graph, root) {\n                var tree = graph.getSpanningTree(root);\n                if (Utils.isUndefined(tree) || tree.isEmpty()) {\n                    return null;\n                }\n                return {\n                    tree: tree,\n                    root: tree.root\n                };\n            }\n        });\n        var LayeredLayout = LayoutBase.extend({\n            init: function (diagram) {\n                var that = this;\n                LayoutBase.fn.init.call(that);\n                if (Utils.isUndefined(diagram)) {\n                    throw 'Diagram is not specified.';\n                }\n                this.diagram = diagram;\n            },\n            layout: function (options) {\n                this.transferOptions(options);\n                var adapter = new DiagramToHyperTreeAdapter(this.diagram);\n                var graph = adapter.convert(options);\n                if (graph.isEmpty()) {\n                    return;\n                }\n                var components = graph.getConnectedComponents();\n                if (Utils.isEmpty(components)) {\n                    return;\n                }\n                for (var i = 0; i < components.length; i++) {\n                    var component = components[i];\n                    this.layoutGraph(component, options);\n                }\n                var finalNodeSet = this.gridLayoutComponents(components);\n                return new diagram.LayoutState(this.diagram, finalNodeSet);\n            },\n            _initRuntimeProperties: function () {\n                for (var k = 0; k < this.graph.nodes.length; k++) {\n                    var node = this.graph.nodes[k];\n                    node.layer = -1;\n                    node.downstreamLinkCount = 0;\n                    node.upstreamLinkCount = 0;\n                    node.isVirtual = false;\n                    node.uBaryCenter = 0;\n                    node.dBaryCenter = 0;\n                    node.upstreamPriority = 0;\n                    node.downstreamPriority = 0;\n                    node.gridPosition = 0;\n                }\n            },\n            _prepare: function (graph) {\n                var current = [], i, l, link;\n                var layerMap = new Dictionary();\n                var layerCount = 0;\n                var targetLayer, next, target;\n                Utils.forEach(graph.nodes, function (node) {\n                    if (node.incoming.length === 0) {\n                        layerMap.set(node, 0);\n                        current.push(node);\n                    }\n                });\n                while (current.length > 0) {\n                    next = current.shift();\n                    for (i = 0; i < next.outgoing.length; i++) {\n                        link = next.outgoing[i];\n                        target = link.target;\n                        if (layerMap.containsKey(target)) {\n                            targetLayer = Math.max(layerMap.get(next) + 1, layerMap.get(target));\n                        } else {\n                            targetLayer = layerMap.get(next) + 1;\n                        }\n                        layerMap.set(target, targetLayer);\n                        if (targetLayer > layerCount) {\n                            layerCount = targetLayer;\n                        }\n                        if (!contains(current, target)) {\n                            current.push(target);\n                        }\n                    }\n                }\n                var sortedNodes = layerMap.keys();\n                sortedNodes.sort(function (o1, o2) {\n                    var o1layer = layerMap.get(o1);\n                    var o2layer = layerMap.get(o2);\n                    return Utils.sign(o2layer - o1layer);\n                });\n                for (var n = 0; n < sortedNodes.length; ++n) {\n                    var node = sortedNodes[n];\n                    var minLayer = Number.MAX_VALUE;\n                    if (node.outgoing.length === 0) {\n                        continue;\n                    }\n                    for (l = 0; l < node.outgoing.length; ++l) {\n                        link = node.outgoing[l];\n                        minLayer = Math.min(minLayer, layerMap.get(link.target));\n                    }\n                    if (minLayer > 1) {\n                        layerMap.set(node, minLayer - 1);\n                    }\n                }\n                this.layers = [];\n                var layer;\n                for (i = 0; i < layerCount + 1; i++) {\n                    layer = [];\n                    layer.linksTo = {};\n                    this.layers.push(layer);\n                }\n                layerMap.forEach(function (node, layer) {\n                    node.layer = layer;\n                    this.layers[layer].push(node);\n                }, this);\n                for (l = 0; l < this.layers.length; l++) {\n                    layer = this.layers[l];\n                    for (i = 0; i < layer.length; i++) {\n                        layer[i].gridPosition = i;\n                    }\n                }\n            },\n            layoutGraph: function (graph, options) {\n                if (Utils.isUndefined(graph)) {\n                    throw 'No graph given or graph analysis of the diagram failed.';\n                }\n                if (Utils.isDefined(options)) {\n                    this.transferOptions(options);\n                }\n                this.graph = graph;\n                graph.setItemIndices();\n                var reversedEdges = graph.makeAcyclic();\n                this._initRuntimeProperties();\n                this._prepare(graph, options);\n                this._dummify();\n                this._optimizeCrossings();\n                this._swapPairs();\n                this.arrangeNodes();\n                this._moveThingsAround();\n                this._dedummify();\n                Utils.forEach(reversedEdges, function (e) {\n                    if (e.points) {\n                        e.points.reverse();\n                    }\n                });\n            },\n            setMinDist: function (m, n, minDist) {\n                var l = m.layer;\n                var i = m.layerIndex;\n                this.minDistances[l][i] = minDist;\n            },\n            getMinDist: function (m, n) {\n                var dist = 0, i1 = m.layerIndex, i2 = n.layerIndex, l = m.layer, min = Math.min(i1, i2), max = Math.max(i1, i2);\n                for (var k = min; k < max; ++k) {\n                    dist += this.minDistances[l][k];\n                }\n                return dist;\n            },\n            placeLeftToRight: function (leftClasses) {\n                var leftPos = new Dictionary(), n, node;\n                for (var c = 0; c < this.layers.length; ++c) {\n                    var classNodes = leftClasses[c];\n                    if (!classNodes) {\n                        continue;\n                    }\n                    for (n = 0; n < classNodes.length; n++) {\n                        node = classNodes[n];\n                        if (!leftPos.containsKey(node)) {\n                            this.placeLeft(node, leftPos, c);\n                        }\n                    }\n                    var d = Number.POSITIVE_INFINITY;\n                    for (n = 0; n < classNodes.length; n++) {\n                        node = classNodes[n];\n                        var rightSibling = this.rightSibling(node);\n                        if (rightSibling && this.nodeLeftClass.get(rightSibling) !== c) {\n                            d = Math.min(d, leftPos.get(rightSibling) - leftPos.get(node) - this.getMinDist(node, rightSibling));\n                        }\n                    }\n                    if (d === Number.POSITIVE_INFINITY) {\n                        var D = [];\n                        for (n = 0; n < classNodes.length; n++) {\n                            node = classNodes[n];\n                            var neighbors = [];\n                            Utils.addRange(neighbors, this.upNodes.get(node));\n                            Utils.addRange(neighbors, this.downNodes.get(node));\n                            for (var e = 0; e < neighbors.length; e++) {\n                                var neighbor = neighbors[e];\n                                if (this.nodeLeftClass.get(neighbor) < c) {\n                                    D.push(leftPos.get(neighbor) - leftPos.get(node));\n                                }\n                            }\n                        }\n                        D.sort();\n                        if (D.length === 0) {\n                            d = 0;\n                        } else if (D.length % 2 === 1) {\n                            d = D[this.intDiv(D.length, 2)];\n                        } else {\n                            d = (D[this.intDiv(D.length, 2) - 1] + D[this.intDiv(D.length, 2)]) / 2;\n                        }\n                    }\n                    for (n = 0; n < classNodes.length; n++) {\n                        node = classNodes[n];\n                        leftPos.set(node, leftPos.get(node) + d);\n                    }\n                }\n                return leftPos;\n            },\n            placeRightToLeft: function (rightClasses) {\n                var rightPos = new Dictionary(), n, node;\n                for (var c = 0; c < this.layers.length; ++c) {\n                    var classNodes = rightClasses[c];\n                    if (!classNodes) {\n                        continue;\n                    }\n                    for (n = 0; n < classNodes.length; n++) {\n                        node = classNodes[n];\n                        if (!rightPos.containsKey(node)) {\n                            this.placeRight(node, rightPos, c);\n                        }\n                    }\n                    var d = Number.NEGATIVE_INFINITY;\n                    for (n = 0; n < classNodes.length; n++) {\n                        node = classNodes[n];\n                        var leftSibling = this.leftSibling(node);\n                        if (leftSibling && this.nodeRightClass.get(leftSibling) !== c) {\n                            d = Math.max(d, rightPos.get(leftSibling) - rightPos.get(node) + this.getMinDist(leftSibling, node));\n                        }\n                    }\n                    if (d === Number.NEGATIVE_INFINITY) {\n                        var D = [];\n                        for (n = 0; n < classNodes.length; n++) {\n                            node = classNodes[n];\n                            var neighbors = [];\n                            Utils.addRange(neighbors, this.upNodes.get(node));\n                            Utils.addRange(neighbors, this.downNodes.get(node));\n                            for (var e = 0; e < neighbors.length; e++) {\n                                var neighbor = neighbors[e];\n                                if (this.nodeRightClass.get(neighbor) < c) {\n                                    D.push(rightPos.get(node) - rightPos.get(neighbor));\n                                }\n                            }\n                        }\n                        D.sort();\n                        if (D.length === 0) {\n                            d = 0;\n                        } else if (D.length % 2 === 1) {\n                            d = D[this.intDiv(D.length, 2)];\n                        } else {\n                            d = (D[this.intDiv(D.length, 2) - 1] + D[this.intDiv(D.length, 2)]) / 2;\n                        }\n                    }\n                    for (n = 0; n < classNodes.length; n++) {\n                        node = classNodes[n];\n                        rightPos.set(node, rightPos.get(node) + d);\n                    }\n                }\n                return rightPos;\n            },\n            _getLeftWing: function () {\n                var leftWing = { value: null };\n                var result = this.computeClasses(leftWing, 1);\n                this.nodeLeftClass = leftWing.value;\n                return result;\n            },\n            _getRightWing: function () {\n                var rightWing = { value: null };\n                var result = this.computeClasses(rightWing, -1);\n                this.nodeRightClass = rightWing.value;\n                return result;\n            },\n            computeClasses: function (wingPair, d) {\n                var currentWing = 0, wing = wingPair.value = new Dictionary();\n                for (var l = 0; l < this.layers.length; ++l) {\n                    currentWing = l;\n                    var layer = this.layers[l];\n                    for (var n = d === 1 ? 0 : layer.length - 1; 0 <= n && n < layer.length; n += d) {\n                        var node = layer[n];\n                        if (!wing.containsKey(node)) {\n                            wing.set(node, currentWing);\n                            if (node.isVirtual) {\n                                var ndsinl = this._nodesInLink(node);\n                                for (var kk = 0; kk < ndsinl.length; kk++) {\n                                    var vnode = ndsinl[kk];\n                                    wing.set(vnode, currentWing);\n                                }\n                            }\n                        } else {\n                            currentWing = wing.get(node);\n                        }\n                    }\n                }\n                var wings = [];\n                for (var i = 0; i < this.layers.length; i++) {\n                    wings.push(null);\n                }\n                wing.forEach(function (node, classIndex) {\n                    if (wings[classIndex] === null) {\n                        wings[classIndex] = [];\n                    }\n                    wings[classIndex].push(node);\n                });\n                return wings;\n            },\n            _isVerticalLayout: function () {\n                return this.options.subtype.toLowerCase() === 'up' || this.options.subtype.toLowerCase() === 'down' || this.options.subtype.toLowerCase() === 'vertical';\n            },\n            _isHorizontalLayout: function () {\n                return this.options.subtype.toLowerCase() === 'right' || this.options.subtype.toLowerCase() === 'left' || this.options.subtype.toLowerCase() === 'horizontal';\n            },\n            _isIncreasingLayout: function () {\n                return this.options.subtype.toLowerCase() === 'right' || this.options.subtype.toLowerCase() === 'down';\n            },\n            _moveThingsAround: function () {\n                var i, l, node, layer, n, w;\n                for (l = 0; l < this.layers.length; ++l) {\n                    layer = this.layers[l];\n                    layer.sort(this._gridPositionComparer);\n                }\n                this.minDistances = [];\n                for (l = 0; l < this.layers.length; ++l) {\n                    layer = this.layers[l];\n                    this.minDistances[l] = [];\n                    for (n = 0; n < layer.length; ++n) {\n                        node = layer[n];\n                        node.layerIndex = n;\n                        this.minDistances[l][n] = this.options.nodeDistance;\n                        if (n < layer.length - 1) {\n                            if (this._isVerticalLayout()) {\n                                this.minDistances[l][n] += (node.width + layer[n + 1].width) / 2;\n                            } else {\n                                this.minDistances[l][n] += (node.height + layer[n + 1].height) / 2;\n                            }\n                        }\n                    }\n                }\n                this.downNodes = new Dictionary();\n                this.upNodes = new Dictionary();\n                Utils.forEach(this.graph.nodes, function (node) {\n                    this.downNodes.set(node, []);\n                    this.upNodes.set(node, []);\n                }, this);\n                Utils.forEach(this.graph.links, function (link) {\n                    var origin = link.source;\n                    var dest = link.target;\n                    var down = null, up = null;\n                    if (origin.layer > dest.layer) {\n                        down = link.source;\n                        up = link.target;\n                    } else {\n                        up = link.source;\n                        down = link.target;\n                    }\n                    this.downNodes.get(up).push(down);\n                    this.upNodes.get(down).push(up);\n                }, this);\n                this.downNodes.forEachValue(function (list) {\n                    list.sort(this._gridPositionComparer);\n                }, this);\n                this.upNodes.forEachValue(function (list) {\n                    list.sort(this._gridPositionComparer);\n                }, this);\n                for (l = 0; l < this.layers.length - 1; ++l) {\n                    layer = this.layers[l];\n                    for (w = 0; w < layer.length - 1; w++) {\n                        var currentNode = layer[w];\n                        if (!currentNode.isVirtual) {\n                            continue;\n                        }\n                        var currDown = this.downNodes.get(currentNode)[0];\n                        if (!currDown.isVirtual) {\n                            continue;\n                        }\n                        for (n = w + 1; n < layer.length; ++n) {\n                            node = layer[n];\n                            if (!node.isVirtual) {\n                                continue;\n                            }\n                            var downNode = this.downNodes.get(node)[0];\n                            if (!downNode.isVirtual) {\n                                continue;\n                            }\n                            if (currDown.gridPosition > downNode.gridPosition) {\n                                var pos = currDown.gridPosition;\n                                currDown.gridPosition = downNode.gridPosition;\n                                downNode.gridPosition = pos;\n                                var i1 = currDown.layerIndex;\n                                var i2 = downNode.layerIndex;\n                                this.layers[l + 1][i1] = downNode;\n                                this.layers[l + 1][i2] = currDown;\n                                currDown.layerIndex = i2;\n                                downNode.layerIndex = i1;\n                            }\n                        }\n                    }\n                }\n                var leftClasses = this._getLeftWing();\n                var rightClasses = this._getRightWing();\n                var leftPos = this.placeLeftToRight(leftClasses);\n                var rightPos = this.placeRightToLeft(rightClasses);\n                var x = new Dictionary();\n                Utils.forEach(this.graph.nodes, function (node) {\n                    x.set(node, (leftPos.get(node) + rightPos.get(node)) / 2);\n                });\n                var order = new Dictionary();\n                var placed = new Dictionary();\n                for (l = 0; l < this.layers.length; ++l) {\n                    layer = this.layers[l];\n                    var sequenceStart = -1, sequenceEnd = -1;\n                    for (n = 0; n < layer.length; ++n) {\n                        node = layer[n];\n                        order.set(node, 0);\n                        placed.set(node, false);\n                        if (node.isVirtual) {\n                            if (sequenceStart === -1) {\n                                sequenceStart = n;\n                            } else if (sequenceStart === n - 1) {\n                                sequenceStart = n;\n                            } else {\n                                sequenceEnd = n;\n                                order.set(layer[sequenceStart], 0);\n                                if (x.get(node) - x.get(layer[sequenceStart]) === this.getMinDist(layer[sequenceStart], node)) {\n                                    placed.set(layer[sequenceStart], true);\n                                } else {\n                                    placed.set(layer[sequenceStart], false);\n                                }\n                                sequenceStart = n;\n                            }\n                        }\n                    }\n                }\n                var directions = [\n                    1,\n                    -1\n                ];\n                Utils.forEach(directions, function (d) {\n                    var start = d === 1 ? 0 : this.layers.length - 1;\n                    for (var l = start; 0 <= l && l < this.layers.length; l += d) {\n                        var layer = this.layers[l];\n                        var virtualStartIndex = this._firstVirtualNode(layer);\n                        var virtualStart = null;\n                        var sequence = null;\n                        if (virtualStartIndex !== -1) {\n                            virtualStart = layer[virtualStartIndex];\n                            sequence = [];\n                            for (i = 0; i < virtualStartIndex; i++) {\n                                sequence.push(layer[i]);\n                            }\n                        } else {\n                            virtualStart = null;\n                            sequence = layer;\n                        }\n                        if (sequence.length > 0) {\n                            this._sequencer(x, null, virtualStart, d, sequence);\n                            for (i = 0; i < sequence.length - 1; ++i) {\n                                this.setMinDist(sequence[i], sequence[i + 1], x.get(sequence[i + 1]) - x.get(sequence[i]));\n                            }\n                            if (virtualStart) {\n                                this.setMinDist(sequence[sequence.length - 1], virtualStart, x.get(virtualStart) - x.get(sequence[sequence.length - 1]));\n                            }\n                        }\n                        while (virtualStart) {\n                            var virtualEnd = this.nextVirtualNode(layer, virtualStart);\n                            if (!virtualEnd) {\n                                virtualStartIndex = virtualStart.layerIndex;\n                                sequence = [];\n                                for (i = virtualStartIndex + 1; i < layer.length; i++) {\n                                    sequence.push(layer[i]);\n                                }\n                                if (sequence.length > 0) {\n                                    this._sequencer(x, virtualStart, null, d, sequence);\n                                    for (i = 0; i < sequence.length - 1; ++i) {\n                                        this.setMinDist(sequence[i], sequence[i + 1], x.get(sequence[i + 1]) - x.get(sequence[i]));\n                                    }\n                                    this.setMinDist(virtualStart, sequence[0], x.get(sequence[0]) - x.get(virtualStart));\n                                }\n                            } else if (order.get(virtualStart) === d) {\n                                virtualStartIndex = virtualStart.layerIndex;\n                                var virtualEndIndex = virtualEnd.layerIndex;\n                                sequence = [];\n                                for (i = virtualStartIndex + 1; i < virtualEndIndex; i++) {\n                                    sequence.push(layer[i]);\n                                }\n                                if (sequence.length > 0) {\n                                    this._sequencer(x, virtualStart, virtualEnd, d, sequence);\n                                }\n                                placed.set(virtualStart, true);\n                            }\n                            virtualStart = virtualEnd;\n                        }\n                        this.adjustDirections(l, d, order, placed);\n                    }\n                }, this);\n                var fromLayerIndex = this._isIncreasingLayout() ? 0 : this.layers.length - 1;\n                var reachedFinalLayerIndex = function (k, ctx) {\n                    if (ctx._isIncreasingLayout()) {\n                        return k < ctx.layers.length;\n                    } else {\n                        return k >= 0;\n                    }\n                };\n                var layerIncrement = this._isIncreasingLayout() ? +1 : -1, offset = 0;\n                function maximumHeight(layer, ctx) {\n                    var height = Number.MIN_VALUE;\n                    for (var n = 0; n < layer.length; ++n) {\n                        var node = layer[n];\n                        if (ctx._isVerticalLayout()) {\n                            height = Math.max(height, node.height);\n                        } else {\n                            height = Math.max(height, node.width);\n                        }\n                    }\n                    return height;\n                }\n                for (i = fromLayerIndex; reachedFinalLayerIndex(i, this); i += layerIncrement) {\n                    layer = this.layers[i];\n                    var height = maximumHeight(layer, this);\n                    for (n = 0; n < layer.length; ++n) {\n                        node = layer[n];\n                        if (this._isVerticalLayout()) {\n                            node.x = x.get(node);\n                            node.y = offset + height / 2;\n                        } else {\n                            node.x = offset + height / 2;\n                            node.y = x.get(node);\n                        }\n                    }\n                    offset += this.options.layerSeparation + height;\n                }\n            },\n            adjustDirections: function (l, d, order, placed) {\n                if (l + d < 0 || l + d >= this.layers.length) {\n                    return;\n                }\n                var prevBridge = null, prevBridgeTarget = null;\n                var layer = this.layers[l + d];\n                for (var n = 0; n < layer.length; ++n) {\n                    var nextBridge = layer[n];\n                    if (nextBridge.isVirtual) {\n                        var nextBridgeTarget = this.getNeighborOnLayer(nextBridge, l);\n                        if (nextBridgeTarget.isVirtual) {\n                            if (prevBridge) {\n                                var p = placed.get(prevBridgeTarget);\n                                var clayer = this.layers[l];\n                                var i1 = prevBridgeTarget.layerIndex;\n                                var i2 = nextBridgeTarget.layerIndex;\n                                for (var i = i1 + 1; i < i2; ++i) {\n                                    if (clayer[i].isVirtual) {\n                                        p = p && placed.get(clayer[i]);\n                                    }\n                                }\n                                if (p) {\n                                    order.set(prevBridge, d);\n                                    var j1 = prevBridge.layerIndex;\n                                    var j2 = nextBridge.layerIndex;\n                                    for (var j = j1 + 1; j < j2; ++j) {\n                                        if (layer[j].isVirtual) {\n                                            order.set(layer[j], d);\n                                        }\n                                    }\n                                }\n                            }\n                            prevBridge = nextBridge;\n                            prevBridgeTarget = nextBridgeTarget;\n                        }\n                    }\n                }\n            },\n            getNeighborOnLayer: function (node, l) {\n                var neighbor = this.upNodes.get(node)[0];\n                if (neighbor.layer === l) {\n                    return neighbor;\n                }\n                neighbor = this.downNodes.get(node)[0];\n                if (neighbor.layer === l) {\n                    return neighbor;\n                }\n                return null;\n            },\n            _sequencer: function (x, virtualStart, virtualEnd, dir, sequence) {\n                if (sequence.length === 1) {\n                    this._sequenceSingle(x, virtualStart, virtualEnd, dir, sequence[0]);\n                }\n                if (sequence.length > 1) {\n                    var r = sequence.length, t = this.intDiv(r, 2);\n                    this._sequencer(x, virtualStart, virtualEnd, dir, sequence.slice(0, t));\n                    this._sequencer(x, virtualStart, virtualEnd, dir, sequence.slice(t));\n                    this.combineSequences(x, virtualStart, virtualEnd, dir, sequence);\n                }\n            },\n            _sequenceSingle: function (x, virtualStart, virtualEnd, dir, node) {\n                var neighbors = dir === -1 ? this.downNodes.get(node) : this.upNodes.get(node);\n                var n = neighbors.length;\n                if (n !== 0) {\n                    if (n % 2 === 1) {\n                        x.set(node, x.get(neighbors[this.intDiv(n, 2)]));\n                    } else {\n                        x.set(node, (x.get(neighbors[this.intDiv(n, 2) - 1]) + x.get(neighbors[this.intDiv(n, 2)])) / 2);\n                    }\n                    if (virtualStart) {\n                        x.set(node, Math.max(x.get(node), x.get(virtualStart) + this.getMinDist(virtualStart, node)));\n                    }\n                    if (virtualEnd) {\n                        x.set(node, Math.min(x.get(node), x.get(virtualEnd) - this.getMinDist(node, virtualEnd)));\n                    }\n                }\n            },\n            combineSequences: function (x, virtualStart, virtualEnd, dir, sequence) {\n                var r = sequence.length, t = this.intDiv(r, 2);\n                var leftHeap = [], i, c, n, neighbors, neighbor, pair;\n                for (i = 0; i < t; ++i) {\n                    c = 0;\n                    neighbors = dir === -1 ? this.downNodes.get(sequence[i]) : this.upNodes.get(sequence[i]);\n                    for (n = 0; n < neighbors.length; ++n) {\n                        neighbor = neighbors[n];\n                        if (x.get(neighbor) >= x.get(sequence[i])) {\n                            c++;\n                        } else {\n                            c--;\n                            leftHeap.push({\n                                k: x.get(neighbor) + this.getMinDist(sequence[i], sequence[t - 1]),\n                                v: 2\n                            });\n                        }\n                    }\n                    leftHeap.push({\n                        k: x.get(sequence[i]) + this.getMinDist(sequence[i], sequence[t - 1]),\n                        v: c\n                    });\n                }\n                if (virtualStart) {\n                    leftHeap.push({\n                        k: x.get(virtualStart) + this.getMinDist(virtualStart, sequence[t - 1]),\n                        v: Number.MAX_VALUE\n                    });\n                }\n                leftHeap.sort(this._positionDescendingComparer);\n                var rightHeap = [];\n                for (i = t; i < r; ++i) {\n                    c = 0;\n                    neighbors = dir === -1 ? this.downNodes.get(sequence[i]) : this.upNodes.get(sequence[i]);\n                    for (n = 0; n < neighbors.length; ++n) {\n                        neighbor = neighbors[n];\n                        if (x.get(neighbor) <= x.get(sequence[i])) {\n                            c++;\n                        } else {\n                            c--;\n                            rightHeap.push({\n                                k: x.get(neighbor) - this.getMinDist(sequence[i], sequence[t]),\n                                v: 2\n                            });\n                        }\n                    }\n                    rightHeap.push({\n                        k: x.get(sequence[i]) - this.getMinDist(sequence[i], sequence[t]),\n                        v: c\n                    });\n                }\n                if (virtualEnd) {\n                    rightHeap.push({\n                        k: x.get(virtualEnd) - this.getMinDist(virtualEnd, sequence[t]),\n                        v: Number.MAX_VALUE\n                    });\n                }\n                rightHeap.sort(this._positionAscendingComparer);\n                var leftRes = 0, rightRes = 0;\n                var m = this.getMinDist(sequence[t - 1], sequence[t]);\n                while (x.get(sequence[t]) - x.get(sequence[t - 1]) < m) {\n                    if (leftRes < rightRes) {\n                        if (leftHeap.length === 0) {\n                            x.set(sequence[t - 1], x.get(sequence[t]) - m);\n                            break;\n                        } else {\n                            pair = leftHeap.shift();\n                            leftRes = leftRes + pair.v;\n                            x.set(sequence[t - 1], pair.k);\n                            x.set(sequence[t - 1], Math.max(x.get(sequence[t - 1]), x.get(sequence[t]) - m));\n                        }\n                    } else {\n                        if (rightHeap.length === 0) {\n                            x.set(sequence[t], x.get(sequence[t - 1]) + m);\n                            break;\n                        } else {\n                            pair = rightHeap.shift();\n                            rightRes = rightRes + pair.v;\n                            x.set(sequence[t], pair.k);\n                            x.set(sequence[t], Math.min(x.get(sequence[t]), x.get(sequence[t - 1]) + m));\n                        }\n                    }\n                }\n                for (i = t - 2; i >= 0; i--) {\n                    x.set(sequence[i], Math.min(x.get(sequence[i]), x.get(sequence[t - 1]) - this.getMinDist(sequence[i], sequence[t - 1])));\n                }\n                for (i = t + 1; i < r; i++) {\n                    x.set(sequence[i], Math.max(x.get(sequence[i]), x.get(sequence[t]) + this.getMinDist(sequence[i], sequence[t])));\n                }\n            },\n            placeLeft: function (node, leftPos, leftClass) {\n                var pos = Number.NEGATIVE_INFINITY;\n                Utils.forEach(this._getComposite(node), function (v) {\n                    var leftSibling = this.leftSibling(v);\n                    if (leftSibling && this.nodeLeftClass.get(leftSibling) === this.nodeLeftClass.get(v)) {\n                        if (!leftPos.containsKey(leftSibling)) {\n                            this.placeLeft(leftSibling, leftPos, leftClass);\n                        }\n                        pos = Math.max(pos, leftPos.get(leftSibling) + this.getMinDist(leftSibling, v));\n                    }\n                }, this);\n                if (pos === Number.NEGATIVE_INFINITY) {\n                    pos = 0;\n                }\n                Utils.forEach(this._getComposite(node), function (v) {\n                    leftPos.set(v, pos);\n                });\n            },\n            placeRight: function (node, rightPos, rightClass) {\n                var pos = Number.POSITIVE_INFINITY;\n                Utils.forEach(this._getComposite(node), function (v) {\n                    var rightSibling = this.rightSibling(v);\n                    if (rightSibling && this.nodeRightClass.get(rightSibling) === this.nodeRightClass.get(v)) {\n                        if (!rightPos.containsKey(rightSibling)) {\n                            this.placeRight(rightSibling, rightPos, rightClass);\n                        }\n                        pos = Math.min(pos, rightPos.get(rightSibling) - this.getMinDist(v, rightSibling));\n                    }\n                }, this);\n                if (pos === Number.POSITIVE_INFINITY) {\n                    pos = 0;\n                }\n                Utils.forEach(this._getComposite(node), function (v) {\n                    rightPos.set(v, pos);\n                });\n            },\n            leftSibling: function (node) {\n                var layer = this.layers[node.layer], layerIndex = node.layerIndex;\n                return layerIndex === 0 ? null : layer[layerIndex - 1];\n            },\n            rightSibling: function (node) {\n                var layer = this.layers[node.layer];\n                var layerIndex = node.layerIndex;\n                return layerIndex === layer.length - 1 ? null : layer[layerIndex + 1];\n            },\n            _getComposite: function (node) {\n                return node.isVirtual ? this._nodesInLink(node) : [node];\n            },\n            arrangeNodes: function () {\n                var i, l, ni, layer, node;\n                for (l = 0; l < this.layers.length; l++) {\n                    layer = this.layers[l];\n                    for (ni = 0; ni < layer.length; ni++) {\n                        node = layer[ni];\n                        node.upstreamPriority = node.upstreamLinkCount;\n                        node.downstreamPriority = node.downstreamLinkCount;\n                    }\n                }\n                var maxLayoutIterations = 2;\n                for (var it = 0; it < maxLayoutIterations; it++) {\n                    for (i = this.layers.length - 1; i >= 1; i--) {\n                        this.layoutLayer(false, i);\n                    }\n                    for (i = 0; i < this.layers.length - 1; i++) {\n                        this.layoutLayer(true, i);\n                    }\n                }\n                var gridPos = Number.MAX_VALUE;\n                for (l = 0; l < this.layers.length; l++) {\n                    layer = this.layers[l];\n                    for (ni = 0; ni < layer.length; ni++) {\n                        node = layer[ni];\n                        gridPos = Math.min(gridPos, node.gridPosition);\n                    }\n                }\n                if (gridPos < 0) {\n                    for (l = 0; l < this.layers.length; l++) {\n                        layer = this.layers[l];\n                        for (ni = 0; ni < layer.length; ni++) {\n                            node = layer[ni];\n                            node.gridPosition = node.gridPosition - gridPos;\n                        }\n                    }\n                }\n            },\n            layoutLayer: function (down, layer) {\n                var iconsidered;\n                var considered;\n                if (down) {\n                    considered = this.layers[iconsidered = layer + 1];\n                } else {\n                    considered = this.layers[iconsidered = layer - 1];\n                }\n                var sorted = [];\n                for (var n = 0; n < considered.length; n++) {\n                    sorted.push(considered[n]);\n                }\n                sorted.sort(function (n1, n2) {\n                    var n1Priority = (n1.upstreamPriority + n1.downstreamPriority) / 2;\n                    var n2Priority = (n2.upstreamPriority + n2.downstreamPriority) / 2;\n                    if (Math.abs(n1Priority - n2Priority) < 0.0001) {\n                        return 0;\n                    }\n                    if (n1Priority < n2Priority) {\n                        return 1;\n                    }\n                    return -1;\n                });\n                Utils.forEach(sorted, function (node) {\n                    var nodeGridPos = node.gridPosition;\n                    var nodeBaryCenter = this.calcBaryCenter(node);\n                    var nodePriority = (node.upstreamPriority + node.downstreamPriority) / 2;\n                    if (Math.abs(nodeGridPos - nodeBaryCenter) < 0.0001) {\n                        return;\n                    }\n                    if (Math.abs(nodeGridPos - nodeBaryCenter) < 0.25 + 0.0001) {\n                        return;\n                    }\n                    if (nodeGridPos < nodeBaryCenter) {\n                        while (nodeGridPos < nodeBaryCenter) {\n                            if (!this.moveRight(node, considered, nodePriority)) {\n                                break;\n                            }\n                            nodeGridPos = node.gridPosition;\n                        }\n                    } else {\n                        while (nodeGridPos > nodeBaryCenter) {\n                            if (!this.moveLeft(node, considered, nodePriority)) {\n                                break;\n                            }\n                            nodeGridPos = node.gridPosition;\n                        }\n                    }\n                }, this);\n                if (iconsidered > 0) {\n                    this.calcDownData(iconsidered - 1);\n                }\n                if (iconsidered < this.layers.length - 1) {\n                    this.calcUpData(iconsidered + 1);\n                }\n            },\n            moveRight: function (node, layer, priority) {\n                var index = Utils.indexOf(layer, node);\n                if (index === layer.length - 1) {\n                    node.gridPosition = node.gridPosition + 0.5;\n                    return true;\n                }\n                var rightNode = layer[index + 1];\n                var rightNodePriority = (rightNode.upstreamPriority + rightNode.downstreamPriority) / 2;\n                if (rightNode.gridPosition > node.gridPosition + 1) {\n                    node.gridPosition = node.gridPosition + 0.5;\n                    return true;\n                }\n                if (rightNodePriority > priority || Math.abs(rightNodePriority - priority) < 0.0001) {\n                    return false;\n                }\n                if (this.moveRight(rightNode, layer, priority)) {\n                    node.gridPosition = node.gridPosition + 0.5;\n                    return true;\n                }\n                return false;\n            },\n            moveLeft: function (node, layer, priority) {\n                var index = Utils.indexOf(layer, node);\n                if (index === 0) {\n                    node.gridPosition = node.gridPosition - 0.5;\n                    return true;\n                }\n                var leftNode = layer[index - 1];\n                var leftNodePriority = (leftNode.upstreamPriority + leftNode.downstreamPriority) / 2;\n                if (leftNode.gridPosition < node.gridPosition - 1) {\n                    node.gridPosition = node.gridPosition - 0.5;\n                    return true;\n                }\n                if (leftNodePriority > priority || Math.abs(leftNodePriority - priority) < 0.0001) {\n                    return false;\n                }\n                if (this.moveLeft(leftNode, layer, priority)) {\n                    node.gridPosition = node.gridPosition - 0.5;\n                    return true;\n                }\n                return false;\n            },\n            mapVirtualNode: function (node, link) {\n                this.nodeToLinkMap.set(node, link);\n                if (!this.linkToNodeMap.containsKey(link)) {\n                    this.linkToNodeMap.set(link, []);\n                }\n                this.linkToNodeMap.get(link).push(node);\n            },\n            _nodesInLink: function (node) {\n                return this.linkToNodeMap.get(this.nodeToLinkMap.get(node));\n            },\n            _dummify: function () {\n                this.linkToNodeMap = new Dictionary();\n                this.nodeToLinkMap = new Dictionary();\n                var layer, pos, newNode, node, r, newLink, i, l, links = this.graph.links.slice(0);\n                var layers = this.layers;\n                var addLinkBetweenLayers = function (upLayer, downLayer, link) {\n                    layers[upLayer].linksTo[downLayer] = layers[upLayer].linksTo[downLayer] || [];\n                    layers[upLayer].linksTo[downLayer].push(link);\n                };\n                for (l = 0; l < links.length; l++) {\n                    var link = links[l];\n                    var o = link.source;\n                    var d = link.target;\n                    var oLayer = o.layer;\n                    var dLayer = d.layer;\n                    var oPos = o.gridPosition;\n                    var dPos = d.gridPosition;\n                    var step = (dPos - oPos) / Math.abs(dLayer - oLayer);\n                    var p = o;\n                    if (oLayer - dLayer > 1) {\n                        for (i = oLayer - 1; i > dLayer; i--) {\n                            newNode = new Node();\n                            newNode.x = o.x;\n                            newNode.y = o.y;\n                            newNode.width = o.width / 100;\n                            newNode.height = o.height / 100;\n                            layer = layers[i];\n                            pos = (i - dLayer) * step + oPos;\n                            if (pos > layer.length) {\n                                pos = layer.length;\n                            }\n                            if (oPos >= layers[oLayer].length - 1 && dPos >= layers[dLayer].length - 1) {\n                                pos = layer.length;\n                            } else if (oPos === 0 && dPos === 0) {\n                                pos = 0;\n                            }\n                            newNode.layer = i;\n                            newNode.uBaryCenter = 0;\n                            newNode.dBaryCenter = 0;\n                            newNode.upstreamLinkCount = 0;\n                            newNode.downstreamLinkCount = 0;\n                            newNode.gridPosition = pos;\n                            newNode.isVirtual = true;\n                            Utils.insert(layer, newNode, pos);\n                            for (r = pos + 1; r < layer.length; r++) {\n                                node = layer[r];\n                                node.gridPosition = node.gridPosition + 1;\n                            }\n                            newLink = new Link(p, newNode);\n                            newLink.depthOfDumminess = 0;\n                            addLinkBetweenLayers(i - 1, i, newLink);\n                            p = newNode;\n                            this.graph._addNode(newNode);\n                            this.graph.addLink(newLink);\n                            newNode.index = this.graph.nodes.length - 1;\n                            this.mapVirtualNode(newNode, link);\n                        }\n                        addLinkBetweenLayers(dLayer - 1, dLayer, newLink);\n                        link.changeSource(p);\n                        link.depthOfDumminess = oLayer - dLayer - 1;\n                    } else if (oLayer - dLayer < -1) {\n                        for (i = oLayer + 1; i < dLayer; i++) {\n                            newNode = new Node();\n                            newNode.x = o.x;\n                            newNode.y = o.y;\n                            newNode.width = o.width / 100;\n                            newNode.height = o.height / 100;\n                            layer = layers[i];\n                            pos = (i - oLayer) * step + oPos;\n                            if (pos > layer.length) {\n                                pos = layer.length;\n                            }\n                            if (oPos >= layers[oLayer].length - 1 && dPos >= layers[dLayer].length - 1) {\n                                pos = layer.length;\n                            } else if (oPos === 0 && dPos === 0) {\n                                pos = 0;\n                            }\n                            newNode.layer = i;\n                            newNode.uBaryCenter = 0;\n                            newNode.dBaryCenter = 0;\n                            newNode.upstreamLinkCount = 0;\n                            newNode.downstreamLinkCount = 0;\n                            newNode.gridPosition = pos;\n                            newNode.isVirtual = true;\n                            pos &= pos;\n                            Utils.insert(layer, newNode, pos);\n                            for (r = pos + 1; r < layer.length; r++) {\n                                node = layer[r];\n                                node.gridPosition = node.gridPosition + 1;\n                            }\n                            newLink = new Link(p, newNode);\n                            newLink.depthOfDumminess = 0;\n                            addLinkBetweenLayers(i - 1, i, newLink);\n                            p = newNode;\n                            this.graph._addNode(newNode);\n                            this.graph.addLink(newLink);\n                            newNode.index = this.graph.nodes.length - 1;\n                            this.mapVirtualNode(newNode, link);\n                        }\n                        addLinkBetweenLayers(dLayer - 1, dLayer, link);\n                        link.changeSource(p);\n                        link.depthOfDumminess = dLayer - oLayer - 1;\n                    } else {\n                        addLinkBetweenLayers(oLayer, dLayer, link);\n                    }\n                }\n            },\n            _dedummify: function () {\n                var dedum = true;\n                while (dedum) {\n                    dedum = false;\n                    for (var l = 0; l < this.graph.links.length; l++) {\n                        var link = this.graph.links[l];\n                        if (!link.depthOfDumminess) {\n                            continue;\n                        }\n                        var points = [];\n                        points.unshift({\n                            x: link.target.x,\n                            y: link.target.y\n                        });\n                        points.unshift({\n                            x: link.source.x,\n                            y: link.source.y\n                        });\n                        var temp = link;\n                        var depthOfDumminess = link.depthOfDumminess;\n                        for (var d = 0; d < depthOfDumminess; d++) {\n                            var node = temp.source;\n                            var prevLink = node.incoming[0];\n                            points.unshift({\n                                x: prevLink.source.x,\n                                y: prevLink.source.y\n                            });\n                            temp = prevLink;\n                        }\n                        link.changeSource(temp.source);\n                        link.depthOfDumminess = 0;\n                        if (points.length > 2) {\n                            points.splice(0, 1);\n                            points.splice(points.length - 1);\n                            link.points = points;\n                        } else {\n                            link.points = [];\n                        }\n                        dedum = true;\n                        break;\n                    }\n                }\n            },\n            _optimizeCrossings: function () {\n                var moves = -1, i;\n                var maxIterations = 3;\n                var iter = 0;\n                while (moves !== 0) {\n                    if (iter++ > maxIterations) {\n                        break;\n                    }\n                    moves = 0;\n                    for (i = this.layers.length - 1; i >= 1; i--) {\n                        moves += this.optimizeLayerCrossings(false, i);\n                    }\n                    for (i = 0; i < this.layers.length - 1; i++) {\n                        moves += this.optimizeLayerCrossings(true, i);\n                    }\n                }\n            },\n            calcUpData: function (layer) {\n                if (layer === 0) {\n                    return;\n                }\n                var considered = this.layers[layer], i, l, link;\n                var upLayer = new Set();\n                var temp = this.layers[layer - 1];\n                for (i = 0; i < temp.length; i++) {\n                    upLayer.add(temp[i]);\n                }\n                for (i = 0; i < considered.length; i++) {\n                    var node = considered[i];\n                    var sum = 0;\n                    var total = 0;\n                    for (l = 0; l < node.incoming.length; l++) {\n                        link = node.incoming[l];\n                        if (upLayer.contains(link.source)) {\n                            total++;\n                            sum += link.source.gridPosition;\n                        }\n                    }\n                    for (l = 0; l < node.outgoing.length; l++) {\n                        link = node.outgoing[l];\n                        if (upLayer.contains(link.target)) {\n                            total++;\n                            sum += link.target.gridPosition;\n                        }\n                    }\n                    if (total > 0) {\n                        node.uBaryCenter = sum / total;\n                        node.upstreamLinkCount = total;\n                    } else {\n                        node.uBaryCenter = i;\n                        node.upstreamLinkCount = 0;\n                    }\n                }\n            },\n            calcDownData: function (layer) {\n                if (layer === this.layers.length - 1) {\n                    return;\n                }\n                var considered = this.layers[layer], i, l, link;\n                var downLayer = new Set();\n                var temp = this.layers[layer + 1];\n                for (i = 0; i < temp.length; i++) {\n                    downLayer.add(temp[i]);\n                }\n                for (i = 0; i < considered.length; i++) {\n                    var node = considered[i];\n                    var sum = 0;\n                    var total = 0;\n                    for (l = 0; l < node.incoming.length; l++) {\n                        link = node.incoming[l];\n                        if (downLayer.contains(link.source)) {\n                            total++;\n                            sum += link.source.gridPosition;\n                        }\n                    }\n                    for (l = 0; l < node.outgoing.length; l++) {\n                        link = node.outgoing[l];\n                        if (downLayer.contains(link.target)) {\n                            total++;\n                            sum += link.target.gridPosition;\n                        }\n                    }\n                    if (total > 0) {\n                        node.dBaryCenter = sum / total;\n                        node.downstreamLinkCount = total;\n                    } else {\n                        node.dBaryCenter = i;\n                        node.downstreamLinkCount = 0;\n                    }\n                }\n            },\n            optimizeLayerCrossings: function (down, layer) {\n                var iconsidered;\n                var considered;\n                if (down) {\n                    considered = this.layers[iconsidered = layer + 1];\n                } else {\n                    considered = this.layers[iconsidered = layer - 1];\n                }\n                var presorted = considered.slice(0);\n                if (down) {\n                    this.calcUpData(iconsidered);\n                } else {\n                    this.calcDownData(iconsidered);\n                }\n                var that = this;\n                considered.sort(function (n1, n2) {\n                    var n1BaryCenter = that.calcBaryCenter(n1), n2BaryCenter = that.calcBaryCenter(n2);\n                    if (Math.abs(n1BaryCenter - n2BaryCenter) < 0.0001) {\n                        if (n1.degree() === n2.degree()) {\n                            return that.compareByIndex(n1, n2);\n                        } else if (n1.degree() < n2.degree()) {\n                            return 1;\n                        }\n                        return -1;\n                    }\n                    var compareValue = (n2BaryCenter - n1BaryCenter) * 1000;\n                    if (compareValue > 0) {\n                        return -1;\n                    } else if (compareValue < 0) {\n                        return 1;\n                    }\n                    return that.compareByIndex(n1, n2);\n                });\n                var i, moves = 0;\n                for (i = 0; i < considered.length; i++) {\n                    if (considered[i] !== presorted[i]) {\n                        moves++;\n                    }\n                }\n                if (moves > 0) {\n                    var inode = 0;\n                    for (i = 0; i < considered.length; i++) {\n                        var node = considered[i];\n                        node.gridPosition = inode++;\n                    }\n                }\n                return moves;\n            },\n            _swapPairs: function () {\n                var maxIterations = this.options.layeredIterations;\n                var iter = 0;\n                while (true) {\n                    if (iter++ > maxIterations) {\n                        break;\n                    }\n                    var downwards = iter % 4 <= 1;\n                    var secondPass = iter % 4 === 1;\n                    for (var l = downwards ? 0 : this.layers.length - 1; downwards ? l <= this.layers.length - 1 : l >= 0; l += downwards ? 1 : -1) {\n                        var layer = this.layers[l];\n                        var hasSwapped = false;\n                        var calcCrossings = true;\n                        var memCrossings = 0;\n                        for (var n = 0; n < layer.length - 1; n++) {\n                            var up = 0;\n                            var down = 0;\n                            var crossBefore = 0;\n                            if (calcCrossings) {\n                                if (l !== 0) {\n                                    up = this.countLinksCrossingBetweenTwoLayers(l - 1, l);\n                                }\n                                if (l !== this.layers.length - 1) {\n                                    down = this.countLinksCrossingBetweenTwoLayers(l, l + 1);\n                                }\n                                if (downwards) {\n                                    up *= 2;\n                                } else {\n                                    down *= 2;\n                                }\n                                crossBefore = up + down;\n                            } else {\n                                crossBefore = memCrossings;\n                            }\n                            if (crossBefore === 0) {\n                                continue;\n                            }\n                            var node1 = layer[n];\n                            var node2 = layer[n + 1];\n                            var node1GridPos = node1.gridPosition;\n                            var node2GridPos = node2.gridPosition;\n                            layer[n] = node2;\n                            layer[n + 1] = node1;\n                            node1.gridPosition = node2GridPos;\n                            node2.gridPosition = node1GridPos;\n                            up = 0;\n                            if (l !== 0) {\n                                up = this.countLinksCrossingBetweenTwoLayers(l - 1, l);\n                            }\n                            down = 0;\n                            if (l !== this.layers.length - 1) {\n                                down = this.countLinksCrossingBetweenTwoLayers(l, l + 1);\n                            }\n                            if (downwards) {\n                                up *= 2;\n                            } else {\n                                down *= 2;\n                            }\n                            var crossAfter = up + down;\n                            var revert = false;\n                            if (secondPass) {\n                                revert = crossAfter >= crossBefore;\n                            } else {\n                                revert = crossAfter > crossBefore;\n                            }\n                            if (revert) {\n                                node1 = layer[n];\n                                node2 = layer[n + 1];\n                                node1GridPos = node1.gridPosition;\n                                node2GridPos = node2.gridPosition;\n                                layer[n] = node2;\n                                layer[n + 1] = node1;\n                                node1.gridPosition = node2GridPos;\n                                node2.gridPosition = node1GridPos;\n                                memCrossings = crossBefore;\n                                calcCrossings = false;\n                            } else {\n                                hasSwapped = true;\n                                calcCrossings = true;\n                            }\n                        }\n                        if (hasSwapped) {\n                            if (l !== this.layers.length - 1) {\n                                this.calcUpData(l + 1);\n                            }\n                            if (l !== 0) {\n                                this.calcDownData(l - 1);\n                            }\n                        }\n                    }\n                }\n            },\n            countLinksCrossingBetweenTwoLayers: function (ulayer, dlayer) {\n                var links = this.layers[ulayer].linksTo[dlayer];\n                var link1, link2, n11, n12, n21, n22, l1, l2;\n                var crossings = 0;\n                var length = links.length;\n                for (l1 = 0; l1 < length; l1++) {\n                    link1 = links[l1];\n                    for (l2 = l1 + 1; l2 < length; l2++) {\n                        link2 = links[l2];\n                        if (link1.target.layer === dlayer) {\n                            n11 = link1.source;\n                            n12 = link1.target;\n                        } else {\n                            n11 = link1.target;\n                            n12 = link1.source;\n                        }\n                        if (link2.target.layer === dlayer) {\n                            n21 = link2.source;\n                            n22 = link2.target;\n                        } else {\n                            n21 = link2.target;\n                            n22 = link2.source;\n                        }\n                        var n11gp = n11.gridPosition;\n                        var n12gp = n12.gridPosition;\n                        var n21gp = n21.gridPosition;\n                        var n22gp = n22.gridPosition;\n                        if ((n11gp - n21gp) * (n12gp - n22gp) < 0) {\n                            crossings++;\n                        }\n                    }\n                }\n                return crossings;\n            },\n            calcBaryCenter: function (node) {\n                var upstreamLinkCount = node.upstreamLinkCount;\n                var downstreamLinkCount = node.downstreamLinkCount;\n                var uBaryCenter = node.uBaryCenter;\n                var dBaryCenter = node.dBaryCenter;\n                if (upstreamLinkCount > 0 && downstreamLinkCount > 0) {\n                    return (uBaryCenter + dBaryCenter) / 2;\n                }\n                if (upstreamLinkCount > 0) {\n                    return uBaryCenter;\n                }\n                if (downstreamLinkCount > 0) {\n                    return dBaryCenter;\n                }\n                return 0;\n            },\n            _gridPositionComparer: function (x, y) {\n                if (x.gridPosition < y.gridPosition) {\n                    return -1;\n                }\n                if (x.gridPosition > y.gridPosition) {\n                    return 1;\n                }\n                return 0;\n            },\n            _positionAscendingComparer: function (x, y) {\n                return x.k < y.k ? -1 : x.k > y.k ? 1 : 0;\n            },\n            _positionDescendingComparer: function (x, y) {\n                return x.k < y.k ? 1 : x.k > y.k ? -1 : 0;\n            },\n            _firstVirtualNode: function (layer) {\n                for (var c = 0; c < layer.length; c++) {\n                    if (layer[c].isVirtual) {\n                        return c;\n                    }\n                }\n                return -1;\n            },\n            compareByIndex: function (o1, o2) {\n                var i1 = o1.index;\n                var i2 = o2.index;\n                if (i1 < i2) {\n                    return 1;\n                }\n                if (i1 > i2) {\n                    return -1;\n                }\n                return 0;\n            },\n            intDiv: function (numerator, denominator) {\n                return (numerator - numerator % denominator) / denominator;\n            },\n            nextVirtualNode: function (layer, node) {\n                var nodeIndex = node.layerIndex;\n                for (var i = nodeIndex + 1; i < layer.length; ++i) {\n                    if (layer[i].isVirtual) {\n                        return layer[i];\n                    }\n                }\n                return null;\n            }\n        });\n        var LayoutState = kendo.Class.extend({\n            init: function (diagram, graphOrNodes) {\n                if (Utils.isUndefined(diagram)) {\n                    throw 'No diagram given';\n                }\n                this.diagram = diagram;\n                this.nodeMap = new Dictionary();\n                this.linkMap = new Dictionary();\n                this.capture(graphOrNodes ? graphOrNodes : diagram);\n            },\n            capture: function (diagramOrGraphOrNodes) {\n                var node, nodes, shape, i, conn, link, links;\n                if (diagramOrGraphOrNodes instanceof diagram.Graph) {\n                    for (i = 0; i < diagramOrGraphOrNodes.nodes.length; i++) {\n                        node = diagramOrGraphOrNodes.nodes[i];\n                        shape = node.associatedShape;\n                        this.nodeMap.set(shape.visual.id, new Rect(node.x, node.y, node.width, node.height));\n                    }\n                    for (i = 0; i < diagramOrGraphOrNodes.links.length; i++) {\n                        link = diagramOrGraphOrNodes.links[i];\n                        conn = link.associatedConnection;\n                        this.linkMap.set(conn.visual.id, link.points());\n                    }\n                } else if (diagramOrGraphOrNodes instanceof Array) {\n                    nodes = diagramOrGraphOrNodes;\n                    for (i = 0; i < nodes.length; i++) {\n                        node = nodes[i];\n                        shape = node.associatedShape;\n                        if (shape) {\n                            this.nodeMap.set(shape.visual.id, new Rect(node.x, node.y, node.width, node.height));\n                        }\n                    }\n                } else if (diagramOrGraphOrNodes.hasOwnProperty('links') && diagramOrGraphOrNodes.hasOwnProperty('nodes')) {\n                    nodes = diagramOrGraphOrNodes.nodes;\n                    links = diagramOrGraphOrNodes.links;\n                    for (i = 0; i < nodes.length; i++) {\n                        node = nodes[i];\n                        shape = node.associatedShape;\n                        if (shape) {\n                            this.nodeMap.set(shape.visual.id, new Rect(node.x, node.y, node.width, node.height));\n                        }\n                    }\n                    for (i = 0; i < links.length; i++) {\n                        link = links[i];\n                        conn = link.associatedConnection;\n                        if (conn) {\n                            this.linkMap.set(conn.visual.id, link.points);\n                        }\n                    }\n                } else {\n                    var shapes = this.diagram.shapes;\n                    var connections = this.diagram.connections;\n                    for (i = 0; i < shapes.length; i++) {\n                        shape = shapes[i];\n                        this.nodeMap.set(shape.visual.id, shape.bounds());\n                    }\n                    for (i = 0; i < connections.length; i++) {\n                        conn = connections[i];\n                        this.linkMap.set(conn.visual.id, conn.points());\n                    }\n                }\n            }\n        });\n        deepExtend(diagram, {\n            init: function (element) {\n                kendo.init(element, diagram.ui);\n            },\n            SpringLayout: SpringLayout,\n            TreeLayout: TreeLayout,\n            GraphAdapter: DiagramToHyperTreeAdapter,\n            LayeredLayout: LayeredLayout,\n            LayoutBase: LayoutBase,\n            LayoutState: LayoutState\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.toolbar', [\n        'kendo.core',\n        'kendo.userevents',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'toolbar',\n        name: 'ToolBar',\n        category: 'web',\n        description: 'The ToolBar widget displays one or more command buttons divided into groups.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Class = kendo.Class, Widget = kendo.ui.Widget, proxy = $.proxy, isFunction = kendo.isFunction, keys = kendo.keys, outerWidth = kendo._outerWidth, TOOLBAR = 'k-toolbar', BUTTON = 'k-button', OVERFLOW_BUTTON = 'k-overflow-button', TOGGLE_BUTTON = 'k-toggle-button', BUTTON_GROUP = 'k-button-group', SPLIT_BUTTON = 'k-split-button', SEPARATOR = 'k-separator', SPACER_CLASS = 'k-spacer', SPACER = 'spacer', POPUP = 'k-popup', RESIZABLE_TOOLBAR = 'k-toolbar-resizable', STATE_ACTIVE = 'k-state-active', STATE_DISABLED = 'k-state-disabled', STATE_HIDDEN = 'k-state-hidden', GROUP_START = 'k-group-start', GROUP_END = 'k-group-end', PRIMARY = 'k-primary', ICON = 'k-icon', ICON_PREFIX = 'k-i-', BUTTON_ICON = 'k-button-icon', BUTTON_ICON_TEXT = 'k-button-icontext', LIST_CONTAINER = 'k-list-container k-split-container', SPLIT_BUTTON_ARROW = 'k-split-button-arrow', OVERFLOW_ANCHOR = 'k-overflow-anchor', OVERFLOW_CONTAINER = 'k-overflow-container', FIRST_TOOLBAR_VISIBLE = 'k-toolbar-first-visible', LAST_TOOLBAR_VISIBLE = 'k-toolbar-last-visible', CLICK = 'click', TOGGLE = 'toggle', OPEN = 'open', CLOSE = 'close', OVERFLOW_OPEN = 'overflowOpen', OVERFLOW_CLOSE = 'overflowClose', OVERFLOW_NEVER = 'never', OVERFLOW_AUTO = 'auto', OVERFLOW_ALWAYS = 'always', OVERFLOW_HIDDEN = 'k-overflow-hidden', OPTION_LIST_SUFFIX = '_optionlist', KENDO_UID_ATTR = kendo.attr('uid');\n        kendo.toolbar = {};\n        var components = {\n            overflowAnchor: '<div tabindex=\"0\" class=\"k-overflow-anchor k-button\"></div>',\n            overflowContainer: '<ul class=\"k-overflow-container k-list-container\"></ul>'\n        };\n        kendo.toolbar.registerComponent = function (name, toolbar, overflow) {\n            components[name] = {\n                toolbar: toolbar,\n                overflow: overflow\n            };\n        };\n        var Item = kendo.Class.extend({\n            addOverflowAttr: function () {\n                this.element.attr(kendo.attr('overflow'), this.options.overflow || OVERFLOW_AUTO);\n            },\n            addUidAttr: function () {\n                this.element.attr(KENDO_UID_ATTR, this.options.uid);\n            },\n            addIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id);\n                }\n            },\n            addOverflowIdAttr: function () {\n                if (this.options.id) {\n                    this.element.attr('id', this.options.id + '_overflow');\n                }\n            },\n            attributes: function () {\n                if (this.options.attributes) {\n                    this.element.attr(this.options.attributes);\n                }\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN).show();\n                this.options.hidden = false;\n            },\n            hide: function () {\n                this.element.addClass(STATE_HIDDEN).hide();\n                if (this.overflow && this.overflowHidden) {\n                    this.overflowHidden();\n                }\n                this.options.hidden = true;\n            },\n            remove: function () {\n                this.element.remove();\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            twin: function () {\n                var uid = this.element.attr(KENDO_UID_ATTR);\n                if (this.overflow && this.options.splitContainerId) {\n                    return $('#' + this.options.splitContainerId).find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.overflow) {\n                    return this.toolbar.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                } else if (this.toolbar.options.resizable) {\n                    return this.toolbar.popup.element.find('[' + KENDO_UID_ATTR + '=\\'' + uid + '\\']').data(this.options.type);\n                }\n            }\n        });\n        kendo.toolbar.Item = Item;\n        var Button = Item.extend({\n            init: function (options, toolbar) {\n                var element = options.useButtonTag ? $('<button tabindex=\"0\"></button>') : $('<a href tabindex=\"0\"></a>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                if (options.primary) {\n                    element.addClass(PRIMARY);\n                }\n                if (options.togglable) {\n                    element.addClass(TOGGLE_BUTTON);\n                    this.toggle(options.selected);\n                }\n                if (options.url !== undefined && !options.useButtonTag) {\n                    element.attr('href', options.url);\n                    if (options.mobile) {\n                        element.attr(kendo.attr('role'), 'button');\n                    }\n                }\n                if (options.group) {\n                    element.attr(kendo.attr('group'), options.group);\n                    this.group = this.toolbar.addToGroup(this, options.group);\n                }\n                if (!options.togglable && options.click && isFunction(options.click)) {\n                    this.clickHandler = options.click;\n                }\n                if (options.togglable && options.toggle && isFunction(options.toggle)) {\n                    this.toggleHandler = options.toggle;\n                }\n            },\n            toggle: function (state, propagate) {\n                state = !!state;\n                if (this.group && state) {\n                    this.group.select(this);\n                } else if (!this.group) {\n                    this.select(state);\n                }\n                if (propagate && this.twin()) {\n                    this.twin().toggle(state);\n                }\n            },\n            getParentGroup: function () {\n                if (this.options.isChild) {\n                    return this.element.closest('.' + BUTTON_GROUP).data('buttonGroup');\n                }\n            },\n            _addGraphics: function () {\n                var element = this.element, icon = this.options.icon, spriteCssClass = this.options.spriteCssClass, imageUrl = this.options.imageUrl, isEmpty, span, img;\n                if (spriteCssClass || imageUrl || icon) {\n                    isEmpty = true;\n                    element.contents().filter(function () {\n                        return !$(this).hasClass('k-sprite') && !$(this).hasClass(ICON) && !$(this).hasClass('k-image');\n                    }).each(function (idx, el) {\n                        if (el.nodeType == 1 || el.nodeType == 3 && $.trim(el.nodeValue).length > 0) {\n                            isEmpty = false;\n                        }\n                    });\n                    if (isEmpty) {\n                        element.addClass(BUTTON_ICON);\n                    } else {\n                        element.addClass(BUTTON_ICON_TEXT);\n                    }\n                }\n                if (icon) {\n                    span = element.children('span.' + ICON).first();\n                    if (!span[0]) {\n                        span = $('<span class=\"' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(ICON_PREFIX + icon);\n                } else if (spriteCssClass) {\n                    span = element.children('span.k-sprite').first();\n                    if (!span[0]) {\n                        span = $('<span class=\"k-sprite ' + ICON + '\"></span>').prependTo(element);\n                    }\n                    span.addClass(spriteCssClass);\n                } else if (imageUrl) {\n                    img = element.children('img.k-image').first();\n                    if (!img[0]) {\n                        img = $('<img alt=\"icon\" class=\"k-image\" />').prependTo(element);\n                    }\n                    img.attr('src', imageUrl);\n                }\n            }\n        });\n        kendo.toolbar.Button = Button;\n        var ToolBarButton = Button.extend({\n            init: function (options, toolbar) {\n                Button.fn.init.call(this, options, toolbar);\n                var element = this.element;\n                element.addClass(BUTTON);\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (options.showText != 'overflow' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html(options.text);\n                    }\n                }\n                options.hasIcon = options.showIcon != 'overflow' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                this.element.toggleClass(STATE_ACTIVE, selected);\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.ToolBarButton = ToolBarButton;\n        var OverflowButton = Button.extend({\n            init: function (options, toolbar) {\n                this.overflow = true;\n                Button.fn.init.call(this, $.extend({}, options), toolbar);\n                var element = this.element;\n                if (options.showText != 'toolbar' && options.text) {\n                    if (options.mobile) {\n                        element.html('<span class=\"km-text\">' + options.text + '</span>');\n                    } else {\n                        element.html('<span class=\"k-text\">' + options.text + '</span>');\n                    }\n                }\n                options.hasIcon = options.showIcon != 'toolbar' && (options.icon || options.spriteCssClass || options.imageUrl);\n                if (options.hasIcon) {\n                    this._addGraphics();\n                }\n                if (!options.isChild) {\n                    this._wrap();\n                }\n                this.addOverflowIdAttr();\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.enable(options.enable);\n                element.addClass(OVERFLOW_BUTTON + ' ' + BUTTON);\n                if (options.hidden) {\n                    this.hide();\n                }\n                if (options.togglable) {\n                    this.toggle(options.selected);\n                }\n                this.element.data({\n                    type: 'button',\n                    button: this\n                });\n            },\n            _wrap: function () {\n                this.element = this.element.wrap('<li></li>').parent();\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            },\n            select: function (selected) {\n                if (selected === undefined) {\n                    selected = false;\n                }\n                if (this.options.isChild) {\n                    this.element.toggleClass(STATE_ACTIVE, selected);\n                } else {\n                    this.element.find('.k-button').toggleClass(STATE_ACTIVE, selected);\n                }\n                this.options.selected = selected;\n            }\n        });\n        kendo.toolbar.OverflowButton = OverflowButton;\n        kendo.toolbar.registerComponent('button', ToolBarButton, OverflowButton);\n        var ButtonGroup = Item.extend({\n            createButtons: function (buttonConstructor) {\n                var options = this.options;\n                var items = options.buttons || [];\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    if (!items[i].uid) {\n                        items[i].uid = kendo.guid();\n                    }\n                    item = new buttonConstructor($.extend({\n                        mobile: options.mobile,\n                        isChild: true,\n                        type: 'button'\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(this.element);\n                }\n            },\n            refresh: function () {\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):first').addClass(GROUP_START);\n                this.element.children().filter(':not(\\'.' + STATE_HIDDEN + '\\'):last').addClass(GROUP_END);\n            }\n        });\n        kendo.toolbar.ButtonGroup = ButtonGroup;\n        var ToolBarButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.addIdAttr();\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                this.createButtons(ToolBarButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass(BUTTON_GROUP);\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            }\n        });\n        kendo.toolbar.ToolBarButtonGroup = ToolBarButtonGroup;\n        var OverflowButtonGroup = ButtonGroup.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li></li>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.addOverflowIdAttr();\n                this.createButtons(OverflowButton);\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.refresh();\n                element.addClass((options.mobile ? '' : BUTTON_GROUP) + ' k-overflow-group');\n                this.element.data({\n                    type: 'buttonGroup',\n                    buttonGroup: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowButtonGroup = OverflowButtonGroup;\n        kendo.toolbar.registerComponent('buttonGroup', ToolBarButtonGroup, OverflowButtonGroup);\n        var ToolBarSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div class=\"' + SPLIT_BUTTON + '\" tabindex=\"0\"></div>');\n                this.options = options;\n                this.toolbar = toolbar;\n                this.mainButton = new ToolBarButton($.extend({}, options, { hidden: false }), toolbar);\n                this.arrowButton = $('<a class=\"' + BUTTON + ' ' + SPLIT_BUTTON_ARROW + '\"><span class=\"' + (options.mobile ? 'km-icon km-arrowdown' : 'k-icon k-i-arrow-60-down') + '\"></span></a>');\n                this.popupElement = $('<ul class=\"' + LIST_CONTAINER + '\"></ul>');\n                this.mainButton.element.removeAttr('href tabindex').appendTo(element);\n                this.arrowButton.appendTo(element);\n                this.popupElement.appendTo(element);\n                if (options.align) {\n                    element.addClass('k-align-' + options.align);\n                }\n                if (!options.id) {\n                    options.id = options.uid;\n                }\n                element.attr('id', options.id + '_wrapper');\n                this.addOverflowAttr();\n                this.addUidAttr();\n                this.createMenuButtons();\n                this.createPopup();\n                this._navigatable();\n                this.mainButton.main = true;\n                this.enable(options.enable);\n                if (options.hidden) {\n                    this.hide();\n                }\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this,\n                    kendoPopup: this.popup\n                });\n            },\n            _navigatable: function () {\n                var that = this;\n                that.popupElement.on('keydown', '.' + BUTTON, function (e) {\n                    var li = $(e.target).parent();\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that.toggle();\n                        that.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        findFocusableSibling(li, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        findFocusableSibling(li, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.toolbar.userEvents.trigger('tap', { target: $(e.target) });\n                    } else if (e.keyCode === keys.HOME) {\n                        li.parent().find(':kendoFocusable').first().focus();\n                    } else if (e.keyCode === keys.END) {\n                        li.parent().find(':kendoFocusable').last().focus();\n                    }\n                });\n            },\n            createMenuButtons: function () {\n                var options = this.options;\n                var items = options.menuButtons;\n                var item;\n                for (var i = 0; i < items.length; i++) {\n                    item = new ToolBarButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        click: options.click\n                    }, items[i]), this.toolbar);\n                    item.element.wrap('<li></li>').parent().appendTo(this.popupElement);\n                }\n            },\n            createPopup: function () {\n                var that = this;\n                var options = this.options;\n                var element = this.element;\n                this.popupElement.attr('id', options.id + OPTION_LIST_SUFFIX).attr(KENDO_UID_ATTR, options.rootUid);\n                if (options.mobile) {\n                    this.popupElement = actionSheetWrap(this.popupElement);\n                }\n                this.popup = this.popupElement.kendoPopup({\n                    appendTo: options.mobile ? $(options.mobile).children('.km-pane') : null,\n                    anchor: element,\n                    isRtl: this.toolbar._isRtl,\n                    copyAnchorStyles: false,\n                    animation: options.animation,\n                    open: function (e) {\n                        var isDefaultPrevented = that.toolbar.trigger(OPEN, { target: element });\n                        if (isDefaultPrevented) {\n                            e.preventDefault();\n                            return;\n                        }\n                        that.adjustPopupWidth(e.sender);\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        var isDefaultPrevented = that.toolbar.trigger(CLOSE, { target: element });\n                        if (isDefaultPrevented) {\n                            e.preventDefault();\n                        }\n                        element.focus();\n                    }\n                }).data('kendoPopup');\n                this.popup.element.on(CLICK, 'a.k-button', preventClick);\n            },\n            adjustPopupWidth: function (popup) {\n                var anchor = popup.options.anchor, computedWidth = outerWidth(anchor), width;\n                kendo.wrap(popup.element).addClass('k-split-wrapper');\n                if (popup.element.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(popup.element) - popup.element.width());\n                } else {\n                    width = computedWidth;\n                }\n                popup.element.css({\n                    fontFamily: anchor.css('font-family'),\n                    'min-width': width\n                });\n            },\n            remove: function () {\n                this.popup.element.off(CLICK, 'a.k-button');\n                this.popup.destroy();\n                this.element.remove();\n            },\n            toggle: function () {\n                if (this.options.enable || this.popup.visible()) {\n                    this.popup.toggle();\n                }\n            },\n            enable: function (isEnabled) {\n                if (isEnabled === undefined) {\n                    isEnabled = true;\n                }\n                this.mainButton.enable(isEnabled);\n                this.element.toggleClass(STATE_DISABLED, !isEnabled);\n                this.options.enable = isEnabled;\n            },\n            focus: function () {\n                this.element.focus();\n            },\n            hide: function () {\n                if (this.popup) {\n                    this.popup.close();\n                }\n                this.element.addClass(STATE_HIDDEN).hide();\n                this.options.hidden = true;\n            },\n            show: function () {\n                this.element.removeClass(STATE_HIDDEN).hide();\n                this.options.hidden = false;\n            }\n        });\n        kendo.toolbar.ToolBarSplitButton = ToolBarSplitButton;\n        var OverflowSplitButton = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li class=\"' + SPLIT_BUTTON + '\"></li>'), items = options.menuButtons, item, splitContainerId;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                splitContainerId = (options.id || options.uid) + OPTION_LIST_SUFFIX;\n                this.mainButton = new OverflowButton($.extend({}, options));\n                this.mainButton.element.appendTo(element);\n                for (var i = 0; i < items.length; i++) {\n                    item = new OverflowButton($.extend({\n                        mobile: options.mobile,\n                        type: 'button',\n                        splitContainerId: splitContainerId\n                    }, items[i]), this.toolbar);\n                    item.element.appendTo(element);\n                }\n                this.addUidAttr();\n                this.addOverflowAttr();\n                this.mainButton.main = true;\n                element.data({\n                    type: 'splitButton',\n                    splitButton: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowSplitButton = OverflowSplitButton;\n        kendo.toolbar.registerComponent('splitButton', ToolBarSplitButton, OverflowSplitButton);\n        var ToolBarSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div>&nbsp;</div>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addIdAttr();\n                this.addUidAttr();\n                this.addOverflowAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            }\n        });\n        var OverflowSeparator = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<li>&nbsp;</li>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                element.addClass(SEPARATOR);\n                element.data({\n                    type: 'separator',\n                    separator: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.registerComponent('separator', ToolBarSeparator, OverflowSeparator);\n        var ToolBarSpacer = Item.extend({\n            init: function (options, toolbar) {\n                var element = this.element = $('<div>&nbsp;</div>');\n                this.element = element;\n                this.options = options;\n                this.toolbar = toolbar;\n                element.addClass(SPACER_CLASS);\n                element.data({ type: SPACER });\n            }\n        });\n        kendo.toolbar.registerComponent(SPACER, ToolBarSpacer);\n        var TemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? template(options) : template;\n                if (!(element instanceof jQuery)) {\n                    element = $('<div></div>').html(element);\n                } else {\n                    element = element.wrap('<div></div>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.attributes();\n                this.addUidAttr();\n                this.addIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            }\n        });\n        kendo.toolbar.TemplateItem = TemplateItem;\n        var OverflowTemplateItem = Item.extend({\n            init: function (template, options, toolbar) {\n                var element = isFunction(template) ? $(template(options)) : $(template);\n                if (!(element instanceof jQuery)) {\n                    element = $('<li></li>').html(element);\n                } else {\n                    element = element.wrap('<li></li>').parent();\n                }\n                this.element = element;\n                this.options = options;\n                this.options.type = 'template';\n                this.toolbar = toolbar;\n                this.overflow = true;\n                this.attributes();\n                this.addUidAttr();\n                this.addOverflowIdAttr();\n                this.addOverflowAttr();\n                element.data({\n                    type: 'template',\n                    template: this\n                });\n            },\n            overflowHidden: function () {\n                this.element.addClass(OVERFLOW_HIDDEN);\n            }\n        });\n        kendo.toolbar.OverflowTemplateItem = OverflowTemplateItem;\n        function toggleActive(e) {\n            if (!e.target.is('.k-toggle-button')) {\n                e.target.toggleClass(STATE_ACTIVE, e.type == 'press');\n            }\n        }\n        function actionSheetWrap(element) {\n            element = $(element);\n            return element.hasClass('km-actionsheet') ? element.closest('.km-popup-wrapper') : element.addClass('km-widget km-actionsheet').wrap('<div class=\"km-actionsheet-wrapper km-actionsheet-tablet km-widget km-popup\"></div>').parent().wrap('<div class=\"km-popup-wrapper k-popup\"></div>').parent();\n        }\n        function preventClick(e) {\n            if ($(e.target).closest('a.k-button').length) {\n                e.preventDefault();\n            }\n        }\n        function findFocusableSibling(element, dir) {\n            var getSibling = dir === 'next' ? $.fn.next : $.fn.prev;\n            var getter = dir === 'next' ? $.fn.first : $.fn.last;\n            var candidate = getSibling.call(element);\n            if (!candidate.length && element.is('.' + OVERFLOW_ANCHOR)) {\n                return element;\n            }\n            if (candidate.is(':kendoFocusable') || !candidate.length) {\n                return candidate;\n            }\n            if (candidate.find(':kendoFocusable').length) {\n                return getter.call(candidate.find(':kendoFocusable'));\n            }\n            return findFocusableSibling(candidate, dir);\n        }\n        var Group = Class.extend({\n            init: function (name) {\n                this.name = name;\n                this.buttons = [];\n            },\n            add: function (button) {\n                this.buttons[this.buttons.length] = button;\n            },\n            remove: function (button) {\n                var index = $.inArray(button, this.buttons);\n                this.buttons.splice(index, 1);\n            },\n            select: function (button) {\n                var tmp;\n                for (var i = 0; i < this.buttons.length; i++) {\n                    tmp = this.buttons[i];\n                    tmp.select(false);\n                }\n                button.select(true);\n                if (button.twin()) {\n                    button.twin().select(true);\n                }\n            }\n        });\n        var ToolBar = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.wrapper = that.element;\n                element.addClass(TOOLBAR + ' k-widget');\n                this.uid = kendo.guid();\n                this._isRtl = kendo.support.isRtl(element);\n                this._groups = {};\n                element.attr(KENDO_UID_ATTR, this.uid);\n                that.isMobile = typeof options.mobile === 'boolean' ? options.mobile : that.element.closest('.km-root')[0];\n                that.animation = that.isMobile ? { open: { effects: 'fade' } } : {};\n                if (that.isMobile) {\n                    element.addClass('km-widget');\n                    ICON = 'km-icon';\n                    ICON_PREFIX = 'km-';\n                    BUTTON = 'km-button';\n                    BUTTON_GROUP = 'km-buttongroup';\n                    STATE_ACTIVE = 'km-state-active';\n                    STATE_DISABLED = 'km-state-disabled';\n                }\n                if (options.resizable) {\n                    that._renderOverflow();\n                    element.addClass(RESIZABLE_TOOLBAR);\n                    that.overflowUserEvents = new kendo.UserEvents(that.element, {\n                        threshold: 5,\n                        allowSelection: true,\n                        filter: '.' + OVERFLOW_ANCHOR,\n                        tap: proxy(that._toggleOverflow, that)\n                    });\n                    that._resizeHandler = kendo.onResize(function () {\n                        that.resize();\n                    });\n                } else {\n                    that.popup = { element: $([]) };\n                }\n                if (options.items && options.items.length) {\n                    for (var i = 0; i < options.items.length; i++) {\n                        that.add(options.items[i]);\n                    }\n                    if (options.resizable) {\n                        that._shrink(that.element.innerWidth());\n                    }\n                }\n                that.userEvents = new kendo.UserEvents(document, {\n                    threshold: 5,\n                    allowSelection: true,\n                    filter: '[' + KENDO_UID_ATTR + '=' + this.uid + '] a.' + BUTTON + ', ' + '[' + KENDO_UID_ATTR + '=' + this.uid + '] .' + OVERFLOW_BUTTON,\n                    tap: proxy(that._buttonClick, that),\n                    press: toggleActive,\n                    release: toggleActive\n                });\n                that.element.on(CLICK, 'a.k-button', preventClick);\n                that._navigatable();\n                if (options.resizable) {\n                    that.popup.element.on(CLICK, +'a.k-button', preventClick);\n                }\n                if (options.resizable) {\n                    this._toggleOverflowAnchor();\n                }\n                kendo.notify(that);\n            },\n            events: [\n                CLICK,\n                TOGGLE,\n                OPEN,\n                CLOSE,\n                OVERFLOW_OPEN,\n                OVERFLOW_CLOSE\n            ],\n            options: {\n                name: 'ToolBar',\n                items: [],\n                resizable: true,\n                mobile: null\n            },\n            addToGroup: function (button, groupName) {\n                var group;\n                if (!this._groups[groupName]) {\n                    group = this._groups[groupName] = new Group();\n                } else {\n                    group = this._groups[groupName];\n                }\n                group.add(button);\n                return group;\n            },\n            destroy: function () {\n                var that = this;\n                that.element.find('.' + SPLIT_BUTTON).each(function (idx, element) {\n                    $(element).data('kendoPopup').destroy();\n                });\n                that.element.off(CLICK, 'a.k-button');\n                that.userEvents.destroy();\n                if (that.options.resizable) {\n                    kendo.unbindResize(that._resizeHandler);\n                    that.overflowUserEvents.destroy();\n                    that.popup.element.off(CLICK, 'a.k-button');\n                    that.popup.destroy();\n                }\n                Widget.fn.destroy.call(that);\n            },\n            add: function (options) {\n                var component = components[options.type], template = options.template, tool, that = this, itemClasses = that.isMobile ? '' : 'k-item k-state-default', overflowTemplate = options.overflowTemplate, overflowTool;\n                $.extend(options, {\n                    uid: kendo.guid(),\n                    animation: that.animation,\n                    mobile: that.isMobile,\n                    rootUid: that.uid\n                });\n                if (options.menuButtons) {\n                    for (var i = 0; i < options.menuButtons.length; i++) {\n                        $.extend(options.menuButtons[i], { uid: kendo.guid() });\n                    }\n                }\n                if (template && !overflowTemplate || options.type === SPACER) {\n                    options.overflow = OVERFLOW_NEVER;\n                } else if (!options.overflow) {\n                    options.overflow = OVERFLOW_AUTO;\n                }\n                if (options.overflow !== OVERFLOW_NEVER && that.options.resizable) {\n                    if (overflowTemplate) {\n                        overflowTool = new OverflowTemplateItem(overflowTemplate, options, that);\n                    } else if (component) {\n                        overflowTool = new component.overflow(options, that);\n                        overflowTool.element.addClass(itemClasses);\n                    }\n                    if (overflowTool) {\n                        if (options.overflow === OVERFLOW_AUTO) {\n                            overflowTool.overflowHidden();\n                        }\n                        overflowTool.element.appendTo(that.popup.container);\n                        that.angular('compile', function () {\n                            return { elements: overflowTool.element.get() };\n                        });\n                    }\n                }\n                if (options.overflow !== OVERFLOW_ALWAYS) {\n                    if (template) {\n                        tool = new TemplateItem(template, options, that);\n                    } else if (component) {\n                        tool = new component.toolbar(options, that);\n                    }\n                    if (tool) {\n                        tool.element.appendTo(that.element);\n                        that.angular('compile', function () {\n                            return { elements: tool.element.get() };\n                        });\n                    }\n                }\n            },\n            _getItem: function (candidate) {\n                var element, toolbarItem, overflowItem, isResizable = this.options.resizable, type;\n                element = this.element.find(candidate);\n                if (!element.length) {\n                    element = $('.k-split-container[data-uid=' + this.uid + ']').find(candidate);\n                }\n                type = element.length ? element.data('type') : '';\n                toolbarItem = element.data(type);\n                if (toolbarItem) {\n                    if (toolbarItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        toolbarItem = element.data(type);\n                    }\n                    if (isResizable) {\n                        overflowItem = toolbarItem.twin();\n                    }\n                } else if (isResizable) {\n                    element = this.popup.element.find(candidate);\n                    type = element.length ? element.data('type') : '';\n                    overflowItem = element.data(type);\n                    if (overflowItem && overflowItem.main) {\n                        element = element.parent('.' + SPLIT_BUTTON);\n                        type = 'splitButton';\n                        overflowItem = element.data(type);\n                    }\n                }\n                return {\n                    type: type,\n                    toolbar: toolbarItem,\n                    overflow: overflowItem\n                };\n            },\n            remove: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    item.toolbar.remove();\n                }\n                if (item.overflow) {\n                    item.overflow.remove();\n                }\n                this.resize(true);\n            },\n            hide: function (candidate) {\n                var item = this._getItem(candidate);\n                var buttonGroupInstance;\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        buttonGroupInstance = item.toolbar.getParentGroup();\n                        item.toolbar.hide();\n                        if (buttonGroupInstance) {\n                            buttonGroupInstance.refresh();\n                        }\n                    } else if (!item.toolbar.options.hidden) {\n                        item.toolbar.hide();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        buttonGroupInstance = item.overflow.getParentGroup();\n                        item.overflow.hide();\n                        if (buttonGroupInstance) {\n                            buttonGroupInstance.refresh();\n                        }\n                    } else if (!item.overflow.options.hidden) {\n                        item.overflow.hide();\n                    }\n                }\n                this.resize(true);\n            },\n            show: function (candidate) {\n                var item = this._getItem(candidate);\n                if (item.toolbar) {\n                    if (item.toolbar.options.type === 'button' && item.toolbar.options.isChild) {\n                        item.toolbar.show();\n                        item.toolbar.getParentGroup().refresh();\n                    } else if (item.toolbar.options.hidden) {\n                        item.toolbar.show();\n                    }\n                }\n                if (item.overflow) {\n                    if (item.overflow.options.type === 'button' && item.overflow.options.isChild) {\n                        item.toolbar.show();\n                        item.overflow.getParentGroup().refresh();\n                    } else if (item.overflow.options.hidden) {\n                        item.overflow.show();\n                    }\n                }\n                this.resize(true);\n            },\n            enable: function (element, enable) {\n                var item = this._getItem(element);\n                if (typeof enable == 'undefined') {\n                    enable = true;\n                }\n                if (item.toolbar) {\n                    item.toolbar.enable(enable);\n                }\n                if (item.overflow) {\n                    item.overflow.enable(enable);\n                }\n            },\n            getSelectedFromGroup: function (groupName) {\n                return this.element.find('.' + TOGGLE_BUTTON + '[data-group=\\'' + groupName + '\\']').filter('.' + STATE_ACTIVE);\n            },\n            toggle: function (button, checked) {\n                var element = $(button), item = element.data('button');\n                if (item.options.togglable) {\n                    if (checked === undefined) {\n                        checked = true;\n                    }\n                    item.toggle(checked, true);\n                }\n            },\n            _renderOverflow: function () {\n                var that = this, overflowContainer = components.overflowContainer, isRtl = that._isRtl, horizontalDirection = isRtl ? 'left' : 'right';\n                that.overflowAnchor = $(components.overflowAnchor).addClass(BUTTON);\n                that.element.append(that.overflowAnchor);\n                if (that.isMobile) {\n                    that.overflowAnchor.append('<span class=\"km-icon km-more\"></span>');\n                    overflowContainer = actionSheetWrap(overflowContainer);\n                } else {\n                    that.overflowAnchor.append('<span class=\"k-icon k-i-more-vertical\"></span>');\n                }\n                that.popup = new kendo.ui.Popup(overflowContainer, {\n                    origin: 'bottom ' + horizontalDirection,\n                    position: 'top ' + horizontalDirection,\n                    anchor: that.overflowAnchor,\n                    isRtl: isRtl,\n                    animation: that.animation,\n                    appendTo: that.isMobile ? $(that.isMobile).children('.km-pane') : null,\n                    copyAnchorStyles: false,\n                    open: function (e) {\n                        var wrapper = kendo.wrap(that.popup.element).addClass('k-overflow-wrapper');\n                        if (!that.isMobile) {\n                            wrapper.css('margin-left', (isRtl ? -1 : 1) * ((outerWidth(wrapper) - wrapper.width()) / 2 + 1));\n                        } else {\n                            that.popup.container.css('max-height', parseFloat($('.km-content:visible').innerHeight()) - 15 + 'px');\n                        }\n                        if (that.trigger(OVERFLOW_OPEN)) {\n                            e.preventDefault();\n                        }\n                    },\n                    activate: function () {\n                        this.element.find(':kendoFocusable').first().focus();\n                    },\n                    close: function (e) {\n                        if (that.trigger(OVERFLOW_CLOSE)) {\n                            e.preventDefault();\n                        }\n                        this.element.focus();\n                    }\n                });\n                that.popup.element.on('keydown', '.' + BUTTON, function (e) {\n                    var target = $(e.target), li = target.parent(), isComplexTool = li.is('.' + BUTTON_GROUP) || li.is('.' + SPLIT_BUTTON), element;\n                    e.preventDefault();\n                    if (e.keyCode === keys.ESC || e.keyCode === keys.TAB || e.altKey && e.keyCode === keys.UP) {\n                        that._toggleOverflow();\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.DOWN) {\n                        element = !isComplexTool || isComplexTool && target.is(':last-child') ? li : target;\n                        findFocusableSibling(element, 'next').focus();\n                    } else if (e.keyCode === keys.UP) {\n                        element = !isComplexTool || isComplexTool && target.is(':first-child') ? li : target;\n                        findFocusableSibling(element, 'prev').focus();\n                    } else if (e.keyCode === keys.SPACEBAR || e.keyCode === keys.ENTER) {\n                        that.userEvents.trigger('tap', { target: $(e.target) });\n                        that.overflowAnchor.focus();\n                    } else if (e.keyCode === keys.HOME) {\n                        li.parent().find(':kendoFocusable').first().focus();\n                    } else if (e.keyCode === keys.END) {\n                        li.parent().find(':kendoFocusable').last().focus();\n                    }\n                });\n                if (that.isMobile) {\n                    that.popup.container = that.popup.element.find('.' + OVERFLOW_CONTAINER);\n                } else {\n                    that.popup.container = that.popup.element;\n                }\n                that.popup.container.attr(KENDO_UID_ATTR, this.uid);\n            },\n            _toggleOverflowAnchor: function () {\n                var hasVisibleChildren = false;\n                var paddingEnd = this._isRtl ? 'padding-left' : 'padding-right';\n                if (this.options.mobile) {\n                    hasVisibleChildren = this.popup.element.find('.' + OVERFLOW_CONTAINER).children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                } else {\n                    hasVisibleChildren = this.popup.element.children(':not(.' + OVERFLOW_HIDDEN + ', .' + POPUP + ')').length > 0;\n                }\n                if (hasVisibleChildren) {\n                    this.overflowAnchor.css({\n                        visibility: 'visible',\n                        width: ''\n                    });\n                    this.wrapper.css(paddingEnd, this.overflowAnchor.outerWidth(true));\n                } else {\n                    this.overflowAnchor.css({\n                        visibility: 'hidden',\n                        width: '1px'\n                    });\n                    this.wrapper.css(paddingEnd, '');\n                }\n            },\n            _buttonClick: function (e) {\n                var that = this, popup, target, item, splitContainer, isSplitButtonArrow = e.target.closest('.' + SPLIT_BUTTON_ARROW).length, handler, eventData, urlTarget;\n                e.preventDefault();\n                if (isSplitButtonArrow) {\n                    that._toggle(e);\n                    return;\n                }\n                target = $(e.target).closest('.' + BUTTON, that.element);\n                if (target.hasClass(OVERFLOW_ANCHOR)) {\n                    return;\n                }\n                item = target.data('button');\n                if (!item && that.popup) {\n                    target = $(e.target).closest('.' + OVERFLOW_BUTTON, that.popup.container);\n                    item = target.parent('li').data('button');\n                }\n                if (!item || !item.options.enable) {\n                    return;\n                }\n                if (item.options.togglable) {\n                    handler = isFunction(item.toggleHandler) ? item.toggleHandler : null;\n                    item.toggle(!item.options.selected, true);\n                    eventData = {\n                        target: target,\n                        group: item.options.group,\n                        checked: item.options.selected,\n                        id: item.options.id,\n                        item: item\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(TOGGLE, eventData);\n                } else {\n                    handler = isFunction(item.clickHandler) ? item.clickHandler : null;\n                    eventData = {\n                        sender: that,\n                        target: target,\n                        id: item.options.id,\n                        item: item\n                    };\n                    if (handler) {\n                        handler.call(that, eventData);\n                    }\n                    that.trigger(CLICK, eventData);\n                }\n                if (item.options.url) {\n                    if (item.options.attributes && item.options.attributes.target) {\n                        urlTarget = item.options.attributes.target;\n                    }\n                    window.open(item.options.url, urlTarget || '_self');\n                }\n                if (target.hasClass(OVERFLOW_BUTTON)) {\n                    that.popup.close();\n                }\n                splitContainer = target.closest('.k-split-container');\n                if (splitContainer[0]) {\n                    popup = splitContainer.data('kendoPopup');\n                    (popup ? popup : splitContainer.parents('.km-popup-wrapper').data('kendoPopup')).close();\n                }\n            },\n            _navigatable: function () {\n                var that = this;\n                that.element.attr('tabindex', 0).on('focusin', function (ev) {\n                    var target = $(ev.target);\n                    var element = $(this).find(':kendoFocusable:first');\n                    if (!target.is('.' + TOOLBAR) || element.length === 0) {\n                        return;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR)) {\n                        element = findFocusableSibling(element, 'next');\n                    }\n                    if (element.length) {\n                        element[0].focus();\n                    }\n                }).on('keydown', proxy(that._keydown, that));\n            },\n            _keydown: function (e) {\n                var target = $(e.target), keyCode = e.keyCode, items = this.element.children(':not(.k-separator):visible'), direction = this._isRtl ? -1 : 1;\n                if (keyCode === keys.TAB) {\n                    var element = target.parentsUntil(this.element).last(), lastHasFocus = false, firstHasFocus = false, isOnlyOverflowAnchor = false;\n                    if (!items.not('.' + OVERFLOW_ANCHOR).length) {\n                        isOnlyOverflowAnchor = true;\n                    }\n                    if (!element.length) {\n                        element = target;\n                    }\n                    if (element.is('.' + OVERFLOW_ANCHOR) && !isOnlyOverflowAnchor) {\n                        var lastItemNotOverflowAnchor = items.last();\n                        if (e.shiftKey) {\n                            e.preventDefault();\n                        }\n                        if (lastItemNotOverflowAnchor.is(':kendoFocusable')) {\n                            items.last().focus();\n                        } else {\n                            items.last().find(':kendoFocusable').last().focus();\n                        }\n                    }\n                    if (!e.shiftKey && items.index(element) === items.length - 1) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            lastHasFocus = target.is(':last-child');\n                        } else {\n                            lastHasFocus = true;\n                        }\n                    }\n                    var isFirstTool = items.index(element) === items.not('.k-overflow-anchor').first().index();\n                    if (e.shiftKey && isFirstTool) {\n                        if (element.is('.' + BUTTON_GROUP)) {\n                            firstHasFocus = target.is(':first-child');\n                        } else {\n                            firstHasFocus = true;\n                        }\n                    }\n                    if (lastHasFocus && this.overflowAnchor && this.overflowAnchor.css('visibility') !== 'hidden' && !isOnlyOverflowAnchor) {\n                        e.preventDefault();\n                        this.overflowAnchor.focus();\n                    }\n                    if (firstHasFocus || isOnlyOverflowAnchor && e.shiftKey) {\n                        e.preventDefault();\n                        var prevFocusable = this._getPrevFocusable(this.wrapper);\n                        if (prevFocusable) {\n                            prevFocusable.focus();\n                        }\n                    }\n                    this._preventNextFocus = false;\n                }\n                if (e.altKey && keyCode === keys.DOWN) {\n                    var splitButton = $(document.activeElement).data('splitButton');\n                    var isOverflowAnchor = $(document.activeElement).is('.' + OVERFLOW_ANCHOR);\n                    if (splitButton) {\n                        splitButton.toggle();\n                    } else if (isOverflowAnchor) {\n                        this._toggleOverflow();\n                    }\n                    return;\n                }\n                if ((keyCode === keys.SPACEBAR || keyCode === keys.ENTER) && !target.is('input, checkbox')) {\n                    if (keyCode === keys.SPACEBAR) {\n                        e.preventDefault();\n                    }\n                    if (target.is('.' + SPLIT_BUTTON)) {\n                        target = target.children().first();\n                        this.userEvents.trigger('tap', { target: target });\n                    } else if (keyCode === keys.SPACEBAR) {\n                        this.userEvents.trigger('tap', { target: target });\n                    }\n                    return;\n                }\n                if (keyCode === keys.HOME) {\n                    if (target.is('.k-dropdown') || target.is('input')) {\n                        return;\n                    }\n                    if (this.overflowAnchor) {\n                        items.eq(1).focus();\n                    } else {\n                        items.first().focus();\n                    }\n                    e.preventDefault();\n                } else if (keyCode === keys.END) {\n                    if (target.is('.k-dropdown') || target.is('input')) {\n                        return;\n                    }\n                    if (this.overflowAnchor && $(this.overflowAnchor).css('visibility') != 'hidden') {\n                        this.overflowAnchor.focus();\n                    } else {\n                        items.last().focus();\n                    }\n                    e.preventDefault();\n                } else if (keyCode === keys.RIGHT && !this._preventNextFocus && !target.is('input, select, .k-dropdown, .k-colorpicker') && this._getNextElement(e.target, 1 * direction)) {\n                    this._getNextElement(e.target, 1 * direction).focus();\n                    e.preventDefault();\n                } else if (keyCode === keys.LEFT && !this._preventNextFocus && !target.is('input, select, .k-dropdown, .k-colorpicker') && this._getNextElement(e.target, -1 * direction)) {\n                    this._getNextElement(e.target, -1 * direction).focus();\n                    e.preventDefault();\n                }\n            },\n            _getNextElement: function (item, direction) {\n                var items = this.element.children(':not(.k-separator):visible');\n                var itemIndex = items.index(item) === -1 ? items.index(item.parentElement) : items.index(item);\n                var startIndex = this.overflowAnchor ? 1 : 0;\n                var directionNumber = direction;\n                var searchIndex = direction === 1 ? items.length - 1 : startIndex;\n                var index = direction === 1 ? startIndex : items.length - 1;\n                var focusableItem = items[itemIndex + direction];\n                this._preventNextFocus = false;\n                if ($(item).closest('.' + BUTTON_GROUP).length && !$(item).is(direction === 1 ? ':last-child' : ':first-child')) {\n                    return $(item).closest('.' + BUTTON_GROUP).children()[$(item).closest('.' + BUTTON_GROUP).children().index(item) + direction];\n                }\n                if (this.overflowAnchor && item === this.overflowAnchor[0] && direction === -1) {\n                    focusableItem = items[items.length - 1];\n                }\n                if (itemIndex === searchIndex) {\n                    focusableItem = !this.overflowAnchor || this.overflowAnchor && $(this.overflowAnchor).css('visibility') === 'hidden' ? items[index] : this.overflowAnchor;\n                }\n                while (!$(focusableItem).is(':kendoFocusable')) {\n                    if (direction === -1 && $(focusableItem).closest('.' + BUTTON_GROUP).length) {\n                        focusableItem = $(focusableItem).children(':not(label, div)').last();\n                    } else {\n                        focusableItem = $(focusableItem).children(':not(label, div)').first();\n                    }\n                    if (!focusableItem.length) {\n                        directionNumber = directionNumber + direction;\n                        focusableItem = items[itemIndex + directionNumber];\n                        if (!focusableItem) {\n                            return this.overflowAnchor;\n                        }\n                    }\n                    this._preventNextFocus = $(focusableItem).closest('.' + BUTTON_GROUP).length ? false : true;\n                }\n                return focusableItem;\n            },\n            _getPrevFocusable: function (element) {\n                if (element.is('html')) {\n                    return element;\n                }\n                var elementToFocus, prevElement, prevElements = element.prevAll();\n                prevElements.each(function () {\n                    prevElement = $(this);\n                    if (prevElement.is(':kendoFocusable')) {\n                        elementToFocus = prevElement;\n                        return false;\n                    } else if (prevElement.find(':kendoFocusable').length > 0) {\n                        elementToFocus = prevElement.find(':kendoFocusable').last();\n                        return false;\n                    }\n                });\n                if (elementToFocus) {\n                    return elementToFocus;\n                } else {\n                    return this._getPrevFocusable(element.parent());\n                }\n            },\n            _toggle: function (e) {\n                var splitButton = $(e.target).closest('.' + SPLIT_BUTTON).data('splitButton');\n                e.preventDefault();\n                if (!splitButton.options.enable) {\n                    return;\n                }\n                splitButton.toggle();\n            },\n            _toggleOverflow: function () {\n                this.popup.toggle();\n            },\n            _resize: function (e) {\n                var containerWidth = e.width;\n                if (!this.options.resizable) {\n                    return;\n                }\n                this.popup.close();\n                this._shrink(containerWidth);\n                this._stretch(containerWidth);\n                this._markVisibles();\n                this._toggleOverflowAnchor();\n            },\n            _childrenWidth: function () {\n                var childrenWidth = 0;\n                this.element.children(':visible:not(.' + STATE_HIDDEN + ', .' + SPACER_CLASS + ')').each(function () {\n                    childrenWidth += outerWidth($(this), true);\n                });\n                return Math.ceil(childrenWidth);\n            },\n            _shrink: function (containerWidth) {\n                var commandElement, visibleCommands;\n                if (containerWidth < this._childrenWidth()) {\n                    visibleCommands = this.element.children(':visible:not([data-overflow=\\'never\\'], .' + OVERFLOW_ANCHOR + ')');\n                    for (var i = visibleCommands.length - 1; i >= 0; i--) {\n                        commandElement = visibleCommands.eq(i);\n                        if (containerWidth > this._childrenWidth()) {\n                            break;\n                        } else {\n                            this._hideItem(commandElement);\n                        }\n                    }\n                }\n            },\n            _stretch: function (containerWidth) {\n                var commandElement, hiddenCommands;\n                if (containerWidth > this._childrenWidth()) {\n                    hiddenCommands = this.element.children(':hidden:not(\\'.' + STATE_HIDDEN + '\\')');\n                    for (var i = 0; i < hiddenCommands.length; i++) {\n                        commandElement = hiddenCommands.eq(i);\n                        if (containerWidth < this._childrenWidth() || !this._showItem(commandElement, containerWidth)) {\n                            break;\n                        }\n                    }\n                }\n            },\n            _hideItem: function (item) {\n                item.hide();\n                if (this.popup) {\n                    this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').removeClass(OVERFLOW_HIDDEN);\n                }\n            },\n            _showItem: function (item, containerWidth) {\n                if (item.length && containerWidth > this._childrenWidth() + outerWidth(item, true)) {\n                    item.show();\n                    if (this.popup) {\n                        this.popup.container.find('>li[data-uid=\\'' + item.data('uid') + '\\']').addClass(OVERFLOW_HIDDEN);\n                    }\n                    return true;\n                }\n                return false;\n            },\n            _markVisibles: function () {\n                var overflowItems = this.popup.container.children(), toolbarItems = this.element.children(':not(.k-overflow-anchor)'), visibleOverflowItems = overflowItems.filter(':not(.k-overflow-hidden)'), visibleToolbarItems = toolbarItems.filter(':visible');\n                overflowItems.add(toolbarItems).removeClass(FIRST_TOOLBAR_VISIBLE + ' ' + LAST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.first().add(visibleToolbarItems.first()).addClass(FIRST_TOOLBAR_VISIBLE);\n                visibleOverflowItems.last().add(visibleToolbarItems.last()).addClass(LAST_TOOLBAR_VISIBLE);\n            }\n        });\n        kendo.ui.plugin(ToolBar);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.selectable', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'selectable',\n        name: 'Selectable',\n        category: 'framework',\n        depends: [\n            'core',\n            'userevents'\n        ],\n        advanced: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, proxy = $.proxy, abs = Math.abs, ARIASELECTED = 'aria-selected', SELECTED = 'k-state-selected', ACTIVE = 'k-state-selecting', SELECTABLE = 'k-selectable', CHANGE = 'change', NS = '.kendoSelectable', UNSELECT = 'unselect', UNSELECTING = 'k-state-unselecting', INPUTSELECTOR = 'input,a,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up,label.k-checkbox-label.k-no-text,.k-icon.k-i-collapse,.k-icon.k-i-expand', msie = kendo.support.browser.msie, supportEventDelegation = false;\n        (function ($) {\n            (function () {\n                $('<div class=\"parent\"><span /></div>').on('click', '>*', function () {\n                    supportEventDelegation = true;\n                }).find('span').trigger('click').end().off();\n            }());\n        }($));\n        var Selectable = Widget.extend({\n            init: function (element, options) {\n                var that = this, multiple;\n                Widget.fn.init.call(that, element, options);\n                that._marquee = $('<div class=\\'k-marquee\\'><div class=\\'k-marquee-color\\'></div></div>');\n                that._lastActive = null;\n                that.element.addClass(SELECTABLE);\n                that.relatedTarget = that.options.relatedTarget;\n                multiple = that.options.multiple;\n                if (this.options.aria && multiple) {\n                    that.element.attr('aria-multiselectable', true);\n                }\n                that.userEvents = new kendo.UserEvents(that.element, {\n                    global: true,\n                    allowSelection: true,\n                    filter: (!supportEventDelegation ? '.' + SELECTABLE + ' ' : '') + that.options.filter,\n                    tap: proxy(that._tap, that),\n                    touchAction: multiple ? 'none' : 'pan-x pan-y'\n                });\n                if (multiple) {\n                    that.userEvents.bind('start', proxy(that._start, that)).bind('move', proxy(that._move, that)).bind('end', proxy(that._end, that)).bind('select', proxy(that._select, that));\n                }\n            },\n            events: [\n                CHANGE,\n                UNSELECT\n            ],\n            options: {\n                name: 'Selectable',\n                filter: '>*',\n                inputSelectors: INPUTSELECTOR,\n                multiple: false,\n                relatedTarget: $.noop\n            },\n            _isElement: function (target) {\n                var elements = this.element;\n                var idx, length = elements.length, result = false;\n                target = target[0];\n                for (idx = 0; idx < length; idx++) {\n                    if (elements[idx] === target) {\n                        result = true;\n                        break;\n                    }\n                }\n                return result;\n            },\n            _tap: function (e) {\n                var target = $(e.target), that = this, ctrlKey = e.event.ctrlKey || e.event.metaKey, multiple = that.options.multiple, shiftKey = multiple && e.event.shiftKey, selected, whichCode = e.event.which, buttonCode = e.event.button;\n                if (!that._isElement(target.closest('.' + SELECTABLE)) || whichCode && whichCode == 3 || buttonCode && buttonCode == 2) {\n                    return;\n                }\n                if (!this._allowSelection(e.event.target)) {\n                    return;\n                }\n                selected = target.hasClass(SELECTED);\n                if (!multiple || !ctrlKey) {\n                    that.clear();\n                }\n                target = target.add(that.relatedTarget(target));\n                if (shiftKey) {\n                    that.selectRange(that._firstSelectee(), target, e);\n                } else {\n                    if (selected && ctrlKey) {\n                        that._unselect(target);\n                        that._notify(CHANGE, e);\n                    } else {\n                        that.value(target, e);\n                    }\n                    that._lastActive = that._downTarget = target;\n                }\n            },\n            _start: function (e) {\n                var that = this, target = $(e.target), selected = target.hasClass(SELECTED), currentElement, ctrlKey = e.event.ctrlKey || e.event.metaKey;\n                if (!this._allowSelection(e.event.target)) {\n                    return;\n                }\n                that._downTarget = target;\n                if (!that._isElement(target.closest('.' + SELECTABLE))) {\n                    that.userEvents.cancel();\n                    return;\n                }\n                if (that.options.useAllItems) {\n                    that._items = that.element.find(that.options.filter);\n                } else {\n                    currentElement = target.closest(that.element);\n                    that._items = currentElement.find(that.options.filter);\n                }\n                e.sender.capture();\n                that._marquee.appendTo(document.body).css({\n                    left: e.x.client + 1,\n                    top: e.y.client + 1,\n                    width: 0,\n                    height: 0\n                });\n                if (!ctrlKey) {\n                    that.clear();\n                }\n                target = target.add(that.relatedTarget(target));\n                if (selected) {\n                    that._selectElement(target, true);\n                    if (ctrlKey) {\n                        target.addClass(UNSELECTING);\n                    }\n                }\n            },\n            _move: function (e) {\n                var that = this, position = {\n                        left: e.x.startLocation > e.x.location ? e.x.location : e.x.startLocation,\n                        top: e.y.startLocation > e.y.location ? e.y.location : e.y.startLocation,\n                        width: abs(e.x.initialDelta),\n                        height: abs(e.y.initialDelta)\n                    };\n                that._marquee.css(position);\n                that._invalidateSelectables(position, e.event.ctrlKey || e.event.metaKey);\n                e.preventDefault();\n            },\n            _end: function (e) {\n                var that = this;\n                that._marquee.remove();\n                that._unselect(that.element.find(that.options.filter + '.' + UNSELECTING)).removeClass(UNSELECTING);\n                var target = that.element.find(that.options.filter + '.' + ACTIVE);\n                target = target.add(that.relatedTarget(target));\n                that.value(target, e);\n                that._lastActive = that._downTarget;\n                that._items = null;\n            },\n            _invalidateSelectables: function (position, ctrlKey) {\n                var idx, length, target = this._downTarget[0], items = this._items, related, toSelect;\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    toSelect = items.eq(idx);\n                    related = toSelect.add(this.relatedTarget(toSelect));\n                    if (collision(toSelect, position)) {\n                        if (toSelect.hasClass(SELECTED)) {\n                            if (ctrlKey && target !== toSelect[0]) {\n                                related.removeClass(SELECTED).addClass(UNSELECTING);\n                            }\n                        } else if (!toSelect.hasClass(ACTIVE) && !toSelect.hasClass(UNSELECTING)) {\n                            related.addClass(ACTIVE);\n                        }\n                    } else {\n                        if (toSelect.hasClass(ACTIVE)) {\n                            related.removeClass(ACTIVE);\n                        } else if (ctrlKey && toSelect.hasClass(UNSELECTING)) {\n                            related.removeClass(UNSELECTING).addClass(SELECTED);\n                        }\n                    }\n                }\n            },\n            value: function (val, e) {\n                var that = this, selectElement = proxy(that._selectElement, that);\n                if (val) {\n                    val.each(function () {\n                        selectElement(this);\n                    });\n                    that._notify(CHANGE, e);\n                    return;\n                }\n                return that.element.find(that.options.filter + '.' + SELECTED);\n            },\n            _firstSelectee: function () {\n                var that = this, selected;\n                if (that._lastActive !== null) {\n                    return that._lastActive;\n                }\n                selected = that.value();\n                return selected.length > 0 ? selected[0] : that.element.find(that.options.filter)[0];\n            },\n            _selectElement: function (element, preventNotify) {\n                var toSelect = $(element), isPrevented = !preventNotify && this._notify('select', { element: element });\n                toSelect.removeClass(ACTIVE);\n                if (!isPrevented) {\n                    toSelect.addClass(SELECTED);\n                    if (this.options.aria) {\n                        toSelect.attr(ARIASELECTED, true);\n                    }\n                }\n            },\n            _notify: function (name, args) {\n                args = args || {};\n                return this.trigger(name, args);\n            },\n            _unselect: function (element) {\n                if (this.trigger(UNSELECT, { element: element })) {\n                    return;\n                }\n                element.removeClass(SELECTED);\n                if (this.options.aria) {\n                    element.attr(ARIASELECTED, false);\n                }\n                return element;\n            },\n            _select: function (e) {\n                if (this._allowSelection(e.event.target)) {\n                    if (!msie || msie && !$(kendo._activeElement()).is(this.options.inputSelectors)) {\n                        e.preventDefault();\n                    }\n                }\n            },\n            _allowSelection: function (target) {\n                if ($(target).is(this.options.inputSelectors)) {\n                    this.userEvents.cancel();\n                    this._downTarget = null;\n                    return false;\n                }\n                return true;\n            },\n            resetTouchEvents: function () {\n                this.userEvents.cancel();\n            },\n            clear: function () {\n                var items = this.element.find(this.options.filter + '.' + SELECTED);\n                this._unselect(items);\n            },\n            selectRange: function (start, end, e) {\n                var that = this, idx, tmp, items;\n                that.clear();\n                if (that.element.length > 1) {\n                    items = that.options.continuousItems();\n                }\n                if (!items || !items.length) {\n                    items = that.element.find(that.options.filter);\n                }\n                start = $.inArray($(start)[0], items);\n                end = $.inArray($(end)[0], items);\n                if (start > end) {\n                    tmp = start;\n                    start = end;\n                    end = tmp;\n                }\n                if (!that.options.useAllItems) {\n                    end += that.element.length - 1;\n                }\n                for (idx = start; idx <= end; idx++) {\n                    that._selectElement(items[idx]);\n                }\n                that._notify(CHANGE, e);\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.element.off(NS);\n                that.userEvents.destroy();\n                that._marquee = that._lastActive = that.element = that.userEvents = null;\n            }\n        });\n        Selectable.parseOptions = function (selectable) {\n            var asLowerString = typeof selectable === 'string' && selectable.toLowerCase();\n            return {\n                multiple: asLowerString && asLowerString.indexOf('multiple') > -1,\n                cell: asLowerString && asLowerString.indexOf('cell') > -1\n            };\n        };\n        function collision(element, position) {\n            if (!element.is(':visible')) {\n                return false;\n            }\n            var elementPosition = kendo.getOffset(element), right = position.left + position.width, bottom = position.top + position.height;\n            elementPosition.right = elementPosition.left + kendo._outerWidth(element);\n            elementPosition.bottom = elementPosition.top + kendo._outerHeight(element);\n            return !(elementPosition.left > right || elementPosition.right < position.left || elementPosition.top > bottom || elementPosition.bottom < position.top);\n        }\n        kendo.ui.plugin(Selectable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.calendar', [\n        'kendo.core',\n        'kendo.selectable'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'calendar',\n        name: 'Calendar',\n        category: 'web',\n        description: 'The Calendar widget renders a graphical calendar that supports navigation and selection.',\n        depends: [\n            'core',\n            'selectable'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, support = kendo.support, ui = kendo.ui, Widget = ui.Widget, keys = kendo.keys, parse = kendo.parseDate, adjustDST = kendo.date.adjustDST, weekInYear = kendo.date.weekInYear, Selectable = kendo.ui.Selectable, extractFormat = kendo._extractFormat, template = kendo.template, getCulture = kendo.getCulture, transitions = kendo.support.transitions, transitionOrigin = transitions ? transitions.css + 'transform-origin' : '', cellTemplate = template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link\" href=\"\\\\#\" data-#=data.ns#value=\"#=data.dateString#\">#=data.value#</a></td>', { useWithBlock: false }), emptyCellTemplate = template('<td role=\"gridcell\" class=\"k-out-of-range\"><a class=\"k-link\"></a></td>', { useWithBlock: false }), otherMonthCellTemplate = template('<td role=\"gridcell\" class=\"k-out-of-range\">&nbsp;</td>', { useWithBlock: false }), weekNumberTemplate = template('<td class=\"k-alt\">#= data.weekNumber #</td>', { useWithBlock: false }), browser = kendo.support.browser, isIE8 = browser.msie && browser.version < 9, outerWidth = kendo._outerWidth, ns = '.kendoCalendar', CLICK = 'click' + ns, KEYDOWN_NS = 'keydown' + ns, ID = 'id', MIN = 'min', LEFT = 'left', SLIDE = 'slideIn', MONTH = 'month', CENTURY = 'century', CHANGE = 'change', NAVIGATE = 'navigate', VALUE = 'value', HOVER = 'k-state-hover', DISABLED = 'k-state-disabled', FOCUSED = 'k-state-focused', OTHERMONTH = 'k-other-month', OTHERMONTHCLASS = ' class=\"' + OTHERMONTH + '\"', OUTOFRANGE = 'k-out-of-range', TODAY = 'k-nav-today', CELLSELECTOR = 'td:has(.k-link)', CELLSELECTORVALID = 'td:has(.k-link):not(.' + DISABLED + '):not(.' + OUTOFRANGE + ')', WEEKCOLUMNSELECTOR = 'td:not(:has(.k-link))', SELECTED = 'k-state-selected', BLUR = 'blur' + ns, FOCUS = 'focus', FOCUS_WITH_NS = FOCUS + ns, MOUSEENTER = support.touch ? 'touchstart' : 'mouseenter', MOUSEENTER_WITH_NS = support.touch ? 'touchstart' + ns : 'mouseenter' + ns, MOUSELEAVE = support.touch ? 'touchend' + ns + ' touchmove' + ns : 'mouseleave' + ns, MS_PER_MINUTE = 60000, MS_PER_DAY = 86400000, PREVARROW = '_prevArrow', NEXTARROW = '_nextArrow', ARIA_DISABLED = 'aria-disabled', ARIA_SELECTED = 'aria-selected', ARIA_LABEL = 'aria-label', proxy = $.proxy, extend = $.extend, DATE = Date, views = {\n                month: 0,\n                year: 1,\n                decade: 2,\n                century: 3\n            };\n        var Calendar = Widget.extend({\n            init: function (element, options) {\n                var that = this, value, id;\n                Widget.fn.init.call(that, element, options);\n                element = that.wrapper = that.element;\n                options = that.options;\n                options.url = window.unescape(options.url);\n                that.options.disableDates = getDisabledExpr(that.options.disableDates);\n                that._templates();\n                that._selectable();\n                that._header();\n                that._viewWrapper();\n                that._footer(that.footer);\n                id = element.addClass('k-widget k-calendar ' + (options.weekNumber ? ' k-week-number' : '')).on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE, CELLSELECTOR, mousetoggle).on(KEYDOWN_NS, 'table.k-content', proxy(that._move, that)).on(CLICK, CELLSELECTOR, function (e) {\n                    var link = e.currentTarget.firstChild, value = toDateObject(link);\n                    if (link.href.indexOf('#') != -1) {\n                        e.preventDefault();\n                    }\n                    if (that._view.name == 'month' && that.options.disableDates(value)) {\n                        return;\n                    }\n                    if (that._view.name != 'month' || options.selectable == 'single') {\n                        that._click($(link));\n                    }\n                }).on('mouseup' + ns, 'table.k-content, .k-footer', function () {\n                    that._focusView(that.options.focusOnNav !== false);\n                }).attr(ID);\n                if (id) {\n                    that._cellID = id + '_cell_selected';\n                }\n                if (that._isMultipleSelection() && that.options.weekNumber) {\n                    element.on(CLICK, WEEKCOLUMNSELECTOR, function (e) {\n                        var first = $(e.currentTarget).closest('tr').find(CELLSELECTORVALID).first(), last = that.selectable._lastActive = $(e.currentTarget).closest('tr').find(CELLSELECTORVALID).last();\n                        that.selectable.selectRange(first, last, { event: e });\n                        that._current = that._value = toDateObject(last.find('a'));\n                        that._class(FOCUSED, that._current);\n                    });\n                }\n                normalize(options);\n                value = parse(options.value, options.format, options.culture);\n                that._selectDates = [];\n                that._index = views[options.start];\n                that._current = new DATE(+restrictValue(value, options.min, options.max));\n                that._addClassProxy = function () {\n                    that._active = true;\n                    if (that._cell.hasClass(DISABLED)) {\n                        var todayString = that._view.toDateString(getToday());\n                        that._cell = that._cellByDate(todayString);\n                    }\n                    that._cell.addClass(FOCUSED);\n                };\n                that._removeClassProxy = function () {\n                    that._active = false;\n                    that._cell.removeClass(FOCUSED);\n                };\n                that.value(value);\n                if (that._isMultipleSelection() && options.selectDates.length > 0) {\n                    that.selectDates(options.selectDates);\n                }\n                kendo.notify(that);\n            },\n            options: {\n                name: 'Calendar',\n                value: null,\n                min: new DATE(1900, 0, 1),\n                max: new DATE(2099, 11, 31),\n                dates: [],\n                disableDates: null,\n                url: '',\n                culture: '',\n                footer: '',\n                format: '',\n                month: {},\n                weekNumber: false,\n                selectable: 'single',\n                selectDates: [],\n                start: MONTH,\n                depth: MONTH,\n                animation: {\n                    horizontal: {\n                        effects: SLIDE,\n                        reverse: true,\n                        duration: 500,\n                        divisor: 2\n                    },\n                    vertical: {\n                        effects: 'zoomIn',\n                        duration: 400\n                    }\n                },\n                messages: { weekColumnHeader: '' }\n            },\n            events: [\n                CHANGE,\n                NAVIGATE\n            ],\n            setOptions: function (options) {\n                var that = this;\n                normalize(options);\n                options.disableDates = getDisabledExpr(options.disableDates);\n                Widget.fn.setOptions.call(that, options);\n                that._templates();\n                that._selectable();\n                that._viewWrapper();\n                that._footer(that.footer);\n                that._index = views[that.options.start];\n                that.navigate();\n                if (options.weekNumber) {\n                    that.element.addClass('k-week-number');\n                }\n            },\n            destroy: function () {\n                var that = this, today = that._today;\n                that.element.off(ns);\n                that._title.off(ns);\n                that[PREVARROW].off(ns);\n                that[NEXTARROW].off(ns);\n                that._destroySelectable();\n                kendo.destroy(that._table);\n                if (today) {\n                    kendo.destroy(today.off(ns));\n                }\n                Widget.fn.destroy.call(that);\n            },\n            current: function () {\n                return this._current;\n            },\n            view: function () {\n                return this._view;\n            },\n            focus: function (table) {\n                table = table || this._table;\n                this._bindTable(table);\n                table.trigger('focus');\n            },\n            min: function (value) {\n                return this._option(MIN, value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            navigateToPast: function () {\n                this._navigate(PREVARROW, -1);\n            },\n            navigateToFuture: function () {\n                this._navigate(NEXTARROW, 1);\n            },\n            navigateUp: function () {\n                var that = this, index = that._index;\n                if (that._title.hasClass(DISABLED)) {\n                    return;\n                }\n                that.navigate(that._current, ++index);\n            },\n            navigateDown: function (value) {\n                var that = this, index = that._index, depth = that.options.depth;\n                if (!value) {\n                    return;\n                }\n                if (index === views[depth]) {\n                    if (!isEqualDate(that._value, that._current) || !isEqualDate(that._value, value)) {\n                        that.value(value);\n                        that.trigger(CHANGE);\n                    }\n                    return;\n                }\n                that.navigate(value, --index);\n            },\n            navigate: function (value, view) {\n                view = isNaN(view) ? views[view] : view;\n                var that = this, options = that.options, culture = options.culture, min = options.min, max = options.max, title = that._title, from = that._table, old = that._oldTable, currentValue = that._current, future = value && +value > +currentValue, vertical = view !== undefined && view !== that._index, to, currentView, compare, disabled;\n                if (!value) {\n                    value = currentValue;\n                }\n                that._current = value = new DATE(+restrictValue(value, min, max));\n                if (view === undefined) {\n                    view = that._index;\n                } else {\n                    that._index = view;\n                }\n                that._view = currentView = calendar.views[view];\n                compare = currentView.compare;\n                disabled = view === views[CENTURY];\n                title.toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                disabled = compare(value, min) < 1;\n                that[PREVARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                if (that[PREVARROW].hasClass(DISABLED)) {\n                    that[PREVARROW].removeClass(HOVER);\n                }\n                disabled = compare(value, max) > -1;\n                that[NEXTARROW].toggleClass(DISABLED, disabled).attr(ARIA_DISABLED, disabled);\n                if (that[NEXTARROW].hasClass(DISABLED)) {\n                    that[NEXTARROW].removeClass(HOVER);\n                }\n                if (from && old && old.data('animating')) {\n                    old.kendoStop(true, true);\n                    from.kendoStop(true, true);\n                }\n                that._oldTable = from;\n                if (!from || that._changeView) {\n                    title.html(currentView.title(value, min, max, culture));\n                    that._table = to = $(currentView.content(extend({\n                        min: min,\n                        max: max,\n                        date: value,\n                        url: options.url,\n                        dates: options.dates,\n                        format: options.format,\n                        otherMonth: true,\n                        culture: culture,\n                        disableDates: options.disableDates,\n                        isWeekColumnVisible: options.weekNumber,\n                        messages: options.messages\n                    }, that[currentView.name])));\n                    addClassToViewContainer(to, currentView.name);\n                    makeUnselectable(to);\n                    var replace = from && from.data('start') === to.data('start');\n                    that._animate({\n                        from: from,\n                        to: to,\n                        vertical: vertical,\n                        future: future,\n                        replace: replace\n                    });\n                    that.trigger(NAVIGATE);\n                    that._focus(value);\n                }\n                if (view === views[options.depth] && that._selectDates.length > 0) {\n                    that._visualizeSelectedDatesInView();\n                }\n                if (that.options.selectable === 'single') {\n                    if (view === views[options.depth] && that._value && !that.options.disableDates(that._value)) {\n                        that._class('k-state-selected', that._value);\n                    }\n                }\n                that._class(FOCUSED, value);\n                if (!from && that._cell) {\n                    that._cell.removeClass(FOCUSED);\n                }\n                that._changeView = true;\n            },\n            selectDates: function (dates) {\n                var that = this, validSelectedDates, datesUnique;\n                if (dates === undefined) {\n                    return that._selectDates;\n                }\n                datesUnique = dates.map(function (date) {\n                    return date.getTime();\n                }).filter(function (date, position, array) {\n                    return array.indexOf(date) === position;\n                }).map(function (time) {\n                    return new Date(time);\n                });\n                validSelectedDates = $.grep(datesUnique, function (value) {\n                    if (value) {\n                        return +that._validateValue(new Date(value.setHours(0, 0, 0, 0))) === +value;\n                    }\n                });\n                that._selectDates = validSelectedDates.length > 0 ? validSelectedDates : datesUnique.length === 0 ? datesUnique : that._selectDates;\n                that._visualizeSelectedDatesInView();\n            },\n            value: function (value) {\n                var that = this, old = that._view, view = that._view;\n                if (value === undefined) {\n                    return that._value;\n                }\n                value = that._validateValue(value);\n                if (value && that._isMultipleSelection()) {\n                    var date = new Date(+value);\n                    date.setHours(0, 0, 0, 0);\n                    that._selectDates = [date];\n                    that.selectable._lastActive = null;\n                }\n                if (old && value === null && that._cell) {\n                    that._cell.removeClass(SELECTED);\n                } else {\n                    that._changeView = !value || view && view.compare(value, that._current) !== 0;\n                    that.navigate(value);\n                }\n            },\n            _validateValue: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max;\n                if (value === null) {\n                    that._current = createDate(that._current.getFullYear(), that._current.getMonth(), that._current.getDate());\n                }\n                value = parse(value, options.format, options.culture);\n                if (value !== null) {\n                    value = new DATE(+value);\n                    if (!isInRange(value, min, max)) {\n                        value = null;\n                    }\n                }\n                if (value === null || !that.options.disableDates(new Date(+value))) {\n                    that._value = value;\n                } else if (that._value === undefined) {\n                    that._value = null;\n                }\n                return that._value;\n            },\n            _visualizeSelectedDatesInView: function () {\n                var that = this;\n                var selectedDates = {};\n                $.each(that._selectDates, function (index, value) {\n                    selectedDates[kendo.calendar.views[0].toDateString(value)] = value;\n                });\n                that.selectable.clear();\n                var cells = that._table.find(CELLSELECTOR).filter(function (index, element) {\n                    return selectedDates[$(element.firstChild).attr(kendo.attr(VALUE))];\n                });\n                if (cells.length > 0) {\n                    that.selectable._selectElement(cells, true);\n                }\n            },\n            _isMultipleSelection: function () {\n                var that = this;\n                return that.options.selectable === 'multiple';\n            },\n            _selectable: function () {\n                var that = this;\n                if (!that._isMultipleSelection()) {\n                    return;\n                }\n                var selectable = that.options.selectable, selectableOptions = Selectable.parseOptions(selectable);\n                if (selectableOptions.multiple) {\n                    that.element.attr('aria-multiselectable', 'true');\n                }\n                that.selectable = new Selectable(that.wrapper, {\n                    aria: true,\n                    inputSelectors: 'input,textarea,.k-multiselect-wrap,select,button,.k-button>span,.k-button>img,span.k-icon.k-i-arrow-60-down,span.k-icon.k-i-arrow-60-up',\n                    multiple: selectableOptions.multiple,\n                    filter: 'table.k-month:eq(0) ' + CELLSELECTORVALID,\n                    change: proxy(that._onSelect, that),\n                    relatedTarget: proxy(that._onRelatedTarget, that)\n                });\n            },\n            _onRelatedTarget: function (target) {\n                var that = this;\n                if (that.selectable.options.multiple && target.is(CELLSELECTORVALID)) {\n                    that._current = toDateObject(target.find('a'));\n                    that._class(FOCUSED, toDateObject(target.find('a')));\n                }\n            },\n            _onSelect: function (e) {\n                var that = this, eventArgs = e, selectableOptions = Selectable.parseOptions(that.options.selectable);\n                if (!selectableOptions.multiple) {\n                    if ($(eventArgs.event.currentTarget).is('td') && !$(eventArgs.event.currentTarget).hasClass('k-state-selected')) {\n                        $(eventArgs.event.currentTarget).addClass('k-state-selected');\n                    } else {\n                        that._click($(eventArgs.event.currentTarget).find('a'));\n                    }\n                    return;\n                }\n                if (eventArgs.event.ctrlKey || eventArgs.event.metaKey) {\n                    if ($(eventArgs.event.currentTarget).is(CELLSELECTORVALID)) {\n                        that._toggleSelection($(eventArgs.event.currentTarget));\n                    } else {\n                        that._cellsBySelector(CELLSELECTORVALID).each(function (index, element) {\n                            var value = toDateObject($(element).find('a'));\n                            that._deselect(value);\n                        });\n                        that._addSelectedCellsToArray();\n                    }\n                } else if (eventArgs.event.shiftKey) {\n                    that._rangeSelection(that._cell);\n                } else if ($(eventArgs.event.currentTarget).is(CELLSELECTOR)) {\n                    that.value(toDateObject($(eventArgs.event.currentTarget).find('a')));\n                } else {\n                    that._selectDates = [];\n                    that._addSelectedCellsToArray();\n                }\n                that.trigger(CHANGE);\n            },\n            _destroySelectable: function () {\n                var that = this;\n                if (that.selectable) {\n                    that.selectable.destroy();\n                    that.selectable = null;\n                }\n            },\n            _toggleSelection: function (currentCell) {\n                var that = this, date = toDateObject(currentCell.find('a'));\n                if (currentCell.hasClass('k-state-selected')) {\n                    that._selectDates.push(date);\n                } else {\n                    that._deselect(date);\n                }\n            },\n            _rangeSelection: function (toDateCell, startDate) {\n                var that = this, fromDate = startDate || toDateObject(that.selectable.value().first().find('a')), toDate = toDateObject(toDateCell.find('a')), daysDifference;\n                if (that.selectable._lastActive || that._value) {\n                    fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find('a')) : new Date(+that._value);\n                } else {\n                    that.selectable._lastActive = startDate ? that._cellByDate(that._view.toDateString(startDate), CELLSELECTORVALID) : that.selectable.value().first();\n                }\n                that._selectDates = [];\n                daysDifference = daysBetweenTwoDates(fromDate, toDate);\n                addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n                that._visualizeSelectedDatesInView();\n            },\n            _cellsBySelector: function (selector) {\n                var that = this;\n                return that._table.find(selector);\n            },\n            _addSelectedCellsToArray: function () {\n                var that = this;\n                that.selectable.value().each(function (index, item) {\n                    var date = toDateObject($(item.firstChild));\n                    if (!that.options.disableDates(date)) {\n                        that._selectDates.push(date);\n                    }\n                });\n            },\n            _deselect: function (date) {\n                var that = this;\n                var currentDateIndex = that._selectDates.map(Number).indexOf(+date);\n                if (currentDateIndex != -1) {\n                    that._selectDates.splice(currentDateIndex, 1);\n                }\n            },\n            _dateInView: function (date) {\n                var that = this, firstDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID + ':first').find('a')), lastDateInView = toDateObject(that._cellsBySelector(CELLSELECTORVALID + ':last').find('a'));\n                return +date <= +lastDateInView && +date >= +firstDateInView;\n            },\n            _isNavigatable: function (currentValue, cellIndex) {\n                var that = this;\n                var isDisabled = that.options.disableDates;\n                var cell;\n                var index;\n                if (that._view.name == 'month') {\n                    return !isDisabled(currentValue);\n                } else {\n                    index = that.wrapper.find('.' + FOCUSED).index();\n                    cell = that.wrapper.find('.k-content td:eq(' + (index + cellIndex) + ')');\n                    return cell.is(CELLSELECTORVALID) || !isDisabled(currentValue);\n                }\n            },\n            _move: function (e) {\n                var that = this, options = that.options, key = e.keyCode, view = that._view, index = that._index, min = that.options.min, max = that.options.max, currentValue = new DATE(+that._current), isRtl = kendo.support.isRtl(that.wrapper), isDisabled = that.options.disableDates, value, prevent, method, temp;\n                if (e.target === that._table[0]) {\n                    that._active = true;\n                }\n                if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n                    value = 1;\n                    prevent = true;\n                } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n                    value = -1;\n                    prevent = true;\n                } else if (key == keys.UP) {\n                    value = index === 0 ? -7 : -4;\n                    prevent = true;\n                } else if (key == keys.DOWN) {\n                    value = index === 0 ? 7 : 4;\n                    prevent = true;\n                } else if (key == keys.SPACEBAR) {\n                    value = 0;\n                    prevent = true;\n                } else if (key == keys.HOME || key == keys.END) {\n                    method = key == keys.HOME ? 'first' : 'last';\n                    temp = view[method](currentValue);\n                    currentValue = new DATE(temp.getFullYear(), temp.getMonth(), temp.getDate(), currentValue.getHours(), currentValue.getMinutes(), currentValue.getSeconds(), currentValue.getMilliseconds());\n                    currentValue.setFullYear(temp.getFullYear());\n                    prevent = true;\n                }\n                if (e.ctrlKey || e.metaKey) {\n                    if (key == keys.RIGHT && !isRtl || key == keys.LEFT && isRtl) {\n                        that.navigateToFuture();\n                        prevent = true;\n                    } else if (key == keys.LEFT && !isRtl || key == keys.RIGHT && isRtl) {\n                        that.navigateToPast();\n                        prevent = true;\n                    } else if (key == keys.UP) {\n                        that.navigateUp();\n                        prevent = true;\n                    } else if (key == keys.DOWN) {\n                        that._click($(that._cell[0].firstChild));\n                        prevent = true;\n                    } else if ((key == keys.ENTER || key == keys.SPACEBAR) && that._isMultipleSelection()) {\n                        that._keyboardToggleSelection(e);\n                        var focusedDate = toDateObject($(that._cell[0]).find('a'));\n                        that._class(FOCUSED, focusedDate);\n                    }\n                } else if (e.shiftKey) {\n                    if (value !== undefined || method) {\n                        if (!method) {\n                            view.setDate(currentValue, value);\n                        }\n                        if (!isInRange(currentValue, min, max)) {\n                            currentValue = restrictValue(currentValue, options.min, options.max);\n                        }\n                        if (isDisabled(currentValue)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n                        if (that._isMultipleSelection()) {\n                            that._keyboardRangeSelection(e, currentValue);\n                        } else {\n                            that._focus(currentValue);\n                        }\n                    }\n                } else {\n                    if (key == keys.ENTER || key == keys.SPACEBAR) {\n                        if (view.name == 'month' && that._isMultipleSelection()) {\n                            that.value(toDateObject($(that._cell.find('a'))));\n                            that.selectable._lastActive = $(that._cell[0]);\n                            that.trigger(CHANGE);\n                        } else {\n                            that._click($(that._cell[0].firstChild));\n                        }\n                        prevent = true;\n                    } else if (key == keys.PAGEUP) {\n                        prevent = true;\n                        that.navigateToPast();\n                    } else if (key == keys.PAGEDOWN) {\n                        prevent = true;\n                        that.navigateToFuture();\n                    }\n                    if (value || method) {\n                        if (!method) {\n                            view.setDate(currentValue, value);\n                        }\n                        min = createDate(min.getFullYear(), min.getMonth(), min.getDate());\n                        if (!isInRange(currentValue, min, max)) {\n                            currentValue = restrictValue(currentValue, options.min, options.max);\n                        }\n                        if (!that._isNavigatable(currentValue, value)) {\n                            currentValue = that._nextNavigatable(currentValue, value);\n                        }\n                        if (that._isMultipleSelection()) {\n                            if (!that._dateInView(currentValue)) {\n                                that.navigate(currentValue);\n                            } else {\n                                that._current = currentValue;\n                                that._class(FOCUSED, currentValue);\n                            }\n                        } else {\n                            that._focus(currentValue);\n                        }\n                    }\n                }\n                if (prevent) {\n                    e.preventDefault();\n                }\n                return that._current;\n            },\n            _keyboardRangeSelection: function (event, currentValue) {\n                var that = this, fromDate, daysDifference;\n                if (!that._dateInView(currentValue)) {\n                    that._selectDates = [];\n                    fromDate = that.selectable._lastActive ? toDateObject(that.selectable._lastActive.find('a')) : currentValue;\n                    daysDifference = daysBetweenTwoDates(fromDate, new Date(+currentValue));\n                    addDaysToArray(that._selectDates, daysDifference, fromDate, that.options.disableDates);\n                    that.navigate(currentValue);\n                    that._current = currentValue;\n                    that.selectable._lastActive = that.selectable._lastActive || that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID);\n                    that.trigger(CHANGE);\n                    return;\n                }\n                that.selectable.options.filter = that.wrapper.find('table').length > 1 && +currentValue > +that._current ? 'table.k-month:eq(1) ' + CELLSELECTORVALID : 'table.k-month:eq(0) ' + CELLSELECTORVALID;\n                that._class(FOCUSED, currentValue);\n                that._current = currentValue;\n                that._rangeSelection(that._cellByDate(that._view.toDateString(currentValue), CELLSELECTORVALID), currentValue);\n                that.trigger(CHANGE);\n                that.selectable.options.filter = 'table.k-month:eq(0) ' + CELLSELECTORVALID;\n            },\n            _keyboardToggleSelection: function (event) {\n                var that = this;\n                event.currentTarget = that._cell[0];\n                that.selectable._lastActive = $(that._cell[0]);\n                if ($(that._cell[0]).hasClass(SELECTED)) {\n                    that.selectable._unselect($(that._cell[0]));\n                    that.selectable.trigger(CHANGE, { event: event });\n                } else {\n                    that.selectable.value($(that._cell[0]), { event: event });\n                }\n            },\n            _nextNavigatable: function (currentValue, value) {\n                var that = this, disabled = true, view = that._view, min = that.options.min, max = that.options.max, isDisabled = that.options.disableDates, navigatableDate = new Date(currentValue.getTime());\n                view.setDate(navigatableDate, -value);\n                while (disabled) {\n                    view.setDate(currentValue, value);\n                    if (!isInRange(currentValue, min, max)) {\n                        currentValue = navigatableDate;\n                        break;\n                    }\n                    disabled = isDisabled(currentValue);\n                }\n                return currentValue;\n            },\n            _animate: function (options) {\n                var that = this;\n                var from = options.from;\n                var to = options.to;\n                var active = that._active;\n                var viewWrapper = that.element.children('.k-calendar-view');\n                if (!from) {\n                    viewWrapper.append(to);\n                    that._bindTable(to);\n                } else if (from.parent().data('animating')) {\n                    from.off(ns);\n                    from.parent().kendoStop(true, true).remove();\n                    from.remove();\n                    viewWrapper.append(to);\n                    that._focusView(active);\n                } else if (!from.is(':visible') || that.options.animation === false || options.replace) {\n                    to.insertAfter(from);\n                    from.off(ns).remove();\n                    that._focusView(active);\n                } else {\n                    that[options.vertical ? '_vertical' : '_horizontal'](from, to, options.future);\n                }\n            },\n            _horizontal: function (from, to, future) {\n                var that = this, active = that._active, horizontal = that.options.animation.horizontal, effects = horizontal.effects, viewWidth = outerWidth(from);\n                if (effects && effects.indexOf(SLIDE) != -1) {\n                    from.add(to).css({ width: viewWidth });\n                    from.wrap('<div/>');\n                    that._focusView(active, from);\n                    from.parent().css({\n                        position: 'relative',\n                        width: viewWidth * 2,\n                        'float': LEFT,\n                        'margin-left': future ? 0 : -viewWidth\n                    });\n                    to[future ? 'insertAfter' : 'insertBefore'](from);\n                    extend(horizontal, {\n                        effects: SLIDE + ':' + (future ? 'right' : LEFT),\n                        complete: function () {\n                            from.off(ns).remove();\n                            that._oldTable = null;\n                            to.unwrap();\n                            that._focusView(active);\n                        }\n                    });\n                    from.parent().kendoStop(true, true).kendoAnimate(horizontal);\n                }\n            },\n            _vertical: function (from, to) {\n                var that = this, vertical = that.options.animation.vertical, effects = vertical.effects, active = that._active, cell, position;\n                if (effects && effects.indexOf('zoom') != -1) {\n                    to.insertBefore(from);\n                    from.css({\n                        position: 'absolute',\n                        width: to.width()\n                    });\n                    if (transitionOrigin) {\n                        cell = that._cellByDate(that._view.toDateString(that._current));\n                        position = cell.position();\n                        position = position.left + parseInt(cell.width() / 2, 10) + 'px' + ' ' + (position.top + parseInt(cell.height() / 2, 10) + 'px');\n                        to.css(transitionOrigin, position);\n                    }\n                    from.kendoStop(true, true).kendoAnimate({\n                        effects: 'fadeOut',\n                        duration: 600,\n                        complete: function () {\n                            from.off(ns).remove();\n                            that._oldTable = null;\n                            that._focusView(active);\n                        }\n                    });\n                    to.kendoStop(true, true).kendoAnimate(vertical);\n                }\n            },\n            _cellByDate: function (value, selector) {\n                return this._table.find(selector ? selector : 'td:not(.' + OTHERMONTH + ')').filter(function () {\n                    return $(this.firstChild).attr(kendo.attr(VALUE)) === value;\n                });\n            },\n            _class: function (className, date) {\n                var that = this, id = that._cellID, cell = that._cell, value = that._view.toDateString(date), disabledDate;\n                if (cell && cell.length) {\n                    cell[0].removeAttribute(ARIA_SELECTED);\n                    cell[0].removeAttribute(ARIA_LABEL);\n                    cell[0].removeAttribute(ID);\n                }\n                if (date && that._view.name == 'month') {\n                    disabledDate = that.options.disableDates(date);\n                }\n                that._cellsBySelector(that._isMultipleSelection() ? CELLSELECTOR : 'td:not(.' + OTHERMONTH + ')').removeClass(className);\n                cell = that._cellByDate(value, that.options.selectable == 'multiple' ? CELLSELECTOR : 'td:not(.' + OTHERMONTH + ')').attr(ARIA_SELECTED, true);\n                if (className === FOCUSED && !that._active && that.options.focusOnNav !== false || disabledDate) {\n                    className = '';\n                }\n                cell.addClass(className);\n                if (cell[0]) {\n                    that._cell = cell;\n                }\n                if (id) {\n                    cell.attr(ID, id);\n                    that._table[0].removeAttribute('aria-activedescendant');\n                    that._table.attr('aria-activedescendant', id);\n                }\n            },\n            _bindTable: function (table) {\n                table.on(FOCUS_WITH_NS, this._addClassProxy).on(BLUR, this._removeClassProxy);\n            },\n            _click: function (link) {\n                var that = this, options = that.options, currentValue = new Date(+that._current), value = toDateObject(link);\n                adjustDST(value, 0);\n                if (that._view.name == 'month' && that.options.disableDates(value)) {\n                    value = that._value;\n                }\n                that._view.setDate(currentValue, value);\n                that.navigateDown(restrictValue(currentValue, options.min, options.max));\n            },\n            _focus: function (value) {\n                var that = this, view = that._view;\n                if (view.compare(value, that._current) !== 0) {\n                    that.navigate(value);\n                } else {\n                    that._current = value;\n                    that._class(FOCUSED, value);\n                }\n            },\n            _focusView: function (active, table) {\n                if (active) {\n                    this.focus(table);\n                }\n            },\n            _viewWrapper: function () {\n                var that = this;\n                var element = that.element;\n                var viewWrapper = element.children('.k-calendar-view');\n                if (!viewWrapper[0]) {\n                    viewWrapper = $('<div class=\\'k-calendar-view\\' />').insertAfter(element.find('.k-header'));\n                }\n            },\n            _footer: function (template) {\n                var that = this, today = getToday(), element = that.element, footer = element.find('.k-footer');\n                if (!template) {\n                    that._toggle(false);\n                    footer.hide();\n                    return;\n                }\n                if (!footer[0]) {\n                    footer = $('<div class=\"k-footer\"><a href=\"#\" class=\"k-link k-nav-today\"></a></div>').appendTo(element);\n                }\n                that._today = footer.show().find('.k-link').html(template(today)).attr('title', kendo.toString(today, 'D', that.options.culture));\n                that._toggle();\n            },\n            _header: function () {\n                var that = this, element = that.element, links;\n                if (!element.find('.k-header')[0]) {\n                    element.html('<div class=\"k-header\">' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-prev\" ' + ARIA_LABEL + '=\"Previous\"><span class=\"k-icon k-i-arrow-60-left\"></span></a>' + '<a href=\"#\" role=\"button\" aria-live=\"assertive\" aria-atomic=\"true\" class=\"k-link k-nav-fast\"></a>' + '<a href=\"#\" role=\"button\" class=\"k-link k-nav-next\" ' + ARIA_LABEL + '=\"Next\"><span class=\"k-icon k-i-arrow-60-right\"></span></a>' + '</div>');\n                }\n                links = element.find('.k-link').on(MOUSEENTER_WITH_NS + ' ' + MOUSELEAVE + ' ' + FOCUS_WITH_NS + ' ' + BLUR, mousetoggle).on('click', function () {\n                    return false;\n                });\n                that._title = links.eq(1).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateUp();\n                });\n                that[PREVARROW] = links.eq(0).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToPast();\n                });\n                that[NEXTARROW] = links.eq(2).on(CLICK, function () {\n                    that._active = that.options.focusOnNav !== false;\n                    that.navigateToFuture();\n                });\n            },\n            _navigate: function (arrow, modifier) {\n                var that = this, index = that._index + 1, currentValue = new DATE(+that._current);\n                if (that._isMultipleSelection()) {\n                    var firstDayCurrentMonth = that._table.find('td:not(.k-other-month):not(.k-out-of-range)').has('.k-link').first();\n                    currentValue = toDateObject(firstDayCurrentMonth.find('a'));\n                    that._current = new Date(+currentValue);\n                }\n                arrow = that[arrow];\n                if (!arrow.hasClass(DISABLED)) {\n                    if (index > 3) {\n                        currentValue.setFullYear(currentValue.getFullYear() + 100 * modifier);\n                    } else {\n                        calendar.views[index].setDate(currentValue, modifier);\n                    }\n                    that.navigate(currentValue);\n                }\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options, currentValue = that._value || that._current, isBigger;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.format, options.culture);\n                if (!value) {\n                    return;\n                }\n                options[option] = new DATE(+value);\n                if (option === MIN) {\n                    isBigger = value > currentValue;\n                } else {\n                    isBigger = currentValue > value;\n                }\n                if (isBigger || isEqualMonth(currentValue, value)) {\n                    if (isBigger) {\n                        that._value = null;\n                    }\n                    that._changeView = true;\n                }\n                if (!that._changeView) {\n                    that._changeView = !!(options.month.content || options.month.empty);\n                }\n                that.navigate(that._value);\n                that._toggle();\n            },\n            _toggle: function (toggle) {\n                var that = this, options = that.options, isTodayDisabled = that.options.disableDates(getToday()), link = that._today;\n                if (toggle === undefined) {\n                    toggle = isInRange(getToday(), options.min, options.max);\n                }\n                if (link) {\n                    link.off(CLICK);\n                    if (toggle && !isTodayDisabled) {\n                        link.addClass(TODAY).removeClass(DISABLED).on(CLICK, proxy(that._todayClick, that));\n                    } else {\n                        link.removeClass(TODAY).addClass(DISABLED).on(CLICK, prevent);\n                    }\n                }\n            },\n            _todayClick: function (e) {\n                var that = this, depth = views[that.options.depth], disabled = that.options.disableDates, today = getToday();\n                e.preventDefault();\n                if (disabled(today)) {\n                    return;\n                }\n                if (that._view.compare(that._current, today) === 0 && that._index == depth) {\n                    that._changeView = false;\n                }\n                if (that._isMultipleSelection()) {\n                    that._selectDates = [today];\n                    that.selectable._lastActive = null;\n                }\n                that._value = today;\n                that.navigate(today, depth);\n                that.trigger(CHANGE);\n            },\n            _templates: function () {\n                var that = this, options = that.options, footer = options.footer, month = options.month, content = month.content, weekNumber = month.weekNumber, empty = month.empty, footerTemplate = '#= kendo.toString(data,\"D\",\"' + options.culture + '\") #';\n                that.month = {\n                    content: template('<td#=data.cssClass# role=\"gridcell\"><a tabindex=\"-1\" class=\"k-link#=data.linkClass#\" href=\"#=data.url#\" ' + kendo.attr(VALUE) + '=\"#=data.dateString#\" title=\"#=data.title#\">' + (content || '#=data.value#') + '</a></td>', { useWithBlock: !!content }),\n                    empty: template('<td role=\"gridcell\">' + (empty || '&nbsp;') + '</td>', { useWithBlock: !!empty }),\n                    weekNumber: template('<td class=\"k-alt\">' + (weekNumber || '#= data.weekNumber #') + '</td>', { useWithBlock: !!weekNumber })\n                };\n                if (footer && footer !== true) {\n                    footerTemplate = footer;\n                }\n                that.footer = footer !== false ? template(footerTemplate, { useWithBlock: false }) : null;\n            }\n        });\n        ui.plugin(Calendar);\n        var calendar = {\n            firstDayOfMonth: function (date) {\n                return createDate(date.getFullYear(), date.getMonth(), 1);\n            },\n            firstVisibleDay: function (date, calendarInfo) {\n                calendarInfo = calendarInfo || kendo.culture().calendar;\n                var firstDay = calendarInfo.firstDay, firstVisibleDay = new DATE(date.getFullYear(), date.getMonth(), 1, date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                firstVisibleDay.setFullYear(date.getFullYear());\n                while (firstVisibleDay.getDay() != firstDay) {\n                    calendar.setTime(firstVisibleDay, -1 * MS_PER_DAY);\n                }\n                return firstVisibleDay;\n            },\n            setTime: function (date, time) {\n                var tzOffsetBefore = date.getTimezoneOffset(), resultDATE = new DATE(date.getTime() + time), tzOffsetDiff = resultDATE.getTimezoneOffset() - tzOffsetBefore;\n                date.setTime(resultDATE.getTime() + tzOffsetDiff * MS_PER_MINUTE);\n            },\n            views: [\n                {\n                    name: MONTH,\n                    title: function (date, min, max, culture) {\n                        return getCalendarInfo(culture).months.names[date.getMonth()] + ' ' + date.getFullYear();\n                    },\n                    content: function (options) {\n                        var that = this, idx = 0, min = options.min, max = options.max, date = options.date, dates = options.dates, format = options.format, culture = options.culture, navigateUrl = options.url, showHeader = options.showHeader, otherMonth = options.otherMonth, isWeekColumnVisible = options.isWeekColumnVisible, hasUrl = navigateUrl && dates[0], currentCalendar = getCalendarInfo(culture), firstDayIdx = currentCalendar.firstDay, days = currentCalendar.days, names = shiftArray(days.names, firstDayIdx), shortNames = shiftArray(days.namesShort, firstDayIdx), start = calendar.firstVisibleDay(date, currentCalendar), firstDayOfMonth = that.first(date), lastDayOfMonth = that.last(date), toDateString = that.toDateString, today = getToday(), html = '<table tabindex=\"0\" role=\"grid\" class=\"k-content\" cellspacing=\"0\" data-start=\"' + toDateString(start) + '\">';\n                        if (showHeader) {\n                            html += '<caption class=\"k-month-header\">' + this.title(date, min, max, culture) + '</caption><thead><tr role=\"row\">';\n                        } else {\n                            html += '<thead><tr role=\"row\">';\n                        }\n                        if (isWeekColumnVisible) {\n                            html += '<th scope=\"col\" class=\"k-alt\">' + options.messages.weekColumnHeader + '</th>';\n                        }\n                        for (; idx < 7; idx++) {\n                            html += '<th scope=\"col\" title=\"' + names[idx] + '\">' + shortNames[idx] + '</th>';\n                        }\n                        adjustDST(today, 0);\n                        today = +today;\n                        return view({\n                            cells: 42,\n                            perRow: 7,\n                            html: html += '</tr></thead><tbody><tr role=\"row\">',\n                            start: start,\n                            isWeekColumnVisible: isWeekColumnVisible,\n                            weekNumber: options.weekNumber,\n                            min: createDate(min.getFullYear(), min.getMonth(), min.getDate()),\n                            max: createDate(max.getFullYear(), max.getMonth(), max.getDate()),\n                            otherMonth: otherMonth,\n                            content: options.content,\n                            lastDayOfMonth: lastDayOfMonth,\n                            empty: options.empty,\n                            setter: that.setDate,\n                            disableDates: options.disableDates,\n                            build: function (date, idx, disableDates) {\n                                var cssClass = [], day = date.getDay(), linkClass = '', url = '#';\n                                if (date < firstDayOfMonth || date > lastDayOfMonth) {\n                                    cssClass.push(OTHERMONTH);\n                                }\n                                if (disableDates(date)) {\n                                    cssClass.push(DISABLED);\n                                }\n                                if (+date === today) {\n                                    cssClass.push('k-today');\n                                }\n                                if (day === 0 || day === 6) {\n                                    cssClass.push('k-weekend');\n                                }\n                                if (hasUrl && inArray(+date, dates)) {\n                                    url = navigateUrl.replace('{0}', kendo.toString(date, format, culture));\n                                    linkClass = ' k-action-link';\n                                }\n                                return {\n                                    date: date,\n                                    dates: dates,\n                                    ns: kendo.ns,\n                                    title: kendo.toString(date, 'D', culture),\n                                    value: date.getDate(),\n                                    dateString: toDateString(date),\n                                    cssClass: cssClass[0] ? ' class=\"' + cssClass.join(' ') + '\"' : '',\n                                    linkClass: linkClass,\n                                    url: url\n                                };\n                            },\n                            weekNumberBuild: function (date) {\n                                return {\n                                    weekNumber: weekInYear(date, kendo.culture().calendar.firstDay),\n                                    currentDate: date\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        return calendar.firstDayOfMonth(date);\n                    },\n                    last: function (date) {\n                        var last = createDate(date.getFullYear(), date.getMonth() + 1, 0), first = calendar.firstDayOfMonth(date), timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n                        if (timeOffset) {\n                            last.setHours(first.getHours() + timeOffset / 60);\n                        }\n                        return last;\n                    },\n                    compare: function (date1, date2) {\n                        var result, month1 = date1.getMonth(), year1 = date1.getFullYear(), month2 = date2.getMonth(), year2 = date2.getFullYear();\n                        if (year1 > year2) {\n                            result = 1;\n                        } else if (year1 < year2) {\n                            result = -1;\n                        } else {\n                            result = month1 == month2 ? 0 : month1 > month2 ? 1 : -1;\n                        }\n                        return result;\n                    },\n                    setDate: function (date, value) {\n                        var hours = date.getHours();\n                        if (value instanceof DATE) {\n                            date.setFullYear(value.getFullYear(), value.getMonth(), value.getDate());\n                        } else {\n                            calendar.setTime(date, value * MS_PER_DAY);\n                        }\n                        adjustDST(date, hours);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/' + date.getMonth() + '/' + date.getDate();\n                    }\n                },\n                {\n                    name: 'year',\n                    title: function (date) {\n                        return date.getFullYear();\n                    },\n                    content: function (options) {\n                        var namesAbbr = getCalendarInfo(options.culture).months.namesAbbr, toDateString = this.toDateString, min = options.min, max = options.max, html = '';\n                        if (options.showHeader) {\n                            html += '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><caption class=\"k-meta-header\">';\n                            html += this.title(options.date);\n                            html += '</caption><tbody><tr role=\"row\">';\n                        }\n                        return view({\n                            min: createDate(min.getFullYear(), min.getMonth(), 1),\n                            max: createDate(max.getFullYear(), max.getMonth(), 1),\n                            start: createDate(options.date.getFullYear(), 0, 1),\n                            html: html,\n                            setter: this.setDate,\n                            build: function (date) {\n                                return {\n                                    value: namesAbbr[date.getMonth()],\n                                    ns: kendo.ns,\n                                    dateString: toDateString(date),\n                                    cssClass: ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        return createDate(date.getFullYear(), 0, date.getDate());\n                    },\n                    last: function (date) {\n                        return createDate(date.getFullYear(), 11, date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2);\n                    },\n                    setDate: function (date, value) {\n                        var month, hours = date.getHours();\n                        if (value instanceof DATE) {\n                            month = value.getMonth();\n                            date.setFullYear(value.getFullYear(), month, date.getDate());\n                            if (month !== date.getMonth()) {\n                                date.setDate(0);\n                            }\n                        } else {\n                            month = date.getMonth() + value;\n                            date.setMonth(month);\n                            if (month > 11) {\n                                month -= 12;\n                            }\n                            if (month > 0 && date.getMonth() != month) {\n                                date.setDate(0);\n                            }\n                        }\n                        adjustDST(date, hours);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/' + date.getMonth() + '/1';\n                    }\n                },\n                {\n                    name: 'decade',\n                    title: function (date, min, max) {\n                        return title(date, min, max, 10);\n                    },\n                    content: function (options) {\n                        var year = options.date.getFullYear(), toDateString = this.toDateString, html = '';\n                        if (options.showHeader) {\n                            html += '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><caption class=\"k-meta-header\">';\n                            html += this.title(options.date, options.min, options.max);\n                            html += '</caption><tbody><tr role=\"row\">';\n                        }\n                        return view({\n                            start: createDate(year - year % 10 - 1, 0, 1),\n                            min: createDate(options.min.getFullYear(), 0, 1),\n                            max: createDate(options.max.getFullYear(), 0, 1),\n                            otherMonth: options.otherMonth,\n                            html: html,\n                            setter: this.setDate,\n                            build: function (date, idx) {\n                                return {\n                                    value: date.getFullYear(),\n                                    ns: kendo.ns,\n                                    dateString: toDateString(date),\n                                    cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 10, date.getMonth(), date.getDate());\n                    },\n                    last: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 10 + 9, date.getMonth(), date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2, 10);\n                    },\n                    setDate: function (date, value) {\n                        setDate(date, value, 1);\n                    },\n                    toDateString: function (date) {\n                        return date.getFullYear() + '/0/1';\n                    }\n                },\n                {\n                    name: CENTURY,\n                    title: function (date, min, max) {\n                        return title(date, min, max, 100);\n                    },\n                    content: function (options) {\n                        var year = options.date.getFullYear(), min = options.min.getFullYear(), max = options.max.getFullYear(), toDateString = this.toDateString, minYear = min, maxYear = max, html = '';\n                        minYear = minYear - minYear % 10;\n                        maxYear = maxYear - maxYear % 10;\n                        if (maxYear - minYear < 10) {\n                            maxYear = minYear + 9;\n                        }\n                        if (options.showHeader) {\n                            html += '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><caption class=\"k-meta-header\">';\n                            html += this.title(options.date, options.min, options.max);\n                            html += '</caption><tbody><tr role=\"row\">';\n                        }\n                        return view({\n                            start: createDate(year - year % 100 - 10, 0, 1),\n                            min: createDate(minYear, 0, 1),\n                            max: createDate(maxYear, 0, 1),\n                            otherMonth: options.otherMonth,\n                            html: html,\n                            setter: this.setDate,\n                            build: function (date, idx) {\n                                var start = date.getFullYear(), end = start + 9;\n                                if (start < min) {\n                                    start = min;\n                                }\n                                if (end > max) {\n                                    end = max;\n                                }\n                                return {\n                                    ns: kendo.ns,\n                                    value: start + ' - ' + end,\n                                    dateString: toDateString(date),\n                                    cssClass: idx === 0 || idx == 11 ? OTHERMONTHCLASS : ''\n                                };\n                            }\n                        });\n                    },\n                    first: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 100, date.getMonth(), date.getDate());\n                    },\n                    last: function (date) {\n                        var year = date.getFullYear();\n                        return createDate(year - year % 100 + 99, date.getMonth(), date.getDate());\n                    },\n                    compare: function (date1, date2) {\n                        return compare(date1, date2, 100);\n                    },\n                    setDate: function (date, value) {\n                        setDate(date, value, 10);\n                    },\n                    toDateString: function (date) {\n                        var year = date.getFullYear();\n                        return year - year % 10 + '/0/1';\n                    }\n                }\n            ]\n        };\n        function title(date, min, max, modular) {\n            var start = date.getFullYear(), minYear = min.getFullYear(), maxYear = max.getFullYear(), end;\n            start = start - start % modular;\n            end = start + (modular - 1);\n            if (start < minYear) {\n                start = minYear;\n            }\n            if (end > maxYear) {\n                end = maxYear;\n            }\n            return start + '-' + end;\n        }\n        function view(options) {\n            var idx = 0, data, min = options.min, max = options.max, start = options.start, setter = options.setter, build = options.build, weekNumberBuild = options.weekNumberBuild, length = options.cells || 12, isWeekColumnVisible = options.isWeekColumnVisible, cellsPerRow = options.perRow || 4, otherMonth = options.otherMonth, lastDayOfMonth = options.lastDayOfMonth, weekNumber = options.weekNumber || weekNumberTemplate, content = options.content || cellTemplate, empty = options.empty || emptyCellTemplate, otherMonthTemplate = options.otherMonthCellTemplate || otherMonthCellTemplate, html = options.html || '<table tabindex=\"0\" role=\"grid\" class=\"k-content k-meta-view\" cellspacing=\"0\"><tbody><tr role=\"row\">';\n            if (isWeekColumnVisible) {\n                html += weekNumber(weekNumberBuild(start));\n            }\n            for (; idx < length; idx++) {\n                if (idx > 0 && idx % cellsPerRow === 0) {\n                    html += '</tr><tr role=\"row\">';\n                    if (isWeekColumnVisible) {\n                        html += otherMonth || +start <= +lastDayOfMonth ? weekNumber(weekNumberBuild(start)) : weekNumber({ weekNumber: '&nbsp;' });\n                    }\n                }\n                start = createDate(start.getFullYear(), start.getMonth(), start.getDate());\n                adjustDST(start, 0);\n                data = build(start, idx, options.disableDates);\n                html += data.cssClass.indexOf(OTHERMONTH) !== -1 && !otherMonth ? otherMonthTemplate(data) : isInRange(start, min, max) ? content(data) : empty(data);\n                setter(start, 1);\n            }\n            return html + '</tr></tbody></table>';\n        }\n        function compare(date1, date2, modifier) {\n            var year1 = date1.getFullYear(), start = date2.getFullYear(), end = start, result = 0;\n            if (modifier) {\n                start = start - start % modifier;\n                end = start - start % modifier + modifier - 1;\n            }\n            if (year1 > end) {\n                result = 1;\n            } else if (year1 < start) {\n                result = -1;\n            }\n            return result;\n        }\n        function getToday() {\n            var today = new DATE();\n            return new DATE(today.getFullYear(), today.getMonth(), today.getDate());\n        }\n        function restrictValue(value, min, max) {\n            var today = getToday();\n            if (value) {\n                today = new DATE(+value);\n            }\n            if (min > today) {\n                today = new DATE(+min);\n            } else if (max < today) {\n                today = new DATE(+max);\n            }\n            return today;\n        }\n        function isInRange(date, min, max) {\n            return +date >= +min && +date <= +max;\n        }\n        function shiftArray(array, idx) {\n            return array.slice(idx).concat(array.slice(0, idx));\n        }\n        function setDate(date, value, multiplier) {\n            value = value instanceof DATE ? value.getFullYear() : date.getFullYear() + multiplier * value;\n            date.setFullYear(value);\n        }\n        function daysBetweenTwoDates(startDate, endDate) {\n            if (+endDate < +startDate) {\n                var temp = +startDate;\n                calendar.views[0].setDate(startDate, endDate);\n                calendar.views[0].setDate(endDate, new Date(temp));\n            }\n            var fromDateUTC = Date.UTC(startDate.getFullYear(), startDate.getMonth(), startDate.getDate());\n            var endDateUTC = Date.UTC(endDate.getFullYear(), endDate.getMonth(), endDate.getDate());\n            return Math.ceil((+endDateUTC - +fromDateUTC) / kendo.date.MS_PER_DAY);\n        }\n        function addDaysToArray(array, numberOfDays, fromDate, disableDates) {\n            for (var i = 0; i <= numberOfDays; i++) {\n                var nextDay = new Date(fromDate.getTime());\n                nextDay = new Date(nextDay.setDate(nextDay.getDate() + i));\n                if (!disableDates(nextDay)) {\n                    array.push(nextDay);\n                }\n            }\n        }\n        function mousetoggle(e) {\n            var disabled = $(this).hasClass('k-state-disabled');\n            if (!disabled) {\n                $(this).toggleClass(HOVER, MOUSEENTER.indexOf(e.type) > -1 || e.type == FOCUS);\n            }\n        }\n        function prevent(e) {\n            e.preventDefault();\n        }\n        function createDate(year, month, date) {\n            var dateObject = new DATE(year, month, date);\n            dateObject.setFullYear(year, month, date);\n            return dateObject;\n        }\n        function getCalendarInfo(culture) {\n            return getCulture(culture).calendars.standard;\n        }\n        function normalize(options) {\n            var start = views[options.start], depth = views[options.depth], culture = getCulture(options.culture);\n            options.format = extractFormat(options.format || culture.calendars.standard.patterns.d);\n            if (isNaN(start)) {\n                start = 0;\n                options.start = MONTH;\n            }\n            if (depth === undefined || depth > start) {\n                options.depth = MONTH;\n            }\n            if (options.dates === null) {\n                options.dates = [];\n            }\n        }\n        function makeUnselectable(element) {\n            if (isIE8) {\n                element.find('*').attr('unselectable', 'on');\n            }\n        }\n        function addClassToViewContainer(element, currentView) {\n            element.addClass('k-' + currentView);\n        }\n        function inArray(date, dates) {\n            for (var i = 0, length = dates.length; i < length; i++) {\n                if (date === +dates[i]) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        function isEqualDatePart(value1, value2) {\n            if (value1) {\n                return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth() && value1.getDate() === value2.getDate();\n            }\n            return false;\n        }\n        function isEqualMonth(value1, value2) {\n            if (value1) {\n                return value1.getFullYear() === value2.getFullYear() && value1.getMonth() === value2.getMonth();\n            }\n            return false;\n        }\n        function getDisabledExpr(option) {\n            if (kendo.isFunction(option)) {\n                return option;\n            }\n            if ($.isArray(option)) {\n                return createDisabledExpr(option);\n            }\n            return $.noop;\n        }\n        function convertDatesArray(dates) {\n            var result = [];\n            for (var i = 0; i < dates.length; i++) {\n                result.push(dates[i].setHours(0, 0, 0, 0));\n            }\n            return result;\n        }\n        function createDisabledExpr(dates) {\n            var body, callback, disabledDates = [], days = [\n                    'su',\n                    'mo',\n                    'tu',\n                    'we',\n                    'th',\n                    'fr',\n                    'sa'\n                ], searchExpression = 'if (found) {' + ' return true ' + '} else {' + 'return false' + '}';\n            if (dates[0] instanceof DATE) {\n                disabledDates = convertDatesArray(dates);\n                body = 'var found = date && window.kendo.jQuery.inArray(date.setHours(0, 0, 0, 0),[' + disabledDates + ']) > -1;' + searchExpression;\n            } else {\n                for (var i = 0; i < dates.length; i++) {\n                    var day = dates[i].slice(0, 2).toLowerCase();\n                    var index = $.inArray(day, days);\n                    if (index > -1) {\n                        disabledDates.push(index);\n                    }\n                }\n                body = 'var found = date && window.kendo.jQuery.inArray(date.getDay(),[' + disabledDates + ']) > -1;' + searchExpression;\n            }\n            callback = new Function('date', body);\n            return callback;\n        }\n        function isEqualDate(oldValue, newValue) {\n            if (oldValue instanceof Date && newValue instanceof Date) {\n                oldValue = oldValue.getTime();\n                newValue = newValue.getTime();\n            }\n            return oldValue === newValue;\n        }\n        function toDateObject(link) {\n            var value = $(link).attr(kendo.attr(VALUE)).split('/');\n            value = createDate(value[0], value[1], value[2]);\n            return value;\n        }\n        calendar.isEqualDatePart = isEqualDatePart;\n        calendar.isEqualDate = isEqualDate;\n        calendar.makeUnselectable = makeUnselectable;\n        calendar.restrictValue = restrictValue;\n        calendar.isInRange = isInRange;\n        calendar.addClassToViewContainer = addClassToViewContainer;\n        calendar.normalize = normalize;\n        calendar.viewsEnum = views;\n        calendar.disabled = getDisabledExpr;\n        calendar.toDateObject = toDateObject;\n        calendar.getToday = getToday;\n        calendar.createDate = createDate;\n        kendo.calendar = calendar;\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dateinput', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'dateinput',\n        name: 'DateInput',\n        category: 'web',\n        description: 'The DateInput widget allows to edit date by typing.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var global = window;\n        var kendo = global.kendo;\n        var caret = kendo.caret;\n        var ui = kendo.ui;\n        var Widget = ui.Widget;\n        var keys = kendo.keys;\n        var ns = '.kendoDateInput';\n        var proxy = $.proxy;\n        var objectToString = {}.toString;\n        var INPUT_EVENT_NAME = (kendo.support.propertyChangeEvent ? 'propertychange.kendoDateInput input' : 'input') + ns;\n        var STATEDISABLED = 'k-state-disabled';\n        var STATEDEFAULT = 'k-state-default';\n        var STATEINVALID = 'k-state-invalid';\n        var DISABLED = 'disabled';\n        var READONLY = 'readonly';\n        var CHANGE = 'change';\n        var knownSymbols = 'dMyHhmftsz';\n        var DateInput = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.format = kendo._extractFormat(options.format || kendo.getCulture(options.culture).calendars.standard.patterns.d);\n                options.min = kendo.parseDate(element.attr('min')) || kendo.parseDate(options.min);\n                options.max = kendo.parseDate(element.attr('max')) || kendo.parseDate(options.max);\n                var insidePicker = (element.parent().attr('class') || '').indexOf('k-picker-wrap') >= 0;\n                if (insidePicker) {\n                    that.wrapper = element.parent();\n                } else {\n                    that.wrapper = element.wrap('<span class=\\'k-widget k-dateinput\\'></span>').parent();\n                    that.wrapper.addClass(element[0].className);\n                    that.wrapper[0].style.cssText = element[0].style.cssText;\n                    element.css({\n                        width: '100%',\n                        height: element[0].style.height\n                    });\n                }\n                that._inputWrapper = $(that.wrapper[0]);\n                $('<span class=\\'k-icon k-i-warning\\'></span>').insertAfter(element);\n                that._form();\n                that.element.addClass(insidePicker ? ' ' : 'k-textbox').attr('autocomplete', 'off').on('focusout' + ns, function () {\n                    that._change();\n                });\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                var disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.value(that.options.value || element.val());\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DateInput',\n                culture: '',\n                value: '',\n                format: '',\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                messages: {\n                    'year': 'year',\n                    'month': 'month',\n                    'day': 'day',\n                    'weekday': 'day of the week',\n                    'hour': 'hours',\n                    'minute': 'minutes',\n                    'second': 'seconds',\n                    'dayperiod': 'AM/PM'\n                }\n            },\n            events: [CHANGE],\n            min: function (value) {\n                if (value !== undefined) {\n                    this.options.min = value;\n                } else {\n                    return this.options.min;\n                }\n            },\n            max: function (value) {\n                if (value !== undefined) {\n                    this.options.max = value;\n                } else {\n                    return this.options.max;\n                }\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                this._unbindInput();\n                this._bindInput();\n                this._updateElementValue();\n            },\n            destroy: function () {\n                var that = this;\n                that.element.off(ns);\n                if (that._formElement) {\n                    that._formElement.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            value: function (value) {\n                if (value === undefined) {\n                    return this._dateTime.getDateObject();\n                }\n                if (value === null) {\n                    value = '';\n                }\n                if (objectToString.call(value) !== '[object Date]') {\n                    value = kendo.parseDate(value, this.options.format, this.options.culture);\n                }\n                if (value && !value.getTime()) {\n                    value = null;\n                }\n                this._dateTime = new customDateTime(value, this.options.format, this.options.culture, this.options.messages);\n                this._updateElementValue();\n                this._oldValue = value;\n            },\n            _updateElementValue: function () {\n                var stringAndFromat = this._dateTime.toPair(this.options.format, this.options.culture, this.options.messages);\n                this.element.val(stringAndFromat[0]);\n                this._oldText = stringAndFromat[0];\n                this._format = stringAndFromat[1];\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _bindInput: function () {\n                var that = this;\n                that.element.on('focusout' + ns, function () {\n                    that._change();\n                }).on('paste' + ns, proxy(that._paste, that)).on('keydown' + ns, proxy(that._keydown, that)).on(INPUT_EVENT_NAME, proxy(that._input, that)).on('mouseup' + ns, proxy(that._mouseUp, that)).on('DOMMouseScroll' + ns + ' mousewheel' + ns, proxy(that._scroll, that));\n            },\n            _unbindInput: function () {\n                this.element.off('keydown' + ns).off('paste' + ns).off('focusout' + ns).off(INPUT_EVENT_NAME).off('mouseup' + ns).off('DOMMouseScroll' + ns + ' mousewheel' + ns);\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                var wrapper = that.wrapper;\n                that._unbindInput();\n                if (!readonly && !disable) {\n                    wrapper.addClass(STATEDEFAULT).removeClass(STATEDISABLED);\n                    if (element && element.length) {\n                        element[0].removeAttribute(DISABLED);\n                        element[0].removeAttribute(READONLY);\n                    }\n                    that._bindInput();\n                } else {\n                    if (disable) {\n                        wrapper.addClass(STATEDISABLED).removeClass(STATEDEFAULT);\n                        element.attr(DISABLED, disable);\n                        if (element && element.length) {\n                            element[0].removeAttribute(READONLY);\n                        }\n                    }\n                    if (readonly) {\n                        element.attr(READONLY, readonly);\n                    }\n                }\n            },\n            _change: function () {\n                var that = this;\n                var oldValue = that._oldValue;\n                var value = that.value();\n                if (value && that.min() && value < that.min()) {\n                    that.value(that.min());\n                    value = that.value();\n                }\n                if (value && that.max() && value > that.max()) {\n                    that.value(that.max());\n                    value = that.value();\n                }\n                if (oldValue && value && value.getTime() !== oldValue.getTime() || oldValue && !value || !oldValue && value) {\n                    that._oldValue = value;\n                    that.trigger(CHANGE);\n                    that.element.trigger(CHANGE);\n                }\n            },\n            _input: function () {\n                var that = this;\n                var element = that.element[0];\n                var blinkInvalid = false;\n                if (kendo._activeElement() !== element) {\n                    return;\n                }\n                var diff = approximateStringMatching(this._oldText, this._format, this.element[0].value, caret(this.element[0])[0]);\n                var navigationOnly = diff.length === 1 && diff[0][1] === ' ';\n                if (!navigationOnly) {\n                    for (var i = 0; i < diff.length; i++) {\n                        var valid = this._dateTime.parsePart(diff[i][0], diff[i][1]);\n                        blinkInvalid = blinkInvalid || !valid;\n                    }\n                }\n                this._updateElementValue();\n                if (diff.length && diff[0][0] !== ' ') {\n                    this._selectSegment(diff[0][0]);\n                    if (!navigationOnly) {\n                        var difSym = diff[0][0];\n                        setTimeout(function () {\n                            that._selectSegment(difSym);\n                        });\n                    }\n                }\n                if (navigationOnly) {\n                    var newEvent = {\n                        keyCode: 39,\n                        preventDefault: function () {\n                        }\n                    };\n                    this._keydown(newEvent);\n                }\n                if (blinkInvalid) {\n                    clearTimeout(that._blinkInvalidTimeout);\n                    var stateInvalid = STATEINVALID;\n                    that.wrapper.addClass(STATEINVALID);\n                    that._blinkInvalidTimeout = setTimeout(function () {\n                        that.wrapper.removeClass(stateInvalid);\n                    }, 100);\n                }\n            },\n            _mouseUp: function () {\n                var selection = caret(this.element[0]);\n                if (selection[0] === selection[1]) {\n                    this._selectNearestSegment();\n                }\n            },\n            _scroll: function (e) {\n                if (kendo._activeElement() !== this.element[0] || this.element.is('[readonly]')) {\n                    return;\n                }\n                e = window.event || e;\n                var newEvent = {\n                    keyCode: 37,\n                    preventDefault: function () {\n                    }\n                };\n                if (e.shiftKey) {\n                    newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 37 : 39;\n                } else {\n                    newEvent.keyCode = (e.wheelDelta || -e.detail) > 0 ? 38 : 40;\n                }\n                this._keydown(newEvent);\n                e.returnValue = false;\n                if (e.preventDefault) {\n                    e.preventDefault();\n                }\n                if (e.stopPropagation) {\n                    e.stopPropagation();\n                }\n            },\n            _form: function () {\n                var that = this;\n                var element = that.element;\n                var formId = element.attr('form');\n                var form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                        });\n                    };\n                    that._formElement = form.on('reset', that._resetHandler);\n                }\n            },\n            _paste: function (e) {\n                e.preventDefault();\n            },\n            _keydown: function (e) {\n                var key = e.keyCode;\n                var selection;\n                if (key == 37 || key == 39) {\n                    e.preventDefault();\n                    selection = caret(this.element[0]);\n                    if (selection[0] != selection[1]) {\n                        this._selectNearestSegment();\n                    }\n                    var dir = key == 37 ? -1 : 1;\n                    var index = dir == -1 ? caret(this.element[0])[0] - 1 : caret(this.element[0])[1] + 1;\n                    while (index >= 0 && index < this._format.length) {\n                        if (knownSymbols.indexOf(this._format[index]) >= 0) {\n                            this._selectSegment(this._format[index]);\n                            break;\n                        }\n                        index += dir;\n                    }\n                }\n                if (key == 38 || key == 40) {\n                    e.preventDefault();\n                    selection = caret(this.element[0]);\n                    var symbol = this._format[selection[0]];\n                    if (knownSymbols.indexOf(symbol) >= 0) {\n                        this._dateTime.modifyPart(symbol, key == 38 ? 1 : -1);\n                        this._updateElementValue();\n                        this._selectSegment(symbol);\n                        this.element.trigger(CHANGE);\n                    }\n                }\n                if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                    var keycode = e.keyCode ? e.keyCode : e.which;\n                    if (keycode === 8 || keycode === 46) {\n                        var that = this;\n                        setTimeout(function () {\n                            that._input();\n                        }, 0);\n                    }\n                }\n                if (key === keys.ENTER) {\n                    this._change();\n                }\n            },\n            _selectNearestSegment: function () {\n                var selection = caret(this.element[0]);\n                var start = selection[0];\n                for (var i = start, j = start - 1; i < this._format.length || j >= 0; i++, j--) {\n                    if (i < this._format.length && knownSymbols.indexOf(this._format[i]) !== -1) {\n                        this._selectSegment(this._format[i]);\n                        return;\n                    }\n                    if (j >= 0 && knownSymbols.indexOf(this._format[j]) !== -1) {\n                        this._selectSegment(this._format[j]);\n                        return;\n                    }\n                }\n            },\n            _selectSegment: function (symbol) {\n                var begin = -1, end = 0;\n                for (var i = 0; i < this._format.length; i++) {\n                    if (this._format[i] === symbol) {\n                        end = i + 1;\n                        if (begin === -1) {\n                            begin = i;\n                        }\n                    }\n                }\n                if (begin < 0) {\n                    begin = 0;\n                }\n                caret(this.element, begin, end);\n            }\n        });\n        ui.plugin(DateInput);\n        var customDateTime = function (initDate, initFormat, initCulture, initMessages) {\n            var value = null;\n            var year = true, month = true, date = true, hours = true, minutes = true, seconds = true, milliseconds = true;\n            var typedMonthPart = '';\n            var typedDayPeriodPart = '';\n            var placeholders = {};\n            var zeros = [\n                '',\n                '0',\n                '00',\n                '000',\n                '0000'\n            ];\n            function pad(number, digits, end) {\n                number = number + '';\n                digits = digits || 2;\n                end = digits - number.length;\n                if (end) {\n                    return zeros[digits].substring(0, end) + number;\n                }\n                return number;\n            }\n            var dateFormatRegExp = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g;\n            var months = null, calendar = null, days = null, returnsFormat = false;\n            var matcher = function (match) {\n                var mins, sign;\n                var result;\n                switch (match) {\n                case 'd':\n                    result = date ? value.getDate() : placeholders.day;\n                    break;\n                case 'dd':\n                    result = date ? pad(value.getDate()) : placeholders.day;\n                    break;\n                case 'ddd':\n                    result = date && month && year ? days.namesAbbr[value.getDay()] : placeholders.weekday;\n                    break;\n                case 'dddd':\n                    result = date && month && year ? days.names[value.getDay()] : placeholders.weekday;\n                    break;\n                case 'M':\n                    result = month ? value.getMonth() + 1 : placeholders.month;\n                    break;\n                case 'MM':\n                    result = month ? pad(value.getMonth() + 1) : placeholders.month;\n                    break;\n                case 'MMM':\n                    result = month ? months.namesAbbr[value.getMonth()] : placeholders.month;\n                    break;\n                case 'MMMM':\n                    result = month ? months.names[value.getMonth()] : placeholders.month;\n                    break;\n                case 'yy':\n                    result = year ? pad(value.getFullYear() % 100) : placeholders.year;\n                    break;\n                case 'yyyy':\n                    result = year ? pad(value.getFullYear(), 4) : placeholders.year;\n                    break;\n                case 'h':\n                    result = hours ? value.getHours() % 12 || 12 : placeholders.hour;\n                    break;\n                case 'hh':\n                    result = hours ? pad(value.getHours() % 12 || 12) : placeholders.hour;\n                    break;\n                case 'H':\n                    result = hours ? value.getHours() : placeholders.hour;\n                    break;\n                case 'HH':\n                    result = hours ? pad(value.getHours()) : placeholders.hour;\n                    break;\n                case 'm':\n                    result = minutes ? value.getMinutes() : placeholders.minute;\n                    break;\n                case 'mm':\n                    result = minutes ? pad(value.getMinutes()) : placeholders.minute;\n                    break;\n                case 's':\n                    result = seconds ? value.getSeconds() : placeholders.second;\n                    break;\n                case 'ss':\n                    result = seconds ? pad(value.getSeconds()) : placeholders.second;\n                    break;\n                case 'f':\n                    result = milliseconds ? Math.floor(value.getMilliseconds() / 100) : milliseconds;\n                    break;\n                case 'ff':\n                    result = value.getMilliseconds();\n                    if (result > 99) {\n                        result = Math.floor(result / 10);\n                    }\n                    result = milliseconds ? pad(result) : match;\n                    break;\n                case 'fff':\n                    result = milliseconds ? pad(value.getMilliseconds(), 3) : match;\n                    break;\n                case 'tt':\n                    result = hours ? value.getHours() < 12 ? calendar.AM[0] : calendar.PM[0] : placeholders.dayperiod;\n                    break;\n                case 'zzz':\n                    mins = value.getTimezoneOffset();\n                    sign = mins < 0;\n                    result = Math.abs(mins / 60).toString().split('.')[0];\n                    mins = Math.abs(mins) - result * 60;\n                    result = (sign ? '+' : '-') + pad(result);\n                    result += ':' + pad(mins);\n                    break;\n                case 'z':\n                case 'zz':\n                    result = value.getTimezoneOffset() / 60;\n                    sign = result < 0;\n                    result = Math.abs(result).toString().split('.')[0];\n                    result = (sign ? '+' : '-') + (match === 'zz' ? pad(result) : result);\n                    break;\n                }\n                result = result !== undefined ? result : match.slice(1, match.length - 1);\n                if (returnsFormat) {\n                    result = '' + result;\n                    var formatResult = '';\n                    if (match == 'ddd') {\n                        match = 'EEE';\n                    }\n                    if (match == 'dddd') {\n                        match = 'EEEE';\n                    }\n                    for (var i = 0; i < result.length; i++) {\n                        formatResult += match[0];\n                    }\n                    return formatResult;\n                } else {\n                    return result;\n                }\n            };\n            function generateMatcher(retFormat) {\n                returnsFormat = retFormat;\n                return matcher;\n            }\n            function setExisting(symbol, val) {\n                switch (symbol) {\n                case 'y':\n                    year = val;\n                    break;\n                case 'M':\n                    month = val;\n                    if (!val) {\n                        value.setMonth(0);\n                        typedMonthPart = '';\n                    }\n                    break;\n                case 'd':\n                    date = val;\n                    break;\n                case 'H':\n                case 'h':\n                    hours = val;\n                    if (!val) {\n                        typedDayPeriodPart = '';\n                    }\n                    break;\n                case 'm':\n                    minutes = val;\n                    break;\n                case 's':\n                    seconds = val;\n                    break;\n                default:\n                    return;\n                }\n            }\n            this.setValue = function (val) {\n                date = val;\n            };\n            this.getValue = function () {\n                return date;\n            };\n            this.modifyPart = function (symbol, offset) {\n                var newValue = new Date(value && value.getTime ? value.getTime() : value);\n                switch (symbol) {\n                case 'y':\n                    newValue.setFullYear(newValue.getFullYear() + offset);\n                    break;\n                case 'M':\n                    var newMonth = newValue.getMonth() + offset;\n                    newValue.setMonth(newMonth);\n                    if (newValue.getMonth() % 12 !== (newMonth + 12) % 12) {\n                        newValue.setDate(1);\n                        newValue.setMonth(newMonth);\n                    }\n                    break;\n                case 'd':\n                case 'E':\n                    newValue.setDate(newValue.getDate() + offset);\n                    break;\n                case 'H':\n                case 'h':\n                    newValue.setHours(newValue.getHours() + offset);\n                    break;\n                case 'm':\n                    newValue.setMinutes(newValue.getMinutes() + offset);\n                    break;\n                case 's':\n                    newValue.setSeconds(newValue.getSeconds() + offset);\n                    break;\n                case 't':\n                    newValue.setHours((newValue.getHours() + 12) % 24);\n                    break;\n                default:\n                    break;\n                }\n                if (newValue.getFullYear() > 0) {\n                    setExisting(symbol, true);\n                    value = newValue;\n                }\n            };\n            this.parsePart = function (symbol, currentChar) {\n                if (!currentChar) {\n                    setExisting(symbol, false);\n                    return true;\n                }\n                var newValue = new Date(value && value.getTime ? value.getTime() : value);\n                var newHours;\n                switch (symbol) {\n                case 'd':\n                    var newDate = (date ? newValue.getDate() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newDate)) {\n                        return;\n                    }\n                    while (newDate > 31) {\n                        newDate = parseInt(newDate.toString().slice(1), 10);\n                    }\n                    if (newDate < 1) {\n                        date = false;\n                    } else {\n                        newValue.setDate(newDate);\n                        if (newValue.getMonth() !== value.getMonth()) {\n                            return;\n                        }\n                        date = true;\n                    }\n                    break;\n                case 'M':\n                    var newMonth = (month ? (newValue.getMonth() + 1) * 10 : 0) + parseInt(currentChar, 10);\n                    if (!isNaN(newMonth)) {\n                        while (newMonth > 12) {\n                            newMonth = parseInt(newMonth.toString().slice(1), 10);\n                        }\n                        if (newMonth < 1) {\n                            month = false;\n                        } else {\n                            newValue.setMonth(newMonth - 1);\n                            if (newValue.getMonth() !== newMonth - 1) {\n                                newValue.setDate(1);\n                                newValue.setMonth(newMonth - 1);\n                            }\n                            month = true;\n                        }\n                    } else {\n                        var monthNames = calendar.months.names;\n                        typedMonthPart += currentChar.toLowerCase();\n                        while (typedMonthPart.length > 0) {\n                            for (var i = 0; i < monthNames.length; i++) {\n                                if (monthNames[i].toLowerCase().indexOf(typedMonthPart) === 0) {\n                                    newValue.setMonth(i);\n                                    month = true;\n                                    value = newValue;\n                                    return true;\n                                }\n                            }\n                            typedMonthPart = typedMonthPart.substring(1, typedMonthPart.length);\n                        }\n                        return false;\n                    }\n                    break;\n                case 'y':\n                    var newYear = (year ? newValue.getFullYear() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newYear)) {\n                        return;\n                    }\n                    while (newYear > 9999) {\n                        newYear = parseInt(newYear.toString().slice(1), 10);\n                    }\n                    if (newYear < 1) {\n                        year = false;\n                    } else {\n                        newValue.setFullYear(newYear);\n                        year = true;\n                    }\n                    break;\n                case 'h':\n                    newHours = (hours ? (newValue.getHours() % 12 || 12) * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newHours)) {\n                        return;\n                    }\n                    while (newHours > 12) {\n                        newHours = parseInt(newHours.toString().slice(1), 10);\n                    }\n                    newValue.setHours(Math.floor(newValue.getHours() / 12) * 12 + newHours % 12);\n                    hours = true;\n                    break;\n                case 'H':\n                    newHours = (hours ? newValue.getHours() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newHours)) {\n                        return;\n                    }\n                    while (newHours > 23) {\n                        newHours = parseInt(newHours.toString().slice(1), 10);\n                    }\n                    newValue.setHours(newHours);\n                    hours = true;\n                    break;\n                case 'm':\n                    var newMinutes = (minutes ? newValue.getMinutes() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newMinutes)) {\n                        return;\n                    }\n                    while (newMinutes > 59) {\n                        newMinutes = parseInt(newMinutes.toString().slice(1), 10);\n                    }\n                    newValue.setMinutes(newMinutes);\n                    minutes = true;\n                    break;\n                case 's':\n                    var newSeconds = (seconds ? newValue.getSeconds() * 10 : 0) + parseInt(currentChar, 10);\n                    if (isNaN(newSeconds)) {\n                        return;\n                    }\n                    while (newSeconds > 59) {\n                        newSeconds = parseInt(newSeconds.toString().slice(1), 10);\n                    }\n                    newValue.setSeconds(newSeconds);\n                    seconds = true;\n                    break;\n                case 't':\n                    if (hours) {\n                        typedDayPeriodPart += currentChar.toLowerCase();\n                        while (typedDayPeriodPart.length > 0) {\n                            if (calendar.AM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() >= 12 || calendar.PM[0].toLowerCase().indexOf(typedDayPeriodPart) === 0 && newValue.getHours() < 12) {\n                                newValue.setHours((newValue.getHours() + 12) % 24);\n                                value = newValue;\n                                return true;\n                            }\n                            typedDayPeriodPart = typedDayPeriodPart.substring(1, typedDayPeriodPart.length);\n                        }\n                        return false;\n                    }\n                    break;\n                default:\n                    break;\n                }\n                value = newValue;\n                return true;\n            };\n            this.toPair = function (format, culture, messages) {\n                if (!format) {\n                    return [\n                        '',\n                        ''\n                    ];\n                }\n                culture = kendo.getCulture(culture);\n                calendar = culture.calendars.standard;\n                format = calendar.patterns[format] || format;\n                days = calendar.days;\n                months = calendar.months;\n                placeholders = messages;\n                return [\n                    format.replace(dateFormatRegExp, generateMatcher(false)),\n                    format.replace(dateFormatRegExp, generateMatcher(true))\n                ];\n            };\n            this.getDateObject = function () {\n                return year && month && date && hours && minutes && seconds && milliseconds ? new Date(value.getTime()) : null;\n            };\n            if (!initDate) {\n                value = new Date();\n                var sampleFormat = this.toPair(initFormat, initCulture, initMessages)[1];\n                for (var i = 0; i < sampleFormat.length; i++) {\n                    setExisting(sampleFormat[i], false);\n                }\n            } else {\n                value = new Date(initDate.getTime());\n            }\n        };\n        function approximateStringMatching(oldText, oldFormat, newText, caret) {\n            var oldTextSeparator = oldText[caret + oldText.length - newText.length];\n            oldText = oldText.substring(0, caret + oldText.length - newText.length);\n            newText = newText.substring(0, caret);\n            var diff = [];\n            var i;\n            if (oldText === newText && caret > 0) {\n                diff.push([\n                    oldFormat[caret - 1],\n                    newText[caret - 1]\n                ]);\n                return diff;\n            }\n            if (oldText.indexOf(newText) === 0 && (newText.length === 0 || oldFormat[newText.length - 1] !== oldFormat[newText.length])) {\n                var deletedSymbol = '';\n                for (i = newText.length; i < oldText.length; i++) {\n                    if (oldFormat[i] !== deletedSymbol && knownSymbols.indexOf(oldFormat[i]) >= 0) {\n                        deletedSymbol = oldFormat[i];\n                        diff.push([\n                            deletedSymbol,\n                            ''\n                        ]);\n                    }\n                }\n                return diff;\n            }\n            if (newText[newText.length - 1] === ' ' || newText[newText.length - 1] === oldTextSeparator) {\n                return [[\n                        oldFormat[caret - 1],\n                        ' '\n                    ]];\n            }\n            if (newText.indexOf(oldText) === 0 || knownSymbols.indexOf(oldFormat[caret - 1]) === -1) {\n                var symbol = oldFormat[0];\n                for (i = Math.max(0, oldText.length - 1); i < oldFormat.length; i++) {\n                    if (knownSymbols.indexOf(oldFormat[i]) >= 0) {\n                        symbol = oldFormat[i];\n                        break;\n                    }\n                }\n                return [[\n                        symbol,\n                        newText[caret - 1]\n                    ]];\n            }\n            return [[\n                    oldFormat[caret - 1],\n                    newText[caret - 1]\n                ]];\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.datepicker', [\n        'kendo.calendar',\n        'kendo.popup',\n        'kendo.dateinput'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'datepicker',\n        name: 'DatePicker',\n        category: 'web',\n        description: 'The DatePicker widget allows the user to select a date from a calendar or by direct input.',\n        depends: [\n            'calendar',\n            'popup'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, parse = kendo.parseDate, keys = kendo.keys, support = kendo.support, template = kendo.template, activeElement = kendo._activeElement, DIV = '<div />', SPAN = '<span />', ns = '.kendoDatePicker', CLICK = 'click' + ns, UP = support.mouseAndTouchPresent ? kendo.applyEventMap('up', ns.slice(1)) : CLICK, OPEN = 'open', CLOSE = 'close', CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', HOVER = 'k-state-hover', HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, MOUSEDOWN = 'mousedown' + ns, ID = 'id', MIN = 'min', MAX = 'max', MONTH = 'month', ARIA_DISABLED = 'aria-disabled', ARIA_EXPANDED = 'aria-expanded', ARIA_HIDDEN = 'aria-hidden', calendar = kendo.calendar, isInRange = calendar.isInRange, restrictValue = calendar.restrictValue, isEqualDatePart = calendar.isEqualDatePart, extend = $.extend, proxy = $.proxy, DATE = Date;\n        function normalize(options) {\n            var parseFormats = options.parseFormats, format = options.format;\n            calendar.normalize(options);\n            parseFormats = $.isArray(parseFormats) ? parseFormats : [parseFormats];\n            if (!parseFormats.length) {\n                parseFormats.push('yyyy-MM-dd');\n            }\n            if ($.inArray(format, parseFormats) === -1) {\n                parseFormats.splice(0, 0, options.format);\n            }\n            options.parseFormats = parseFormats;\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        var DateView = function (options) {\n            var that = this, id, body = document.body, div = $(DIV).attr(ARIA_HIDDEN, 'true').addClass('k-calendar-container').appendTo(body);\n            that.options = options = options || {};\n            id = options.id;\n            if (id) {\n                id += '_dateview';\n                div.attr(ID, id);\n                that._dateViewID = id;\n            }\n            that.popup = new ui.Popup(div, extend(options.popup, options, {\n                name: 'Popup',\n                isRtl: kendo.support.isRtl(options.anchor)\n            }));\n            that.div = div;\n            that.value(options.value);\n        };\n        DateView.prototype = {\n            _calendar: function () {\n                var that = this;\n                var calendar = that.calendar;\n                var options = that.options;\n                var div;\n                if (!calendar) {\n                    div = $(DIV).attr(ID, kendo.guid()).appendTo(that.popup.element).on(MOUSEDOWN, preventDefault).on(CLICK, 'td:has(.k-link)', proxy(that._click, that));\n                    that.calendar = calendar = new ui.Calendar(div);\n                    that._setOptions(options);\n                    kendo.calendar.makeUnselectable(calendar.element);\n                    calendar.navigate(that._value || that._current, options.start);\n                    that.value(that._value);\n                }\n            },\n            _setOptions: function (options) {\n                this.calendar.setOptions({\n                    focusOnNav: false,\n                    change: options.change,\n                    culture: options.culture,\n                    dates: options.dates,\n                    depth: options.depth,\n                    footer: options.footer,\n                    format: options.format,\n                    max: options.max,\n                    min: options.min,\n                    month: options.month,\n                    weekNumber: options.weekNumber,\n                    start: options.start,\n                    disableDates: options.disableDates\n                });\n            },\n            setOptions: function (options) {\n                var old = this.options;\n                var disableDates = options.disableDates;\n                if (disableDates) {\n                    options.disableDates = calendar.disabled(disableDates);\n                }\n                this.options = extend(old, options, {\n                    change: old.change,\n                    close: old.close,\n                    open: old.open\n                });\n                if (this.calendar) {\n                    this._setOptions(this.options);\n                }\n            },\n            destroy: function () {\n                this.popup.destroy();\n            },\n            open: function () {\n                var that = this;\n                var popupHovered;\n                that._calendar();\n                popupHovered = that.popup._hovered;\n                that.popup._hovered = true;\n                that.popup.open();\n                setTimeout(function () {\n                    that.popup._hovered = popupHovered;\n                }, 1);\n            },\n            close: function () {\n                this.popup.close();\n            },\n            min: function (value) {\n                this._option(MIN, value);\n            },\n            max: function (value) {\n                this._option(MAX, value);\n            },\n            toggle: function () {\n                var that = this;\n                that[that.popup.visible() ? CLOSE : OPEN]();\n            },\n            move: function (e) {\n                var that = this, key = e.keyCode, calendar = that.calendar, selectIsClicked = e.ctrlKey && key == keys.DOWN || key == keys.ENTER, handled = false;\n                if (e.altKey) {\n                    if (key == keys.DOWN) {\n                        that.open();\n                        e.preventDefault();\n                        handled = true;\n                    } else if (key == keys.UP) {\n                        that.close();\n                        e.preventDefault();\n                        handled = true;\n                    }\n                } else if (that.popup.visible()) {\n                    if (key == keys.ESC || selectIsClicked && calendar._cell.hasClass(SELECTED)) {\n                        that.close();\n                        e.preventDefault();\n                        return true;\n                    }\n                    if (key != keys.SPACEBAR) {\n                        that._current = calendar._move(e);\n                    }\n                    handled = true;\n                }\n                return handled;\n            },\n            current: function (date) {\n                this._current = date;\n                this.calendar._focus(date);\n            },\n            value: function (value) {\n                var that = this, calendar = that.calendar, options = that.options, disabledDate = options.disableDates;\n                if (disabledDate && disabledDate(value)) {\n                    value = null;\n                }\n                that._value = value;\n                that._current = new DATE(+restrictValue(value, options.min, options.max));\n                if (calendar) {\n                    calendar.value(value);\n                }\n            },\n            _click: function (e) {\n                if (e.currentTarget.className.indexOf(SELECTED) !== -1) {\n                    this.calendar.trigger('change');\n                    this.close();\n                }\n            },\n            _option: function (option, value) {\n                var that = this;\n                var calendar = that.calendar;\n                that.options[option] = value;\n                if (calendar) {\n                    calendar[option](value);\n                }\n            }\n        };\n        DateView.normalize = normalize;\n        kendo.DateView = DateView;\n        var DatePicker = Widget.extend({\n            init: function (element, options) {\n                var that = this, disabled, div;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                options.disableDates = kendo.calendar.disabled(options.disableDates);\n                options.min = parse(element.attr('min')) || parse(options.min);\n                options.max = parse(element.attr('max')) || parse(options.max);\n                normalize(options);\n                that._initialOptions = extend({}, options);\n                that._wrapper();\n                that.dateView = new DateView(extend({}, options, {\n                    id: element.attr(ID),\n                    anchor: that.wrapper,\n                    change: function () {\n                        that._change(this.value());\n                        that.close();\n                    },\n                    close: function (e) {\n                        if (that.trigger(CLOSE)) {\n                            e.preventDefault();\n                        } else {\n                            element.attr(ARIA_EXPANDED, false);\n                            div.attr(ARIA_HIDDEN, true);\n                        }\n                    },\n                    open: function (e) {\n                        var options = that.options, date;\n                        if (that.trigger(OPEN)) {\n                            e.preventDefault();\n                        } else {\n                            if (that.element.val() !== that._oldText) {\n                                date = parse(element.val(), options.parseFormats, options.culture);\n                                that.dateView[date ? 'current' : 'value'](date);\n                            }\n                            element.attr(ARIA_EXPANDED, true);\n                            div.attr(ARIA_HIDDEN, false);\n                            that._updateARIA(date);\n                        }\n                    }\n                }));\n                div = that.dateView.div;\n                that._icon();\n                try {\n                    element[0].setAttribute('type', 'text');\n                } catch (e) {\n                    element[0].type = 'text';\n                }\n                element.addClass('k-input').attr({\n                    role: 'combobox',\n                    'aria-expanded': false,\n                    'aria-owns': that.dateView._dateViewID,\n                    'autocomplete': 'off'\n                });\n                that._reset();\n                that._template();\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that._createDateInput(options);\n                that._old = that._update(options.value || that.element.val());\n                that._oldText = element.val();\n                kendo.notify(that);\n            },\n            events: [\n                OPEN,\n                CLOSE,\n                CHANGE\n            ],\n            options: {\n                name: 'DatePicker',\n                value: null,\n                footer: '',\n                format: '',\n                culture: '',\n                parseFormats: [],\n                min: new Date(1900, 0, 1),\n                max: new Date(2099, 11, 31),\n                start: MONTH,\n                depth: MONTH,\n                animation: {},\n                month: {},\n                dates: [],\n                disableDates: null,\n                ARIATemplate: 'Current focused date is #=kendo.toString(data.current, \"D\")#',\n                dateInput: false,\n                weekNumber: false\n            },\n            setOptions: function (options) {\n                var that = this;\n                var value = that._value;\n                Widget.fn.setOptions.call(that, options);\n                options = that.options;\n                options.min = parse(options.min);\n                options.max = parse(options.max);\n                normalize(options);\n                that.dateView.setOptions(options);\n                that._createDateInput(options);\n                if (!that._dateInput) {\n                    that.element.val(kendo.toString(value, options.format, options.culture));\n                }\n                if (value) {\n                    that._updateARIA(value);\n                }\n            },\n            _editable: function (options) {\n                var that = this, icon = that._dateIcon.off(ns), element = that.element.off(ns), wrapper = that._inputWrapper.off(ns), readonly = options.readonly, disable = options.disable;\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    if (element && element.length) {\n                        element[0].removeAttribute(DISABLED);\n                        element[0].removeAttribute(READONLY);\n                    }\n                    element.attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on('focusout' + ns, proxy(that._blur, that)).on('focus' + ns, function () {\n                        that._inputWrapper.addClass(FOCUSED);\n                    });\n                    icon.on(UP, proxy(that._click, that)).on(MOUSEDOWN, preventDefault);\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    element.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n                if (this._dateInput) {\n                    this._dateInput._editable({\n                        readonly: readonly === undefined ? true : readonly,\n                        disable: false\n                    });\n                }\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n                if (this._dateInput) {\n                    this._dateInput._editable({\n                        readonly: false,\n                        disable: !(enable = enable === undefined ? true : enable)\n                    });\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                that.dateView.destroy();\n                that.element.off(ns);\n                that._dateIcon.off(ns);\n                that._inputWrapper.off(ns);\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            open: function () {\n                this.dateView.open();\n            },\n            close: function () {\n                this.dateView.close();\n            },\n            min: function (value) {\n                return this._option(MIN, value);\n            },\n            max: function (value) {\n                return this._option(MAX, value);\n            },\n            value: function (value) {\n                var that = this;\n                if (value === undefined) {\n                    return that._value;\n                }\n                that._old = that._update(value);\n                if (that._old === null) {\n                    that.element.val('');\n                }\n                that._oldText = that.element.val();\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _blur: function () {\n                var that = this, value = that.element.val();\n                that.close();\n                if (value !== that._oldText) {\n                    that._change(value);\n                }\n                that._inputWrapper.removeClass(FOCUSED);\n            },\n            _click: function (e) {\n                var that = this;\n                that.dateView.toggle();\n                that._focusElement(e.type);\n            },\n            _focusElement: function (eventType) {\n                var element = this.element;\n                if ((!support.touch || support.mouseAndTouchPresent && !(eventType || '').match(/touch/i)) && element[0] !== activeElement()) {\n                    element.trigger('focus');\n                }\n            },\n            _change: function (value) {\n                var that = this, oldValue = that.element.val(), dateChanged;\n                value = that._update(value);\n                dateChanged = !kendo.calendar.isEqualDate(that._old, value);\n                var valueUpdated = dateChanged && !that._typing;\n                var textFormatted = oldValue !== that.element.val();\n                if (valueUpdated || textFormatted) {\n                    that.element.trigger(CHANGE);\n                }\n                if (dateChanged) {\n                    that._old = value;\n                    that._oldText = that.element.val();\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _keydown: function (e) {\n                var that = this, dateView = that.dateView, value = that.element.val(), handled = false;\n                if (!dateView.popup.visible() && e.keyCode == keys.ENTER && value !== that._oldText) {\n                    that._change(value);\n                } else {\n                    handled = dateView.move(e);\n                    that._updateARIA(dateView._current);\n                    if (!handled) {\n                        that._typing = true;\n                    } else if (that._dateInput && e.stopImmediatePropagation) {\n                        e.stopImmediatePropagation();\n                    }\n                }\n            },\n            _icon: function () {\n                var that = this, element = that.element, icon;\n                icon = element.next('span.k-select');\n                if (!icon[0]) {\n                    icon = $('<span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-calendar\"></span></span>').insertAfter(element);\n                }\n                that._dateIcon = icon.attr({\n                    'role': 'button',\n                    'aria-controls': that.dateView._dateViewID\n                });\n            },\n            _option: function (option, value) {\n                var that = this, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = parse(value, options.parseFormats, options.culture);\n                if (!value) {\n                    return;\n                }\n                options[option] = new DATE(+value);\n                that.dateView[option](value);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max, current = that._value, date = parse(value, options.parseFormats, options.culture), isSameType = date === null && current === null || date instanceof Date && current instanceof Date, formattedValue;\n                if (options.disableDates(date)) {\n                    date = null;\n                    if (!that._old && !that.element.val()) {\n                        value = null;\n                    }\n                }\n                if (+date === +current && isSameType) {\n                    formattedValue = kendo.toString(date, options.format, options.culture);\n                    if (formattedValue !== value) {\n                        that.element.val(date === null ? value : formattedValue);\n                    }\n                    return date;\n                }\n                if (date !== null && isEqualDatePart(date, min)) {\n                    date = restrictValue(date, min, max);\n                } else if (!isInRange(date, min, max)) {\n                    date = null;\n                }\n                that._value = date;\n                that.dateView.value(date);\n                if (that._dateInput && date) {\n                    that._dateInput.value(date || value);\n                } else {\n                    that.element.val(kendo.toString(date || value, options.format, options.culture));\n                }\n                that._updateARIA(date);\n                return date;\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, wrapper;\n                wrapper = element.parents('.k-datepicker');\n                if (!wrapper[0]) {\n                    wrapper = element.wrap(SPAN).parent().addClass('k-picker-wrap k-state-default');\n                    wrapper = wrapper.wrap(SPAN).parent();\n                }\n                wrapper[0].style.cssText = element[0].style.cssText;\n                element.css({\n                    width: '100%',\n                    height: element[0].style.height\n                });\n                that.wrapper = wrapper.addClass('k-widget k-datepicker').addClass(element[0].className);\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        that.value(element[0].defaultValue);\n                        that.max(that._initialOptions.max);\n                        that.min(that._initialOptions.min);\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _template: function () {\n                this._ariaTemplate = template(this.options.ARIATemplate);\n            },\n            _createDateInput: function (options) {\n                if (this._dateInput) {\n                    this._dateInput.destroy();\n                    this._dateInput = null;\n                }\n                if (options.dateInput) {\n                    this._dateInput = new ui.DateInput(this.element, {\n                        culture: options.culture,\n                        format: options.format,\n                        min: options.min,\n                        max: options.max\n                    });\n                }\n            },\n            _updateARIA: function (date) {\n                var cell;\n                var that = this;\n                var calendar = that.dateView.calendar;\n                if (that.element && that.element.length) {\n                    that.element[0].removeAttribute('aria-activedescendant');\n                }\n                if (calendar) {\n                    cell = calendar._cell;\n                    cell.attr('aria-label', that._ariaTemplate({ current: date || calendar.current() }));\n                    that.element.attr('aria-activedescendant', cell.attr('id'));\n                }\n            }\n        });\n        ui.plugin(DatePicker);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.numerictextbox', [\n        'kendo.core',\n        'kendo.userevents'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'numerictextbox',\n        name: 'NumericTextBox',\n        category: 'web',\n        description: 'The NumericTextBox widget can format and display numeric, percentage or currency textbox.',\n        depends: [\n            'core',\n            'userevents'\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, caret = kendo.caret, keys = kendo.keys, ui = kendo.ui, Widget = ui.Widget, activeElement = kendo._activeElement, extractFormat = kendo._extractFormat, parse = kendo.parseFloat, placeholderSupported = kendo.support.placeholder, getCulture = kendo.getCulture, CHANGE = 'change', DISABLED = 'disabled', READONLY = 'readonly', INPUT = 'k-input', SPIN = 'spin', ns = '.kendoNumericTextBox', TOUCHEND = 'touchend', MOUSELEAVE = 'mouseleave' + ns, HOVEREVENTS = 'mouseenter' + ns + ' ' + MOUSELEAVE, DEFAULT = 'k-state-default', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', FOCUS = 'focus', POINT = '.', CLASS_ICON = 'k-icon', SELECTED = 'k-state-selected', STATEDISABLED = 'k-state-disabled', STATE_INVALID = 'k-state-invalid', ARIA_DISABLED = 'aria-disabled', INTEGER_REGEXP = /^(-)?(\\d*)$/, NULL = null, proxy = $.proxy, extend = $.extend;\n        var NumericTextBox = Widget.extend({\n            init: function (element, options) {\n                var that = this, isStep = options && options.step !== undefined, min, max, step, value, disabled;\n                var inputType;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focusout' + ns, proxy(that._focusout, that)).attr('role', 'spinbutton');\n                options.placeholder = options.placeholder || element.attr('placeholder');\n                min = that.min(element.attr('min'));\n                max = that.max(element.attr('max'));\n                step = that._parse(element.attr('step'));\n                if (options.min === NULL && min !== NULL) {\n                    options.min = min;\n                }\n                if (options.max === NULL && max !== NULL) {\n                    options.max = max;\n                }\n                if (!isStep && step !== NULL) {\n                    options.step = step;\n                }\n                that._initialOptions = extend({}, options);\n                inputType = element.attr('type');\n                that._reset();\n                that._wrapper();\n                that._arrows();\n                that._validation();\n                that._input();\n                if (!kendo.support.mobileOS) {\n                    that._text.on(FOCUS + ns, proxy(that._click, that));\n                } else {\n                    that._text.on(TOUCHEND + ns + ' ' + FOCUS + ns, function () {\n                        if (kendo.support.browser.edge) {\n                            that._text.one(FOCUS + ns, function () {\n                                that._toggleText(false);\n                                element.focus();\n                            });\n                        } else {\n                            that._toggleText(false);\n                            element.focus();\n                        }\n                    });\n                }\n                element.attr('aria-valuemin', options.min !== NULL ? options.min * options.factor : options.min).attr('aria-valuemax', options.max !== NULL ? options.max * options.factor : options.max);\n                options.format = extractFormat(options.format);\n                value = options.value;\n                if (value == NULL) {\n                    if (inputType == 'number') {\n                        value = parseFloat(element.val());\n                    } else {\n                        value = element.val();\n                    }\n                }\n                that.value(value);\n                disabled = element.is('[disabled]') || $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(element.is('[readonly]'));\n                }\n                that.angular('compile', function () {\n                    return { elements: that._text.get() };\n                });\n                kendo.notify(that);\n            },\n            options: {\n                name: 'NumericTextBox',\n                decimals: NULL,\n                restrictDecimals: false,\n                min: NULL,\n                max: NULL,\n                value: NULL,\n                step: 1,\n                round: true,\n                culture: '',\n                format: 'n',\n                spinners: true,\n                placeholder: '',\n                factor: 1,\n                upArrowText: 'Increase value',\n                downArrowText: 'Decrease value'\n            },\n            events: [\n                CHANGE,\n                SPIN\n            ],\n            _editable: function (options) {\n                var that = this, element = that.element, disable = options.disable, readonly = options.readonly, text = that._text.add(element), wrapper = that._inputWrapper.off(HOVEREVENTS);\n                that._toggleText(true);\n                that._upArrowEventHandler.unbind('press');\n                that._downArrowEventHandler.unbind('press');\n                element.off('keydown' + ns).off('keypress' + ns).off('keyup' + ns).off('paste' + ns);\n                if (!readonly && !disable) {\n                    wrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    text.removeAttr(DISABLED).removeAttr(READONLY).attr(ARIA_DISABLED, false);\n                    that._upArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(1);\n                        that._upArrow.addClass(SELECTED);\n                    });\n                    that._downArrowEventHandler.bind('press', function (e) {\n                        e.preventDefault();\n                        that._spin(-1);\n                        that._downArrow.addClass(SELECTED);\n                    });\n                    that.element.on('keydown' + ns, proxy(that._keydown, that)).on('keypress' + ns, proxy(that._keypress, that)).on('keyup' + ns, proxy(that._keyup, that)).on('paste' + ns, proxy(that._paste, that));\n                } else {\n                    wrapper.addClass(disable ? STATEDISABLED : DEFAULT).removeClass(disable ? DEFAULT : STATEDISABLED);\n                    text.attr(DISABLED, disable).attr(READONLY, readonly).attr(ARIA_DISABLED, disable);\n                }\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            setOptions: function (options) {\n                var that = this;\n                Widget.fn.setOptions.call(that, options);\n                that._arrowsWrap.toggle(that.options.spinners);\n                that._inputWrapper.toggleClass('k-expand-padding', !that.options.spinners);\n                that._text.prop('placeholder', that.options.placeholder);\n                that._placeholder(that.options.placeholder);\n                that.element.attr({\n                    'aria-valuemin': that.options.min !== NULL ? that.options.min * that.options.factor : that.options.min,\n                    'aria-valuemax': that.options.max !== NULL ? that.options.max * that.options.factor : that.options.max\n                });\n                that.options.format = extractFormat(that.options.format);\n                if (options.value !== undefined) {\n                    that.value(options.value);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                that.element.add(that._text).add(that._upArrow).add(that._downArrow).add(that._inputWrapper).off(ns);\n                that._upArrowEventHandler.destroy();\n                that._downArrowEventHandler.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n                Widget.fn.destroy.call(that);\n            },\n            min: function (value) {\n                return this._option('min', value);\n            },\n            max: function (value) {\n                return this._option('max', value);\n            },\n            step: function (value) {\n                return this._option('step', value);\n            },\n            value: function (value) {\n                var that = this, adjusted;\n                if (value === undefined) {\n                    return that._value;\n                }\n                value = that._parse(value);\n                adjusted = that._adjust(value);\n                if (value !== adjusted) {\n                    return;\n                }\n                that._update(value);\n                that._old = that._value;\n            },\n            focus: function () {\n                this._focusin();\n            },\n            _adjust: function (value) {\n                var that = this, options = that.options, min = options.min, max = options.max;\n                if (value === NULL) {\n                    return value;\n                }\n                if (min !== NULL && value < min) {\n                    value = min;\n                } else if (max !== NULL && value > max) {\n                    value = max;\n                }\n                return value;\n            },\n            _arrows: function () {\n                var that = this, arrows, _release = function () {\n                        clearTimeout(that._spinning);\n                        arrows.removeClass(SELECTED);\n                    }, options = that.options, spinners = options.spinners, element = that.element;\n                arrows = element.siblings('.' + CLASS_ICON);\n                if (!arrows[0]) {\n                    arrows = $(buttonHtml('increase', options.upArrowText) + buttonHtml('decrease', options.downArrowText)).insertAfter(element);\n                    that._arrowsWrap = arrows.wrapAll('<span class=\"k-select\"/>').parent();\n                }\n                if (!spinners) {\n                    arrows.parent().toggle(spinners);\n                    that._inputWrapper.addClass('k-expand-padding');\n                }\n                that._upArrow = arrows.eq(0);\n                that._upArrowEventHandler = new kendo.UserEvents(that._upArrow, { release: _release });\n                that._downArrow = arrows.eq(1);\n                that._downArrowEventHandler = new kendo.UserEvents(that._downArrow, { release: _release });\n            },\n            _validation: function () {\n                var that = this;\n                var element = that.element;\n                that._validationIcon = $('<span class=\\'' + CLASS_ICON + ' k-i-warning\\'></span>').hide().insertAfter(element);\n            },\n            _blur: function () {\n                var that = this;\n                that._toggleText(true);\n                that._change(that.element.val());\n            },\n            _click: function (e) {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._focusing = setTimeout(function () {\n                    var input = e.target, idx = caret(input)[0], value = input.value.substring(0, idx), format = that._format(that.options.format), group = format[','], result, groupRegExp, extractRegExp, caretPosition = 0;\n                    if (group) {\n                        groupRegExp = new RegExp('\\\\' + group, 'g');\n                        extractRegExp = new RegExp('(^(-)$)|(^(-)?([\\\\d\\\\' + group + ']+)(\\\\' + format[POINT] + ')?(\\\\d+)?)');\n                    }\n                    if (extractRegExp) {\n                        result = extractRegExp.exec(value);\n                    }\n                    if (result) {\n                        caretPosition = result[0].replace(groupRegExp, '').length;\n                        if (value.indexOf('(') != -1 && that._value < 0) {\n                            caretPosition++;\n                        }\n                    }\n                    that._focusin();\n                    caret(that.element[0], caretPosition);\n                });\n            },\n            _change: function (value) {\n                var that = this, factor = that.options.factor;\n                if (factor && factor !== 1) {\n                    value = kendo.parseFloat(value);\n                    if (value !== null) {\n                        value = value / factor;\n                    }\n                }\n                that._update(value);\n                value = that._value;\n                if (that._old != value) {\n                    that._old = value;\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that._typing = false;\n            },\n            _culture: function (culture) {\n                return culture || getCulture(this.options.culture);\n            },\n            _focusin: function () {\n                var that = this;\n                that._inputWrapper.addClass(FOCUSED);\n                that._toggleText(false);\n                that.element[0].focus();\n            },\n            _focusout: function () {\n                var that = this;\n                clearTimeout(that._focusing);\n                that._inputWrapper.removeClass(FOCUSED).removeClass(HOVER);\n                that._blur();\n                that._removeInvalidState();\n            },\n            _format: function (format, culture) {\n                var numberFormat = this._culture(culture).numberFormat;\n                format = format.toLowerCase();\n                if (format.indexOf('c') > -1) {\n                    numberFormat = numberFormat.currency;\n                } else if (format.indexOf('p') > -1) {\n                    numberFormat = numberFormat.percent;\n                }\n                return numberFormat;\n            },\n            _input: function () {\n                var that = this, options = that.options, CLASSNAME = 'k-formatted-value', element = that.element.addClass(INPUT).show()[0], accessKey = element.accessKey, wrapper = that.wrapper, text;\n                text = wrapper.find(POINT + CLASSNAME);\n                if (!text[0]) {\n                    text = $('<input type=\"text\"/>').insertBefore(element).addClass(CLASSNAME);\n                }\n                try {\n                    element.setAttribute('type', 'text');\n                } catch (e) {\n                    element.type = 'text';\n                }\n                text[0].title = element.title;\n                text[0].tabIndex = element.tabIndex;\n                text[0].style.cssText = element.style.cssText;\n                text.prop('placeholder', options.placeholder);\n                if (accessKey) {\n                    text.attr('accesskey', accessKey);\n                    element.accessKey = '';\n                }\n                that._text = text.addClass(element.className).attr({\n                    'role': 'spinbutton',\n                    'aria-valuemin': options.min !== NULL ? options.min * options.factor : options.min,\n                    'aria-valuemax': options.max !== NULL ? options.max * options.factor : options.max,\n                    'autocomplete': 'off'\n                });\n            },\n            _keydown: function (e) {\n                var that = this, key = e.keyCode;\n                that._key = key;\n                if (key == keys.DOWN) {\n                    that._step(-1);\n                } else if (key == keys.UP) {\n                    that._step(1);\n                } else if (key == keys.ENTER) {\n                    that._change(that.element.val());\n                } else if (key != keys.TAB) {\n                    that._typing = true;\n                }\n            },\n            _keypress: function (e) {\n                if (e.which === 0 || e.metaKey || e.ctrlKey || e.keyCode === keys.BACKSPACE || e.keyCode === keys.ENTER) {\n                    return;\n                }\n                var that = this;\n                var min = that.options.min;\n                var element = that.element;\n                var selection = caret(element);\n                var selectionStart = selection[0];\n                var selectionEnd = selection[1];\n                var character = String.fromCharCode(e.which);\n                var numberFormat = that._format(that.options.format);\n                var isNumPadDecimal = that._key === keys.NUMPAD_DOT;\n                var value = element.val();\n                var isValid;\n                if (isNumPadDecimal) {\n                    character = numberFormat[POINT];\n                }\n                value = value.substring(0, selectionStart) + character + value.substring(selectionEnd);\n                isValid = that._numericRegex(numberFormat).test(value);\n                if (isValid && isNumPadDecimal) {\n                    element.val(value);\n                    caret(element, selectionStart + character.length);\n                    e.preventDefault();\n                } else if (min !== null && min >= 0 && value.charAt(0) === '-' || !isValid) {\n                    that._addInvalidState();\n                    e.preventDefault();\n                }\n                that._key = 0;\n            },\n            _keyup: function () {\n                this._removeInvalidState();\n            },\n            _addInvalidState: function () {\n                var that = this;\n                that._inputWrapper.addClass(STATE_INVALID);\n                that._validationIcon.show();\n            },\n            _removeInvalidState: function () {\n                var that = this;\n                that._inputWrapper.removeClass(STATE_INVALID);\n                that._validationIcon.hide();\n            },\n            _numericRegex: function (numberFormat) {\n                var that = this;\n                var separator = numberFormat[POINT];\n                var precision = that.options.decimals;\n                var fractionRule = '*';\n                if (separator === POINT) {\n                    separator = '\\\\' + separator;\n                }\n                if (precision === NULL) {\n                    precision = numberFormat.decimals;\n                }\n                if (precision === 0 && that.options.restrictDecimals) {\n                    return INTEGER_REGEXP;\n                }\n                if (that.options.restrictDecimals) {\n                    fractionRule = '{0,' + precision + '}';\n                }\n                if (that._separator !== separator) {\n                    that._separator = separator;\n                    that._floatRegExp = new RegExp('^(-)?(((\\\\d+(' + separator + '\\\\d' + fractionRule + ')?)|(' + separator + '\\\\d' + fractionRule + ')))?$');\n                }\n                return that._floatRegExp;\n            },\n            _paste: function (e) {\n                var that = this;\n                var element = e.target;\n                var value = element.value;\n                var numberFormat = that._format(that.options.format);\n                setTimeout(function () {\n                    var result = that._parse(element.value);\n                    if (result === NULL) {\n                        that._update(value);\n                    } else {\n                        element.value = result.toString().replace(POINT, numberFormat[POINT]);\n                        if (that._adjust(result) !== result || !that._numericRegex(numberFormat).test(element.value)) {\n                            that._update(value);\n                        }\n                    }\n                });\n            },\n            _option: function (option, value) {\n                var that = this, element = that.element, options = that.options;\n                if (value === undefined) {\n                    return options[option];\n                }\n                value = that._parse(value);\n                if (!value && option === 'step') {\n                    return;\n                }\n                options[option] = value;\n                element.add(that._text).attr('aria-value' + option, value);\n                element.attr(option, value);\n            },\n            _spin: function (step, timeout) {\n                var that = this;\n                timeout = timeout || 500;\n                clearTimeout(that._spinning);\n                that._spinning = setTimeout(function () {\n                    that._spin(step, 50);\n                }, timeout);\n                that._step(step);\n            },\n            _step: function (step) {\n                var that = this, element = that.element, originalValue = that._value, value = that._parse(element.val()) || 0, precision = that.options.decimals || 2;\n                if (activeElement() != element[0]) {\n                    that._focusin();\n                }\n                if (that.options.factor && value) {\n                    value = value / that.options.factor;\n                }\n                value = +(value + that.options.step * step).toFixed(precision);\n                value = that._adjust(value);\n                that._update(value);\n                that._typing = false;\n                if (originalValue !== value) {\n                    that.trigger(SPIN);\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggleText: function (toggle) {\n                var that = this;\n                that._text.toggle(toggle);\n                that.element.toggle(!toggle);\n            },\n            _parse: function (value, culture) {\n                return parse(value, this._culture(culture), this.options.format);\n            },\n            _round: function (value, precision) {\n                var rounder = this.options.round ? kendo._round : truncate;\n                return rounder(value, precision);\n            },\n            _update: function (value) {\n                var that = this, options = that.options, factor = options.factor, format = options.format, decimals = options.decimals, culture = that._culture(), numberFormat = that._format(format, culture), isNotNull;\n                if (decimals === NULL) {\n                    decimals = numberFormat.decimals;\n                }\n                value = that._parse(value, culture);\n                isNotNull = value !== NULL;\n                if (isNotNull) {\n                    value = parseFloat(that._round(value, decimals), 10);\n                }\n                that._value = value = that._adjust(value);\n                that._placeholder(kendo.toString(value, format, culture));\n                if (isNotNull) {\n                    if (factor) {\n                        value = parseFloat(that._round(value * factor, decimals), 10);\n                    }\n                    value = value.toString();\n                    if (value.indexOf('e') !== -1) {\n                        value = that._round(+value, decimals);\n                    }\n                    value = value.replace(POINT, numberFormat[POINT]);\n                } else {\n                    value = null;\n                }\n                that.element.val(value);\n                that.element.add(that._text).attr('aria-valuenow', value);\n            },\n            _placeholder: function (value) {\n                var input = this._text;\n                input.val(value);\n                if (!placeholderSupported && !value) {\n                    input.val(this.options.placeholder);\n                }\n                input.attr('title', this.element.attr('title') || input.val());\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMElement = element[0], wrapper;\n                wrapper = element.parents('.k-numerictextbox');\n                if (!wrapper.is('span.k-numerictextbox')) {\n                    wrapper = element.hide().wrap('<span class=\"k-numeric-wrap k-state-default\" />').parent();\n                    wrapper = wrapper.wrap('<span/>').parent();\n                }\n                wrapper[0].style.cssText = DOMElement.style.cssText;\n                DOMElement.style.width = '';\n                that.wrapper = wrapper.addClass('k-widget k-numerictextbox').addClass(DOMElement.className).css('display', '');\n                that._inputWrapper = $(wrapper[0].firstChild);\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(element[0].value);\n                            that.max(that._initialOptions.max);\n                            that.min(that._initialOptions.min);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            }\n        });\n        function buttonHtml(direction, text) {\n            var className = 'k-i-arrow-' + (direction === 'increase' ? '60-up' : '60-down');\n            return '<span unselectable=\"on\" class=\"k-link k-link-' + direction + '\" aria-label=\"' + text + '\" title=\"' + text + '\">' + '<span unselectable=\"on\" class=\"' + CLASS_ICON + ' ' + className + '\"></span>' + '</span>';\n        }\n        function truncate(value, precision) {\n            var parts = parseFloat(value, 10).toString().split(POINT);\n            if (parts[1]) {\n                parts[1] = parts[1].substring(0, precision);\n            }\n            return parts.join(POINT);\n        }\n        ui.plugin(NumericTextBox);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.validator', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'validator',\n        name: 'Validator',\n        category: 'web',\n        description: 'The Validator offers an easy way to do a client-side form validation.',\n        depends: ['core']\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, NS = '.kendoValidator', INVALIDMSG = 'k-invalid-msg', invalidMsgRegExp = new RegExp(INVALIDMSG, 'i'), INVALIDINPUT = 'k-invalid', VALIDINPUT = 'k-valid', emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i, urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i, INPUTSELECTOR = ':input:not(:button,[type=submit],[type=reset],[disabled],[readonly])', CHECKBOXSELECTOR = ':checkbox:not([disabled],[readonly])', NUMBERINPUTSELECTOR = '[type=number],[type=range]', BLUR = 'blur', NAME = 'name', FORM = 'form', NOVALIDATE = 'novalidate', VALIDATE = 'validate', CHANGE = 'change', VALIDATE_INPUT = 'validateInput', proxy = $.proxy, patternMatcher = function (value, pattern) {\n                if (typeof pattern === 'string') {\n                    pattern = new RegExp('^(?:' + pattern + ')$');\n                }\n                return pattern.test(value);\n            }, matcher = function (input, selector, pattern) {\n                var value = input.val();\n                if (input.filter(selector).length && value !== '') {\n                    return patternMatcher(value, pattern);\n                }\n                return true;\n            }, hasAttribute = function (input, name) {\n                if (input.length) {\n                    return input[0].attributes[name] != null;\n                }\n                return false;\n            };\n        if (!kendo.ui.validator) {\n            kendo.ui.validator = {\n                rules: {},\n                messages: {}\n            };\n        }\n        function resolveRules(element) {\n            var resolvers = kendo.ui.validator.ruleResolvers || {}, rules = {}, name;\n            for (name in resolvers) {\n                $.extend(true, rules, resolvers[name].resolve(element));\n            }\n            return rules;\n        }\n        function decode(value) {\n            return value.replace(/&amp/g, '&amp;').replace(/&quot;/g, '\"').replace(/&#39;/g, '\\'').replace(/&lt;/g, '<').replace(/&gt;/g, '>');\n        }\n        function numberOfDecimalDigits(value) {\n            value = (value + '').split('.');\n            if (value.length > 1) {\n                return value[1].length;\n            }\n            return 0;\n        }\n        function parseHtml(text) {\n            if ($.parseHTML) {\n                return $($.parseHTML(text));\n            }\n            return $(text);\n        }\n        function searchForMessageContainer(elements, fieldName) {\n            var containers = $(), element, attr;\n            for (var idx = 0, length = elements.length; idx < length; idx++) {\n                element = elements[idx];\n                if (invalidMsgRegExp.test(element.className)) {\n                    attr = element.getAttribute(kendo.attr('for'));\n                    if (attr === fieldName) {\n                        containers = containers.add(element);\n                    }\n                }\n            }\n            return containers;\n        }\n        var Validator = Widget.extend({\n            init: function (element, options) {\n                var that = this, resolved = resolveRules(element), validateAttributeSelector = '[' + kendo.attr('validate') + '!=false]';\n                options = options || {};\n                options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n                options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n                Widget.fn.init.call(that, element, options);\n                that._errorTemplate = kendo.template(that.options.errorTemplate);\n                if (that.element.is(FORM)) {\n                    that.element.attr(NOVALIDATE, NOVALIDATE);\n                }\n                that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n                that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n                that._errors = {};\n                that._attachEvents();\n                that._isValidated = false;\n            },\n            events: [\n                VALIDATE,\n                CHANGE,\n                VALIDATE_INPUT\n            ],\n            options: {\n                name: 'Validator',\n                errorTemplate: '<span class=\"k-widget k-tooltip k-tooltip-validation\">' + '<span class=\"k-icon k-i-warning\"> </span> #=message#</span>',\n                messages: {\n                    required: '{0} is required',\n                    pattern: '{0} is not valid',\n                    min: '{0} should be greater than or equal to {1}',\n                    max: '{0} should be smaller than or equal to {1}',\n                    step: '{0} is not valid',\n                    email: '{0} is not valid email',\n                    url: '{0} is not valid URL',\n                    date: '{0} is not valid date',\n                    dateCompare: 'End date should be greater than or equal to the start date'\n                },\n                rules: {\n                    required: function (input) {\n                        var checkbox = input.filter('[type=checkbox]').length && !input.is(':checked'), value = input.val();\n                        return !(hasAttribute(input, 'required') && (!value || value === '' || value.length === 0 || checkbox));\n                    },\n                    pattern: function (input) {\n                        if (input.filter('[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]').filter('[pattern]').length && input.val() !== '') {\n                            return patternMatcher(input.val(), input.attr('pattern'));\n                        }\n                        return true;\n                    },\n                    min: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[min]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, val = kendo.parseFloat(input.val());\n                            return min <= val;\n                        }\n                        return true;\n                    },\n                    max: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[max]').length && input.val() !== '') {\n                            var max = parseFloat(input.attr('max')) || 0, val = kendo.parseFloat(input.val());\n                            return max >= val;\n                        }\n                        return true;\n                    },\n                    step: function (input) {\n                        if (input.filter(NUMBERINPUTSELECTOR + ',[' + kendo.attr('type') + '=number]').filter('[step]').length && input.val() !== '') {\n                            var min = parseFloat(input.attr('min')) || 0, step = parseFloat(input.attr('step')) || 1, val = parseFloat(input.val()), decimals = numberOfDecimalDigits(step), raise;\n                            if (decimals) {\n                                raise = Math.pow(10, decimals);\n                                return Math.floor((val - min) * raise) % (step * raise) / Math.pow(100, decimals) === 0;\n                            }\n                            return (val - min) % step === 0;\n                        }\n                        return true;\n                    },\n                    email: function (input) {\n                        return matcher(input, '[type=email],[' + kendo.attr('type') + '=email]', emailRegExp);\n                    },\n                    url: function (input) {\n                        return matcher(input, '[type=url],[' + kendo.attr('type') + '=url]', urlRegExp);\n                    },\n                    date: function (input) {\n                        if (input.filter('[type^=date],[' + kendo.attr('type') + '=date]').length && input.val() !== '') {\n                            return kendo.parseDate(input.val(), input.attr(kendo.attr('format'))) !== null;\n                        }\n                        return true;\n                    }\n                },\n                validateOnBlur: true\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n            },\n            value: function () {\n                if (!this._isValidated) {\n                    return false;\n                }\n                return this.errors().length === 0;\n            },\n            _submit: function (e) {\n                if (!this.validate()) {\n                    e.stopPropagation();\n                    e.stopImmediatePropagation();\n                    e.preventDefault();\n                    return false;\n                }\n                return true;\n            },\n            _checkElement: function (element) {\n                var state = this.value();\n                this.validateInput(element);\n                if (this.value() !== state) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _attachEvents: function () {\n                var that = this;\n                if (that.element.is(FORM)) {\n                    that.element.on('submit' + NS, proxy(that._submit, that));\n                }\n                if (that.options.validateOnBlur) {\n                    if (!that.element.is(INPUTSELECTOR)) {\n                        that.element.on(BLUR + NS, that._inputSelector, function () {\n                            that._checkElement($(this));\n                        });\n                        that.element.on('click' + NS, that._checkboxSelector, function () {\n                            that._checkElement($(this));\n                        });\n                    } else {\n                        that.element.on(BLUR + NS, function () {\n                            that._checkElement(that.element);\n                        });\n                        if (that.element.is(CHECKBOXSELECTOR)) {\n                            that.element.on('click' + NS, function () {\n                                that._checkElement(that.element);\n                            });\n                        }\n                    }\n                }\n            },\n            validate: function () {\n                var inputs;\n                var idx;\n                var result = false;\n                var length;\n                var isValid = this.value();\n                this._errors = {};\n                if (!this.element.is(INPUTSELECTOR)) {\n                    var invalid = false;\n                    inputs = this.element.find(this._inputSelector);\n                    for (idx = 0, length = inputs.length; idx < length; idx++) {\n                        if (!this.validateInput(inputs.eq(idx))) {\n                            invalid = true;\n                        }\n                    }\n                    result = !invalid;\n                } else {\n                    result = this.validateInput(this.element);\n                }\n                this.trigger(VALIDATE, { valid: result });\n                if (isValid !== result) {\n                    this.trigger(CHANGE);\n                }\n                return result;\n            },\n            validateInput: function (input) {\n                input = $(input);\n                this._isValidated = true;\n                var that = this, template = that._errorTemplate, result = that._checkValidity(input), valid = result.valid, className = '.' + INVALIDMSG, fieldName = input.attr(NAME) || '', lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function () {\n                        var element = $(this);\n                        if (element.filter('[' + kendo.attr('for') + ']').length) {\n                            return element.attr(kendo.attr('for')) === fieldName;\n                        }\n                        return true;\n                    })).hide(), messageText, wasValid = !input.attr('aria-invalid');\n                input.removeAttr('aria-invalid');\n                if (!valid) {\n                    messageText = that._extractMessage(input, result.key);\n                    that._errors[fieldName] = messageText;\n                    var messageLabel = parseHtml(template({ message: decode(messageText) }));\n                    var lblId = lbl.attr('id');\n                    that._decorateMessageContainer(messageLabel, fieldName);\n                    if (lblId) {\n                        messageLabel.attr('id', lblId);\n                    }\n                    if (!lbl.replaceWith(messageLabel).length) {\n                        messageLabel.insertAfter(input);\n                    }\n                    messageLabel.show();\n                    input.attr('aria-invalid', true);\n                } else {\n                    delete that._errors[fieldName];\n                }\n                if (wasValid !== valid) {\n                    this.trigger(VALIDATE_INPUT, {\n                        valid: valid,\n                        input: input\n                    });\n                }\n                input.toggleClass(INVALIDINPUT, !valid);\n                input.toggleClass(VALIDINPUT, valid);\n                if (kendo.widgetInstance(input)) {\n                    var inputWrap = kendo.widgetInstance(input)._inputWrapper;\n                    if (inputWrap) {\n                        inputWrap.toggleClass(INVALIDINPUT, !valid);\n                        inputWrap.toggleClass(INVALIDINPUT, !valid);\n                    }\n                }\n                return valid;\n            },\n            hideMessages: function () {\n                var that = this, className = '.' + INVALIDMSG, element = that.element;\n                if (!element.is(INPUTSELECTOR)) {\n                    element.find(className).hide();\n                } else {\n                    element.next(className).hide();\n                }\n            },\n            _findMessageContainer: function (fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name, containers = $();\n                for (var idx = 0, length = this.element.length; idx < length; idx++) {\n                    containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName('*'), fieldName));\n                }\n                for (name in locators) {\n                    containers = containers.add(locators[name].locate(this.element, fieldName));\n                }\n                return containers;\n            },\n            _decorateMessageContainer: function (container, fieldName) {\n                var locators = kendo.ui.validator.messageLocators, name;\n                container.addClass(INVALIDMSG).attr(kendo.attr('for'), fieldName || '');\n                for (name in locators) {\n                    locators[name].decorate(container, fieldName);\n                }\n                container.attr('role', 'alert');\n            },\n            _extractMessage: function (input, ruleKey) {\n                var that = this, customMessage = that.options.messages[ruleKey], fieldName = input.attr(NAME), nonDefaultMessage;\n                if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\n                    nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                }\n                customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n                return kendo.format(input.attr(kendo.attr(ruleKey + '-msg')) || input.attr('validationMessage') || nonDefaultMessage || input.attr('title') || customMessage || '', fieldName, input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n            },\n            _checkValidity: function (input) {\n                var rules = this.options.rules, rule;\n                for (rule in rules) {\n                    if (!rules[rule].call(this, input)) {\n                        return {\n                            valid: false,\n                            key: rule\n                        };\n                    }\n                }\n                return { valid: true };\n            },\n            errors: function () {\n                var results = [], errors = this._errors, error;\n                for (error in errors) {\n                    results.push(errors[error]);\n                }\n                return results;\n            }\n        });\n        kendo.ui.plugin(Validator);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.editable', [\n        'kendo.datepicker',\n        'kendo.numerictextbox',\n        'kendo.validator',\n        'kendo.binder'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'editable',\n        name: 'Editable',\n        category: 'framework',\n        depends: [\n            'datepicker',\n            'numerictextbox',\n            'validator',\n            'binder'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, extend = $.extend, oldIE = kendo.support.browser.msie && kendo.support.browser.version < 9, isFunction = kendo.isFunction, isPlainObject = $.isPlainObject, inArray = $.inArray, POINT = '.', support = kendo.support, AUTOCOMPLETEVALUE = support.browser.chrome ? 'disabled' : 'off', nameSpecialCharRegExp = /(\"|\\%|'|\\[|\\]|\\$|\\.|\\,|\\:|\\;|\\+|\\*|\\&|\\!|\\#|\\(|\\)|<|>|\\=|\\?|\\@|\\^|\\{|\\}|\\~|\\/|\\||`)/g, ERRORTEMPLATE = '<div class=\"k-widget k-tooltip k-tooltip-validation\" style=\"margin:0.5em\"><span class=\"k-icon k-i-warning\"> </span>' + '#=message#<div class=\"k-callout k-callout-n\"></div></div>', CHANGE = 'change';\n        var EQUAL_SET = 'equalSet';\n        var specialRules = [\n            'url',\n            'email',\n            'number',\n            'date',\n            'boolean'\n        ];\n        function fieldType(field) {\n            field = field != null ? field : '';\n            return field.type || $.type(field) || 'string';\n        }\n        function convertToValueBinding(container) {\n            container.find(':input:not(:button, .k-combobox .k-input, [' + kendo.attr('role') + '=listbox], [' + kendo.attr('role') + '=upload], [' + kendo.attr('skip') + '], [type=file])').each(function () {\n                var bindAttr = kendo.attr('bind'), binding = this.getAttribute(bindAttr) || '', bindingName = this.type === 'checkbox' || this.type === 'radio' ? 'checked:' : 'value:', fieldName = this.name;\n                if (binding.indexOf(bindingName) === -1 && fieldName) {\n                    binding += (binding.length ? ',' : '') + bindingName + fieldName;\n                    $(this).attr(bindAttr, binding);\n                }\n            });\n        }\n        function createAttributes(options) {\n            var field = (options.model.fields || options.model)[options.field], type = fieldType(field), validation = field ? field.validation : {}, ruleName, DATATYPE = kendo.attr('type'), BINDING = kendo.attr('bind'), rule, attr = {\n                    name: options.field,\n                    title: options.title ? options.title : options.field\n                };\n            for (ruleName in validation) {\n                rule = validation[ruleName];\n                if (inArray(ruleName, specialRules) >= 0) {\n                    attr[DATATYPE] = ruleName;\n                } else if (!isFunction(rule)) {\n                    var culture = kendo.getCulture();\n                    if (typeof rule === 'number' && culture.name.length) {\n                        var numberFormat = culture.numberFormat;\n                        var stringRule = rule.toString().replace(POINT, numberFormat[POINT]);\n                        attr[ruleName] = stringRule;\n                    } else {\n                        attr[ruleName] = isPlainObject(rule) ? rule.value || ruleName : rule;\n                    }\n                }\n                attr[kendo.attr(ruleName + '-msg')] = rule.message;\n                attr.autocomplete = AUTOCOMPLETEVALUE;\n            }\n            if (inArray(type, specialRules) >= 0) {\n                attr[DATATYPE] = type;\n            }\n            attr[BINDING] = (type === 'boolean' ? 'checked:' : 'value:') + options.field;\n            return attr;\n        }\n        function addIdAttribute(container, attr) {\n            var id = container.attr('id');\n            if (id) {\n                attr.id = id;\n                container.removeAttr('id');\n            }\n            return attr;\n        }\n        function convertItems(items) {\n            var idx, length, item, value, text, result;\n            if (items && items.length) {\n                result = [];\n                for (idx = 0, length = items.length; idx < length; idx++) {\n                    item = items[idx];\n                    text = item.text || item.value || item;\n                    value = item.value == null ? item.text || item : item.value;\n                    result[idx] = {\n                        text: text,\n                        value: value\n                    };\n                }\n            }\n            return result;\n        }\n        var editors = {\n            'number': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoNumericTextBox({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'date': function (container, options) {\n                var attr = createAttributes(options), format = options.format;\n                if (format) {\n                    format = kendo._extractFormat(format);\n                }\n                attr[kendo.attr('format')] = format;\n                $('<input type=\"text\"/>').attr(attr).appendTo(container).kendoDatePicker({ format: options.format });\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            },\n            'string': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"text\" class=\"k-textbox\"/>').attr(attr).appendTo(container);\n            },\n            'boolean': function (container, options) {\n                var attr = createAttributes(options);\n                $('<input type=\"checkbox\" />').attr(attr).appendTo(container);\n            },\n            'values': function (container, options) {\n                var attr = createAttributes(options);\n                var items = kendo.stringify(convertItems(options.values));\n                $('<select ' + kendo.attr('text-field') + '=\"text\"' + kendo.attr('value-field') + '=\"value\"' + kendo.attr('source') + '=\\'' + (items ? items.replace(/\\'/g, '&apos;') : items) + '\\'' + kendo.attr('role') + '=\"dropdownlist\"/>').attr(attr).appendTo(container);\n                $('<span ' + kendo.attr('for') + '=\"' + options.field + '\" class=\"k-invalid-msg\"/>').hide().appendTo(container);\n            }\n        };\n        var mobileEditors = {\n            'number': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"number\"/>').attr(attr).appendTo(container);\n            },\n            'date': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"date\"/>').attr(attr).appendTo(container);\n            },\n            'string': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"text\" />').attr(attr).appendTo(container);\n            },\n            'boolean': function (container, options) {\n                var attr = createAttributes(options);\n                attr = addIdAttribute(container, attr);\n                $('<input type=\"checkbox\" />').attr(attr).appendTo(container);\n            },\n            'values': function (container, options) {\n                var attr = createAttributes(options);\n                var items = options.values;\n                var select = $('<select />');\n                attr = addIdAttribute(container, attr);\n                for (var index in items) {\n                    $('<option value=\"' + items[index].value + '\">' + items[index].text + '</option>').appendTo(select);\n                }\n                select.attr(attr).appendTo(container);\n            }\n        };\n        function addValidationRules(modelField, rules) {\n            var validation = modelField ? modelField.validation || {} : {}, rule, descriptor;\n            for (rule in validation) {\n                descriptor = validation[rule];\n                if (isPlainObject(descriptor) && descriptor.value) {\n                    descriptor = descriptor.value;\n                }\n                if (isFunction(descriptor)) {\n                    rules[rule] = descriptor;\n                }\n            }\n        }\n        var Editable = Widget.extend({\n            init: function (element, options) {\n                var that = this;\n                if (options.target) {\n                    options.$angular = options.target.options.$angular;\n                    if (options.target.pane) {\n                        that._isMobile = true;\n                    }\n                }\n                Widget.fn.init.call(that, element, options);\n                that._validateProxy = $.proxy(that._validate, that);\n                that.refresh();\n            },\n            events: [CHANGE],\n            options: {\n                name: 'Editable',\n                editors: editors,\n                mobileEditors: mobileEditors,\n                clearContainer: true,\n                errorTemplate: ERRORTEMPLATE,\n                skipFocus: false\n            },\n            editor: function (field, modelField) {\n                var that = this, editors = that._isMobile ? mobileEditors : that.options.editors, isObject = isPlainObject(field), fieldName = isObject ? field.field : field, model = that.options.model || {}, isValuesEditor = isObject && field.values, type = isValuesEditor ? 'values' : fieldType(modelField), isCustomEditor = isObject && field.editor, editor = isCustomEditor ? field.editor : editors[type], container = that.element.find('[' + kendo.attr('container-for') + '=' + fieldName.replace(nameSpecialCharRegExp, '\\\\$1') + ']');\n                editor = editor ? editor : editors.string;\n                if (isCustomEditor && typeof field.editor === 'string') {\n                    editor = function (container) {\n                        container.append(field.editor);\n                    };\n                }\n                container = container.length ? container : that.element;\n                editor(container, extend(true, {}, isObject ? field : { field: fieldName }, { model: model }));\n            },\n            _validate: function (e) {\n                var that = this, input, value = e.value, preventChangeTrigger = that._validationEventInProgress, values = {}, bindAttribute = kendo.attr('bind'), fieldName = e.field.replace(nameSpecialCharRegExp, '\\\\$1'), bindingRegex = new RegExp('(value|checked)\\\\s*:\\\\s*' + fieldName + '\\\\s*(,|$)');\n                values[e.field] = e.value;\n                input = $(':input[' + bindAttribute + '*=\"' + fieldName + '\"]', that.element).filter('[' + kendo.attr('validate') + '!=\\'false\\']').filter(function () {\n                    return bindingRegex.test($(this).attr(bindAttribute));\n                });\n                if (input.length > 1) {\n                    input = input.filter(function () {\n                        var element = $(this);\n                        return !element.is(':radio') || element.val() == value;\n                    });\n                }\n                try {\n                    that._validationEventInProgress = true;\n                    if (!that.validatable.validateInput(input) || !preventChangeTrigger && that.trigger(CHANGE, { values: values })) {\n                        e.preventDefault();\n                    }\n                } finally {\n                    that._validationEventInProgress = false;\n                }\n            },\n            end: function () {\n                return this.validatable.validate();\n            },\n            destroy: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element };\n                });\n                Widget.fn.destroy.call(that);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.unbind(EQUAL_SET, that._validateProxy);\n                kendo.unbind(that.element);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.destroy(that.element);\n                that.element.removeData('kendoValidator');\n                if (that.element.is('[' + kendo.attr('role') + '=editable]')) {\n                    that.element.removeAttr(kendo.attr('role'));\n                }\n            },\n            refresh: function () {\n                var that = this, idx, length, fields = that.options.fields || [], container = that.options.clearContainer ? that.element.empty() : that.element, model = that.options.model || {}, rules = {}, field, isObject, fieldName, modelField, modelFields;\n                if (!$.isArray(fields)) {\n                    fields = [fields];\n                }\n                for (idx = 0, length = fields.length; idx < length; idx++) {\n                    field = fields[idx];\n                    isObject = isPlainObject(field);\n                    fieldName = isObject ? field.field : field;\n                    modelField = (model.fields || model)[fieldName];\n                    addValidationRules(modelField, rules);\n                    that.editor(field, modelField);\n                }\n                if (that.options.target) {\n                    that.angular('compile', function () {\n                        return {\n                            elements: container,\n                            data: container.map(function () {\n                                return { dataItem: model };\n                            })\n                        };\n                    });\n                }\n                if (!length) {\n                    modelFields = model.fields || model;\n                    for (fieldName in modelFields) {\n                        addValidationRules(modelFields[fieldName], rules);\n                    }\n                }\n                convertToValueBinding(container);\n                if (that.validatable) {\n                    that.validatable.destroy();\n                }\n                kendo.bind(container, that.options.model);\n                that.options.model.unbind('set', that._validateProxy);\n                that.options.model.bind('set', that._validateProxy);\n                that.options.model.unbind(EQUAL_SET, that._validateProxy);\n                that.options.model.bind(EQUAL_SET, that._validateProxy);\n                that.validatable = new kendo.ui.Validator(container, {\n                    validateOnBlur: false,\n                    errorTemplate: that.options.errorTemplate || undefined,\n                    rules: rules\n                });\n                if (!that.options.skipFocus) {\n                    var focusable = container.find(':kendoFocusable').eq(0).focus();\n                    if (oldIE) {\n                        focusable.focus();\n                    }\n                }\n            }\n        });\n        ui.plugin(Editable);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.window', [\n        'kendo.draganddrop',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'window',\n        name: 'Window',\n        category: 'web',\n        description: 'The Window widget displays content in a modal or non-modal HTML window.',\n        depends: [\n            'draganddrop',\n            'popup'\n        ],\n        features: [{\n                id: 'window-fx',\n                name: 'Animation',\n                description: 'Support for animation',\n                depends: ['fx']\n            }]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, Widget = kendo.ui.Widget, TabKeyTrap = kendo.ui.Popup.TabKeyTrap, Draggable = kendo.ui.Draggable, isPlainObject = $.isPlainObject, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, proxy = $.proxy, extend = $.extend, each = $.each, template = kendo.template, BODY = 'body', templates, NS = '.kendoWindow', MODAL_NS = '.kendoWindowModal', KWINDOW = '.k-window', KWINDOWTITLE = '.k-window-title', KWINDOWTITLEBAR = KWINDOWTITLE + 'bar', KWINDOWCONTENT = '.k-window-content', KDIALOGCONTENT = '.k-dialog-content', KWINDOWRESIZEHANDLES = '.k-resize-handle', KOVERLAY = '.k-overlay', KCONTENTFRAME = 'k-content-frame', LOADING = 'k-i-loading', KHOVERSTATE = 'k-state-hover', KFOCUSEDSTATE = 'k-state-focused', MAXIMIZEDSTATE = 'k-window-maximized', VISIBLE = ':visible', HIDDEN = 'hidden', CURSOR = 'cursor', OPEN = 'open', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', CLOSE = 'close', REFRESH = 'refresh', MINIMIZE = 'minimize', MAXIMIZE = 'maximize', RESIZESTART = 'resizeStart', RESIZE = 'resize', RESIZEEND = 'resizeEnd', DRAGSTART = 'dragstart', DRAGEND = 'dragend', ERROR = 'error', OVERFLOW = 'overflow', DATADOCOVERFLOWRULE = 'original-overflow-rule', ZINDEX = 'zIndex', MINIMIZE_MAXIMIZE = '.k-window-actions .k-i-window-minimize,.k-window-actions .k-i-window-maximize', KPIN = '.k-i-pin', KUNPIN = '.k-i-unpin', PIN_UNPIN = KPIN + ',' + KUNPIN, TITLEBAR_BUTTONS = '.k-window-titlebar .k-window-action', REFRESHICON = '.k-window-titlebar .k-i-refresh', WINDOWEVENTSHANDLED = 'WindowEventsHandled', zero = /^0[a-z]*$/i, isLocalUrl = kendo.isLocalUrl, SIZE = {\n                small: 'k-window-sm',\n                medium: 'k-window-md',\n                large: 'k-window-lg'\n            };\n        function defined(x) {\n            return typeof x != 'undefined';\n        }\n        function toInt(element, property) {\n            return parseInt(element.css(property), 10) || 0;\n        }\n        function constrain(value, low, high) {\n            var normalizedValue;\n            if (value && isNaN(value) && value.toString().indexOf('px') < 0) {\n                normalizedValue = value;\n            } else {\n                normalizedValue = Math.max(Math.min(parseInt(value, 10), high === Infinity ? high : parseInt(high, 10)), low === -Infinity ? low : parseInt(low, 10));\n            }\n            return normalizedValue;\n        }\n        function executableScript() {\n            return !this.type || this.type.toLowerCase().indexOf('script') >= 0;\n        }\n        function getPosition(elem) {\n            var result = {\n                    top: elem.offsetTop,\n                    left: elem.offsetLeft\n                }, parent = elem.offsetParent;\n            while (parent) {\n                result.top += parent.offsetTop;\n                result.left += parent.offsetLeft;\n                var parentOverflowX = $(parent).css('overflowX');\n                var parentOverflowY = $(parent).css('overflowY');\n                if (parentOverflowY === 'auto' || parentOverflowY === 'scroll') {\n                    result.top -= parent.scrollTop;\n                }\n                if (parentOverflowX === 'auto' || parentOverflowX === 'scroll') {\n                    result.left -= parent.scrollLeft;\n                }\n                parent = parent.offsetParent;\n            }\n            return result;\n        }\n        var Window = Widget.extend({\n            init: function (element, options) {\n                var that = this, wrapper, offset = {}, visibility, display, position, isVisible = false, content, windowContent, windowFrame, globalWindow, suppressActions = options && options.actions && !options.actions.length, id;\n                Widget.fn.init.call(that, element, options);\n                options = that.options;\n                position = options.position;\n                element = that.element;\n                content = options.content;\n                globalWindow = $(window);\n                if (suppressActions) {\n                    options.actions = [];\n                }\n                that.appendTo = $(options.appendTo);\n                that.containment = options.draggable.containment ? $(options.draggable.containment).first() : null;\n                if (content && !isPlainObject(content)) {\n                    content = options.content = { url: content };\n                }\n                element.find('script').filter(executableScript).remove();\n                if (!element.parent().is(that.appendTo) && !that.containment && (position.top === undefined || position.left === undefined)) {\n                    if (element.is(VISIBLE)) {\n                        offset = element.offset();\n                        isVisible = true;\n                    } else {\n                        visibility = element.css('visibility');\n                        display = element.css('display');\n                        element.css({\n                            visibility: HIDDEN,\n                            display: ''\n                        });\n                        offset = element.offset();\n                        element.css({\n                            visibility: visibility,\n                            display: display\n                        });\n                    }\n                    if (position.top === undefined) {\n                        position.top = offset.top;\n                    }\n                    if (position.left === undefined) {\n                        position.left = offset.left;\n                    }\n                }\n                if (!defined(options.visible) || options.visible === null) {\n                    options.visible = element.is(VISIBLE);\n                }\n                wrapper = that.wrapper = element.closest(KWINDOW);\n                if (!element.is('.k-content') || !wrapper[0]) {\n                    element.addClass('k-window-content k-content');\n                    that._createWindow(element, options);\n                    wrapper = that.wrapper = element.closest(KWINDOW);\n                    that.title(that.options.title);\n                    that._dimensions();\n                }\n                that.minTop = that.minLeft = -Infinity;\n                that.maxTop = that.maxLeft = Infinity;\n                that._position();\n                if (content) {\n                    that.refresh(content);\n                }\n                if (options.visible) {\n                    that.toFront();\n                }\n                windowContent = wrapper.children(KWINDOWCONTENT);\n                that._tabindex(windowContent);\n                if (options.visible && options.modal) {\n                    that._overlay(wrapper.is(VISIBLE)).css({ opacity: 0.5 });\n                }\n                wrapper.on('mouseenter' + NS, TITLEBAR_BUTTONS, proxy(that._buttonEnter, that)).on('mouseleave' + NS, TITLEBAR_BUTTONS, proxy(that._buttonLeave, that)).on('click' + NS, '> ' + TITLEBAR_BUTTONS, proxy(that._windowActionHandler, that)).on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                windowContent.on('keydown' + NS, proxy(that._keydown, that)).on('focus' + NS, proxy(that._focus, that)).on('blur' + NS, proxy(that._blur, that));\n                windowFrame = windowContent.find('.' + KCONTENTFRAME)[0];\n                if (windowFrame && !globalWindow.data(WINDOWEVENTSHANDLED)) {\n                    globalWindow.on('blur' + NS, function () {\n                        var element = $(document.activeElement).parent(KWINDOWCONTENT);\n                        if (element.length) {\n                            var windowInstance = kendo.widgetInstance(element);\n                            windowInstance._focus();\n                        }\n                    });\n                    globalWindow.on('focus' + NS, function () {\n                        $(KWINDOWCONTENT).not(KDIALOGCONTENT).each(function (i, element) {\n                            kendo.widgetInstance($(element))._blur();\n                        });\n                    });\n                    globalWindow.data(WINDOWEVENTSHANDLED, true);\n                }\n                this._resizable();\n                this._draggable();\n                if (options.pinned && this.wrapper.is(':visible')) {\n                    that.pin();\n                }\n                id = element.attr('id');\n                if (id) {\n                    id = id + '_wnd_title';\n                    wrapper.children(KWINDOWTITLEBAR).children(KWINDOWTITLE).attr('id', id);\n                    windowContent.attr({\n                        'role': 'dialog',\n                        'aria-labelledby': id\n                    });\n                }\n                wrapper.add(wrapper.children('.k-resize-handle,' + KWINDOWTITLEBAR)).on('mousedown' + NS, proxy(that.toFront, that));\n                that.touchScroller = kendo.touchScroller(element);\n                that._resizeHandler = proxy(that._onDocumentResize, that);\n                that._marker = kendo.guid().substring(0, 8);\n                $(window).on('resize' + NS + that._marker, that._resizeHandler);\n                if (options.visible) {\n                    that.trigger(OPEN);\n                    that.trigger(ACTIVATE);\n                }\n                kendo.notify(that);\n                if (this.options.modal) {\n                    this._tabKeyTrap = new TabKeyTrap(wrapper);\n                    this._tabKeyTrap.trap();\n                    this._tabKeyTrap.shouldTrap = function () {\n                        return windowContent.data('isFront');\n                    };\n                }\n            },\n            _buttonEnter: function (e) {\n                $(e.currentTarget).addClass(KHOVERSTATE);\n            },\n            _buttonLeave: function (e) {\n                $(e.currentTarget).removeClass(KHOVERSTATE);\n            },\n            _focus: function () {\n                this.wrapper.addClass(KFOCUSEDSTATE);\n            },\n            _blur: function () {\n                this.wrapper.removeClass(KFOCUSEDSTATE);\n            },\n            _dimensions: function () {\n                var wrapper = this.wrapper;\n                var options = this.options;\n                var width = options.width;\n                var height = options.height;\n                var maxHeight = options.maxHeight;\n                var sizeClass = options.size;\n                var dimensions = [\n                    'minWidth',\n                    'minHeight',\n                    'maxWidth',\n                    'maxHeight'\n                ];\n                var contentBoxSizing = wrapper.css('box-sizing') == 'content-box';\n                var lrBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-left-width') + toInt(wrapper, 'border-right-width') : 0;\n                var tbBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-top-width') + toInt(wrapper, 'border-bottom-width') : 0;\n                var paddingTop = contentBoxSizing ? toInt(wrapper, 'padding-top') : 0;\n                if (this.containment && !this._isPinned) {\n                    this._updateBoundaries();\n                    options.maxHeight = Math.min(this.containment.height - (tbBorderWidth + paddingTop), maxHeight);\n                    options.maxWidth = Math.min(this.containment.width - lrBorderWidth, options.maxWidth);\n                }\n                for (var i = 0; i < dimensions.length; i++) {\n                    var value = options[dimensions[i]] || '';\n                    if (value != Infinity) {\n                        wrapper.css(dimensions[i], value);\n                    }\n                }\n                if (maxHeight != Infinity) {\n                    this.element.css('maxHeight', maxHeight);\n                }\n                if (width) {\n                    wrapper.width(constrain(width, options.minWidth, options.maxWidth));\n                } else {\n                    wrapper.width('');\n                }\n                if (height) {\n                    wrapper.height(constrain(height, options.minHeight, options.maxHeight));\n                } else {\n                    wrapper.height('');\n                }\n                if (!options.visible) {\n                    wrapper.hide();\n                }\n                if (sizeClass && SIZE[sizeClass]) {\n                    wrapper.addClass(SIZE[sizeClass]);\n                }\n            },\n            _position: function () {\n                var wrapper = this.wrapper, position = this.options.position;\n                this._updateBoundaries();\n                if (this.containment) {\n                    position.top = Math.min(this.minTop + (position.top || 0), this.maxTop);\n                    position.left = Math.min(this.minLeft + (position.left || 0), this.maxLeft);\n                }\n                if (position.top === 0) {\n                    position.top = position.top.toString();\n                }\n                if (position.left === 0) {\n                    position.left = position.left.toString();\n                }\n                wrapper.css({\n                    top: position.top || '',\n                    left: position.left || ''\n                });\n            },\n            _updateBoundaries: function () {\n                var containment = this.containment;\n                if (!containment) {\n                    return null;\n                }\n                containment.width = containment.innerWidth();\n                containment.height = containment.innerHeight();\n                if (parseInt(containment.width, 10) > containment[0].clientWidth) {\n                    containment.width -= kendo.support.scrollbar();\n                }\n                if (parseInt(containment.height, 10) > containment[0].clientHeight) {\n                    containment.height -= kendo.support.scrollbar();\n                }\n                containment.position = getPosition(containment[0]);\n                if (this._isPinned) {\n                    this.minTop = this.minLeft = -Infinity;\n                    this.maxTop = this.maxLeft = Infinity;\n                } else {\n                    this.minTop = containment.scrollTop();\n                    this.minLeft = containment.scrollLeft();\n                    this.maxLeft = this.minLeft + containment.width - outerWidth(this.wrapper, true);\n                    this.maxTop = this.minTop + containment.height - outerHeight(this.wrapper, true);\n                }\n            },\n            _animationOptions: function (id) {\n                var animation = this.options.animation;\n                var basicAnimation = {\n                    open: { effects: {} },\n                    close: {\n                        hide: true,\n                        effects: {}\n                    }\n                };\n                return animation && animation[id] || basicAnimation[id];\n            },\n            _resize: function () {\n                kendo.resize(this.element.children());\n            },\n            _resizable: function () {\n                var resizable = this.options.resizable;\n                var wrapper = this.wrapper;\n                if (this.resizing) {\n                    wrapper.off('dblclick' + NS).children(KWINDOWRESIZEHANDLES).remove();\n                    this.resizing.destroy();\n                    this.resizing = null;\n                }\n                if (resizable) {\n                    wrapper.on('dblclick' + NS, KWINDOWTITLEBAR, proxy(function (e) {\n                        if (!$(e.target).closest('.k-window-action').length) {\n                            this.toggleMaximization();\n                        }\n                    }, this));\n                    each('n e s w se sw ne nw'.split(' '), function (index, handler) {\n                        wrapper.append(templates.resizeHandle(handler));\n                    });\n                    this.resizing = new WindowResizing(this);\n                }\n                wrapper = null;\n            },\n            _draggable: function () {\n                var draggable = this.options.draggable;\n                if (this.dragging) {\n                    this.dragging.destroy();\n                    this.dragging = null;\n                }\n                if (draggable) {\n                    this.dragging = new WindowDragging(this, draggable.dragHandle || KWINDOWTITLEBAR);\n                }\n            },\n            _actions: function () {\n                var options = this.options;\n                var actions = options.actions;\n                var pinned = options.pinned;\n                var titlebar = this.wrapper.children(KWINDOWTITLEBAR);\n                var container = titlebar.find('.k-window-actions');\n                var windowSpecificCommands = [\n                    'maximize',\n                    'minimize'\n                ];\n                actions = $.map(actions, function (action) {\n                    action = pinned && action.toLowerCase() === 'pin' ? 'unpin' : action;\n                    return { name: windowSpecificCommands.indexOf(action.toLowerCase()) > -1 ? 'window-' + action : action };\n                });\n                container.html(kendo.render(templates.action, actions));\n            },\n            setOptions: function (options) {\n                var that = this;\n                var sizeClass = that.options.size;\n                var cachedOptions = JSON.parse(JSON.stringify(options));\n                extend(options.position, that.options.position);\n                extend(options.position, cachedOptions.position);\n                Widget.fn.setOptions.call(that, options);\n                var scrollable = that.options.scrollable !== false;\n                that.restore();\n                if (typeof options.title !== 'undefined') {\n                    that.title(options.title);\n                }\n                that.wrapper.removeClass(SIZE[sizeClass]);\n                that._dimensions();\n                that._position();\n                that._resizable();\n                that._draggable();\n                that._actions();\n                if (typeof options.modal !== 'undefined') {\n                    var visible = that.options.visible !== false;\n                    that._enableDocumentScrolling();\n                    that._overlay(options.modal && visible);\n                }\n                that.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n            },\n            events: [\n                OPEN,\n                ACTIVATE,\n                DEACTIVATE,\n                CLOSE,\n                MINIMIZE,\n                MAXIMIZE,\n                REFRESH,\n                RESIZESTART,\n                RESIZE,\n                RESIZEEND,\n                DRAGSTART,\n                DRAGEND,\n                ERROR\n            ],\n            options: {\n                name: 'Window',\n                animation: {\n                    open: {\n                        effects: {\n                            zoom: { direction: 'in' },\n                            fade: { direction: 'in' }\n                        },\n                        duration: 350\n                    },\n                    close: {\n                        effects: {\n                            zoom: {\n                                direction: 'out',\n                                properties: { scale: 0.7 }\n                            },\n                            fade: { direction: 'out' }\n                        },\n                        duration: 350,\n                        hide: true\n                    }\n                },\n                title: '',\n                actions: ['Close'],\n                autoFocus: true,\n                modal: false,\n                size: 'auto',\n                resizable: true,\n                draggable: true,\n                minWidth: 90,\n                minHeight: 50,\n                maxWidth: Infinity,\n                maxHeight: Infinity,\n                pinned: false,\n                scrollable: true,\n                position: {},\n                content: null,\n                visible: null,\n                height: null,\n                width: null,\n                appendTo: 'body',\n                isMaximized: false,\n                isMinimized: false\n            },\n            _closable: function () {\n                return $.inArray('close', $.map(this.options.actions, function (x) {\n                    return x.toLowerCase();\n                })) > -1;\n            },\n            _keydown: function (e) {\n                var that = this, options = that.options, keys = kendo.keys, keyCode = e.keyCode, wrapper = that.wrapper, offset, handled, distance = 10, isMaximized = options.isMaximized, isMinimized = options.isMinimized, newWidth, newHeight, w, h;\n                if (keyCode == keys.ESC && that._closable()) {\n                    e.stopPropagation();\n                    that._close(false);\n                }\n                if (e.target != e.currentTarget || that._closing) {\n                    return;\n                }\n                if (e.altKey && keyCode == 82) {\n                    that.refresh();\n                }\n                if (e.altKey && keyCode == 80) {\n                    if (that.options.pinned) {\n                        that.unpin();\n                    } else {\n                        that.pin();\n                    }\n                }\n                if (e.altKey && keyCode == keys.UP) {\n                    if (isMinimized) {\n                        that.restore();\n                        that.element.focus();\n                    } else if (!isMaximized) {\n                        that.maximize();\n                        that.element.focus();\n                    }\n                } else if (e.altKey && keyCode == keys.DOWN) {\n                    if (!isMinimized && !isMaximized) {\n                        that.minimize();\n                        that.wrapper.focus();\n                    } else if (isMaximized) {\n                        that.restore();\n                        that.element.focus();\n                    }\n                }\n                offset = kendo.getOffset(wrapper);\n                if (that.containment && !that._isPinned) {\n                    offset = that.options.position;\n                }\n                if (options.draggable && !e.ctrlKey && !e.altKey && !isMaximized) {\n                    that._updateBoundaries();\n                    if (keyCode == keys.UP) {\n                        offset.top = constrain(offset.top - distance, that.minTop, that.maxTop);\n                        handled = wrapper.css('top', offset.top);\n                    } else if (keyCode == keys.DOWN) {\n                        offset.top = constrain(offset.top + distance, that.minTop, that.maxTop);\n                        handled = wrapper.css('top', offset.top);\n                    } else if (keyCode == keys.LEFT) {\n                        offset.left = constrain(offset.left - distance, that.minLeft, that.maxLeft);\n                        handled = wrapper.css('left', offset.left);\n                    } else if (keyCode == keys.RIGHT) {\n                        offset.left = constrain(offset.left + distance, that.minLeft, that.maxLeft);\n                        handled = wrapper.css('left', offset.left);\n                    }\n                }\n                if (options.resizable && e.ctrlKey && !isMaximized && !isMinimized) {\n                    if (keyCode == keys.UP) {\n                        handled = true;\n                        newHeight = wrapper.height() - distance;\n                    } else if (keyCode == keys.DOWN) {\n                        handled = true;\n                        if (that.containment && !that._isPinned) {\n                            newHeight = Math.min(wrapper.height() + distance, that.containment.height - offset.top - toInt(wrapper, 'padding-top') - toInt(wrapper, 'borderBottomWidth') - toInt(wrapper, 'borderTopWidth'));\n                        } else {\n                            newHeight = wrapper.height() + distance;\n                        }\n                    }\n                    if (keyCode == keys.LEFT) {\n                        handled = true;\n                        newWidth = wrapper.width() - distance;\n                    } else if (keyCode == keys.RIGHT) {\n                        handled = true;\n                        if (that.containment && !that._isPinned) {\n                            newWidth = Math.min(wrapper.width() + distance, that.containment.width - offset.left - toInt(wrapper, 'borderLeftWidth') - toInt(wrapper, 'borderRightWidth'));\n                        } else {\n                            newWidth = wrapper.width() + distance;\n                        }\n                    }\n                    if (handled) {\n                        w = constrain(newWidth, options.minWidth, options.maxWidth);\n                        h = constrain(newHeight, options.minHeight, options.maxHeight);\n                        if (!isNaN(w)) {\n                            wrapper.width(w);\n                            that.options.width = w + 'px';\n                        }\n                        if (!isNaN(h)) {\n                            wrapper.height(h);\n                            that.options.height = h + 'px';\n                        }\n                        that.resize();\n                    }\n                }\n                if (handled) {\n                    e.preventDefault();\n                }\n            },\n            _overlay: function (visible) {\n                var overlay = this.containment ? this.containment.children(KOVERLAY) : this.appendTo.children(KOVERLAY), wrapper = this.wrapper;\n                if (!overlay.length) {\n                    overlay = $('<div class=\\'k-overlay\\' />');\n                }\n                overlay.insertBefore(wrapper[0]).toggle(visible).css(ZINDEX, parseInt(wrapper.css(ZINDEX), 10) - 1);\n                if (this.options.modal.preventScroll && !this.containment) {\n                    this._stopDocumentScrolling();\n                }\n                return overlay;\n            },\n            _actionForIcon: function (icon) {\n                var iconClass = /\\bk-i(-\\w+)+\\b/.exec(icon[0].className)[0];\n                return {\n                    'k-i-close': '_close',\n                    'k-i-window-maximize': 'maximize',\n                    'k-i-window-minimize': 'minimize',\n                    'k-i-window-restore': 'restore',\n                    'k-i-refresh': 'refresh',\n                    'k-i-pin': 'pin',\n                    'k-i-unpin': 'unpin'\n                }[iconClass];\n            },\n            _windowActionHandler: function (e) {\n                if (this._closing) {\n                    return;\n                }\n                var icon = $(e.target).closest('.k-window-action').find('.k-icon');\n                var action = this._actionForIcon(icon);\n                if (action) {\n                    e.preventDefault();\n                    this[action]();\n                    return false;\n                }\n            },\n            _modals: function () {\n                var that = this;\n                var zStack = $(KWINDOW).filter(function () {\n                    var dom = $(this);\n                    var object = that._object(dom);\n                    var options = object && object.options;\n                    return options && options.modal && options.visible && options.appendTo === that.options.appendTo && dom.is(VISIBLE);\n                }).sort(function (a, b) {\n                    return +$(a).css('zIndex') - +$(b).css('zIndex');\n                });\n                that = null;\n                return zStack;\n            },\n            _object: function (element) {\n                var content = element.children(KWINDOWCONTENT);\n                var widget = kendo.widgetInstance(content);\n                if (widget) {\n                    return widget;\n                }\n                return undefined;\n            },\n            center: function () {\n                var that = this, position = that.options.position, wrapper = that.wrapper, documentWindow = $(window), scrollTop = 0, scrollLeft = 0, newTop, newLeft;\n                if (that.options.isMaximized) {\n                    return that;\n                }\n                if (that.options.pinned && !that._isPinned) {\n                    that.pin();\n                }\n                if (!that.options.pinned) {\n                    scrollTop = documentWindow.scrollTop();\n                    scrollLeft = documentWindow.scrollLeft();\n                }\n                if (this.containment && !that.options.pinned) {\n                    newTop = this.minTop + (this.maxTop - this.minTop) / 2;\n                    newLeft = this.minLeft + (this.maxLeft - this.minLeft) / 2;\n                } else {\n                    that._scrollIsAppended = true;\n                    newLeft = scrollLeft + Math.max(0, (documentWindow.width() - wrapper.width()) / 2);\n                    newTop = scrollTop + Math.max(0, (documentWindow.height() - wrapper.height() - toInt(wrapper, 'paddingTop')) / 2);\n                }\n                wrapper.css({\n                    left: newLeft,\n                    top: newTop\n                });\n                position.top = newTop;\n                position.left = newLeft;\n                return that;\n            },\n            title: function (title) {\n                var that = this, value, encoded = true, wrapper = that.wrapper, titleBar = wrapper.children(KWINDOWTITLEBAR), titleElement = titleBar.children(KWINDOWTITLE), titleBarHeight, display, visibility;\n                if (!arguments.length) {\n                    return titleElement.html();\n                }\n                if ($.isPlainObject(title)) {\n                    value = typeof title.text !== 'undefined' ? title.text : '';\n                    encoded = title.encoded !== false;\n                } else {\n                    value = title;\n                }\n                if (value === false) {\n                    wrapper.addClass('k-window-titleless');\n                    titleBar.remove();\n                } else {\n                    if (!titleBar.length) {\n                        wrapper.prepend(templates.titlebar({ title: encoded ? kendo.htmlEncode(value) : value }));\n                        that._actions();\n                        titleBar = wrapper.children(KWINDOWTITLEBAR);\n                    } else {\n                        titleElement.html(encoded ? kendo.htmlEncode(value) : value);\n                    }\n                    visibility = wrapper.css('visibility');\n                    display = wrapper.css('display');\n                    if (visibility === HIDDEN) {\n                        wrapper.css({ display: '' });\n                        titleBarHeight = parseInt(outerHeight(titleBar), 10);\n                        wrapper.css({ display: display });\n                    } else {\n                        wrapper.css({\n                            visibility: HIDDEN,\n                            display: ''\n                        });\n                        titleBarHeight = parseInt(outerHeight(titleBar), 10);\n                        wrapper.css({\n                            visibility: visibility,\n                            display: display\n                        });\n                    }\n                    wrapper.css('padding-top', titleBarHeight);\n                    titleBar.css('margin-top', -titleBarHeight);\n                }\n                that.options.title = value;\n                return that;\n            },\n            content: function (html, data) {\n                var content = this.wrapper.children(KWINDOWCONTENT), scrollContainer = content.children('.km-scroll-container');\n                content = scrollContainer[0] ? scrollContainer : content;\n                if (!defined(html)) {\n                    return content.html();\n                }\n                this.angular('cleanup', function () {\n                    return { elements: content.children() };\n                });\n                kendo.destroy(this.element.children());\n                content.empty().html(html);\n                this.angular('compile', function () {\n                    var a = [];\n                    for (var i = content.length; --i >= 0;) {\n                        a.push({ dataItem: data });\n                    }\n                    return {\n                        elements: content.children(),\n                        data: a\n                    };\n                });\n                return this;\n            },\n            open: function () {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), contentElement = wrapper.children(KWINDOWCONTENT), overlay, otherModalsVisible, containmentContext = this.containment && !that._isPinned, doc = containmentContext ? this.containment : $(document);\n                if (!that.trigger(OPEN)) {\n                    if (that._closing) {\n                        wrapper.kendoStop(true, true);\n                    }\n                    that._closing = false;\n                    that.toFront();\n                    if (options.autoFocus) {\n                        that.element.focus();\n                    }\n                    options.visible = true;\n                    if (options.modal) {\n                        otherModalsVisible = !!that._modals().length;\n                        overlay = that._overlay(otherModalsVisible);\n                        overlay.kendoStop(true, true);\n                        if (showOptions.duration && kendo.effects.Fade && !otherModalsVisible) {\n                            var overlayFx = kendo.fx(overlay).fadeIn();\n                            overlayFx.duration(showOptions.duration || 0);\n                            overlayFx.endValue(0.5);\n                            overlayFx.play();\n                        } else {\n                            overlay.css('opacity', 0.5);\n                        }\n                        overlay.show();\n                        $(window).on('focus' + MODAL_NS, function () {\n                            if (contentElement.data('isFront') && !$(document.activeElement).closest(contentElement).length) {\n                                that.element.focus();\n                            }\n                        });\n                    }\n                    if (!wrapper.is(VISIBLE)) {\n                        contentElement.css(OVERFLOW, HIDDEN);\n                        wrapper.show().kendoStop().kendoAnimate({\n                            effects: showOptions.effects,\n                            duration: showOptions.duration,\n                            complete: proxy(this._activate, this)\n                        });\n                    }\n                }\n                if (options.isMaximized) {\n                    that._containerScrollTop = doc.scrollTop();\n                    that._containerScrollLeft = doc.scrollLeft();\n                    that._stopDocumentScrolling();\n                }\n                if (this.options.pinned && !this._isPinned) {\n                    this.pin();\n                }\n                return that;\n            },\n            _activate: function () {\n                var scrollable = this.options.scrollable !== false;\n                if (this.options.autoFocus) {\n                    this.element.focus();\n                }\n                this.element.css(OVERFLOW, scrollable ? '' : 'hidden');\n                kendo.resize(this.element.children());\n                this.trigger(ACTIVATE);\n            },\n            _removeOverlay: function (suppressAnimation) {\n                var modals = this._modals();\n                var options = this.options;\n                var hideOverlay = options.modal && !modals.length;\n                var overlay = options.modal ? this._overlay(true) : $(undefined);\n                var hideOptions = this._animationOptions('close');\n                if (hideOverlay) {\n                    if (!suppressAnimation && hideOptions.duration && kendo.effects.Fade) {\n                        var overlayFx = kendo.fx(overlay).fadeOut();\n                        overlayFx.duration(hideOptions.duration || 0);\n                        overlayFx.startValue(0.5);\n                        overlayFx.play();\n                    } else {\n                        this._overlay(false).remove();\n                    }\n                    if (options.modal.preventScroll) {\n                        this._enableDocumentScrolling();\n                    }\n                } else if (modals.length) {\n                    this._object(modals.last())._overlay(true);\n                    if (options.modal.preventScroll) {\n                        this._stopDocumentScrolling();\n                    }\n                }\n            },\n            _close: function (systemTriggered) {\n                var that = this, wrapper = that.wrapper, options = that.options, showOptions = this._animationOptions('open'), hideOptions = this._animationOptions('close'), containmentContext = this.containment && !that._isPinned, doc = containmentContext ? this.containment : $(document), defaultPrevented;\n                if (that._closing) {\n                    return;\n                }\n                defaultPrevented = that.trigger(CLOSE, { userTriggered: !systemTriggered });\n                that._closing = !defaultPrevented;\n                if (wrapper.is(VISIBLE) && !defaultPrevented) {\n                    options.visible = false;\n                    $(KWINDOW).each(function (i, element) {\n                        var contentElement = $(element).children(KWINDOWCONTENT);\n                        if (element != wrapper && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                            contentElement.children(KOVERLAY).remove();\n                        }\n                    });\n                    this._removeOverlay();\n                    wrapper.kendoStop().kendoAnimate({\n                        effects: hideOptions.effects || showOptions.effects,\n                        reverse: hideOptions.reverse === true,\n                        duration: hideOptions.duration,\n                        complete: proxy(this._deactivate, this)\n                    });\n                    $(window).off(MODAL_NS);\n                }\n                if (that.options.isMaximized) {\n                    that._enableDocumentScrolling();\n                    if (that._containerScrollTop && that._containerScrollTop > 0) {\n                        doc.scrollTop(that._containerScrollTop);\n                    }\n                    if (that._containerScrollLeft && that._containerScrollLeft > 0) {\n                        doc.scrollLeft(that._containerScrollLeft);\n                    }\n                }\n            },\n            _deactivate: function () {\n                var that = this;\n                that.wrapper.hide().css('opacity', '');\n                that.trigger(DEACTIVATE);\n                if (that.options.modal) {\n                    var lastModal = that._object(that._modals().last());\n                    if (lastModal) {\n                        lastModal.toFront();\n                    }\n                }\n            },\n            close: function () {\n                this._close(true);\n                return this;\n            },\n            _actionable: function (element) {\n                return $(element).is(TITLEBAR_BUTTONS + ',' + TITLEBAR_BUTTONS + ' .k-icon,:input,a');\n            },\n            _shouldFocus: function (target) {\n                var active = activeElement(), element = this.element;\n                return this.options.autoFocus && !$(active).is(element) && !this._actionable(target) && (!element.find(active).length || !element.find(target).length);\n            },\n            toFront: function (e) {\n                var that = this, wrapper = that.wrapper, currentWindow = wrapper[0], containmentContext = that.containment && !that._isPinned, zIndex = +wrapper.css(ZINDEX), originalZIndex = zIndex, target = e && e.target || null;\n                $(KWINDOW).each(function (i, element) {\n                    var windowObject = $(element), zIndexNew = windowObject.css(ZINDEX), contentElement = windowObject.children(KWINDOWCONTENT);\n                    if (!isNaN(zIndexNew)) {\n                        zIndex = Math.max(+zIndexNew, zIndex);\n                    }\n                    contentElement.data('isFront', element == currentWindow);\n                    if (element != currentWindow && contentElement.find('> .' + KCONTENTFRAME).length > 0) {\n                        contentElement.append(templates.overlay);\n                    }\n                });\n                if (!wrapper[0].style.zIndex || originalZIndex < zIndex) {\n                    wrapper.css(ZINDEX, zIndex + 2);\n                }\n                that.element.find('> .k-overlay').remove();\n                if (that._shouldFocus(target)) {\n                    if (that.isMinimized()) {\n                        that.wrapper.focus();\n                    } else if ($(target).is(KOVERLAY)) {\n                        setTimeout(function () {\n                            that.element.focus();\n                        });\n                    } else {\n                        that.element.focus();\n                    }\n                    var scrollTop = containmentContext ? that.containment.scrollTop() : $(window).scrollTop(), windowTop = parseInt(wrapper.position().top, 10);\n                    if (!that.options.pinned && windowTop > 0 && windowTop < scrollTop) {\n                        if (scrollTop > 0) {\n                            $(window).scrollTop(windowTop);\n                        } else {\n                            wrapper.css('top', scrollTop);\n                        }\n                    }\n                }\n                wrapper = null;\n                return that;\n            },\n            toggleMaximization: function () {\n                if (this._closing) {\n                    return this;\n                }\n                return this[this.options.isMaximized ? 'restore' : 'maximize']();\n            },\n            restore: function () {\n                var that = this;\n                var options = that.options;\n                var minHeight = options.minHeight;\n                var restoreOptions = that.restoreOptions;\n                var shouldRestrictTop;\n                var container = that.containment && !that._isPinned ? that.containment : $(document);\n                if (!options.isMaximized && !options.isMinimized) {\n                    return that;\n                }\n                if (minHeight && minHeight != Infinity) {\n                    that.wrapper.css('min-height', minHeight);\n                }\n                if (restoreOptions && !options.isMaximized) {\n                    restoreOptions.height = constrain(restoreOptions.height, that.options.minHeight, that.options.maxHeight);\n                    shouldRestrictTop = options.position.top + parseInt(restoreOptions.height, 10) > that.maxTop;\n                    if (shouldRestrictTop) {\n                        options.position.top = constrain(options.position.top, that.minTop, that.maxTop - parseInt(restoreOptions.height, 10));\n                        extend(restoreOptions, {\n                            left: options.position.left,\n                            top: options.position.top\n                        });\n                    }\n                }\n                that.wrapper.css({\n                    position: options.pinned ? 'fixed' : 'absolute',\n                    left: restoreOptions.left,\n                    top: restoreOptions.top,\n                    width: restoreOptions.width,\n                    height: restoreOptions.height\n                }).removeClass(MAXIMIZEDSTATE).find('.k-window-content,.k-resize-handle').show().end().find('.k-window-titlebar .k-i-window-restore').parent().remove().end().end().find(MINIMIZE_MAXIMIZE).parent().show().end().end().find(PIN_UNPIN).parent().show();\n                if (options.isMaximized) {\n                    that.wrapper.find('.k-i-window-maximize').parent().focus();\n                } else if (options.isMinimized) {\n                    that.wrapper.find('.k-i-window-minimize').parent().focus();\n                }\n                that.options.width = restoreOptions.width;\n                that.options.height = restoreOptions.height;\n                if (!that.options.modal.preventScroll) {\n                    that._enableDocumentScrolling();\n                }\n                if (that._containerScrollTop && that._containerScrollTop > 0) {\n                    container.scrollTop(that._containerScrollTop);\n                }\n                if (that._containerScrollLeft && that._containerScrollLeft > 0) {\n                    container.scrollLeft(that._containerScrollLeft);\n                }\n                options.isMaximized = options.isMinimized = false;\n                that.wrapper.removeAttr('tabindex');\n                that.wrapper.removeAttr('aria-labelled-by');\n                that.resize();\n                return that;\n            },\n            _sizingAction: function (actionId, callback) {\n                var that = this, wrapper = that.wrapper, style = wrapper[0].style, options = that.options;\n                if (options.isMaximized || options.isMinimized) {\n                    return that;\n                }\n                that.restoreOptions = {\n                    width: style.width,\n                    height: style.height\n                };\n                wrapper.children(KWINDOWRESIZEHANDLES).hide().end().children(KWINDOWTITLEBAR).find(MINIMIZE_MAXIMIZE).parent().hide().eq(0).before(templates.action({ name: 'window-restore' }));\n                callback.call(that);\n                that.wrapper.children(KWINDOWTITLEBAR).find(PIN_UNPIN).parent().toggle(actionId !== 'maximize');\n                that.trigger(actionId);\n                wrapper.find('.k-i-window-restore').parent().focus();\n                return that;\n            },\n            maximize: function () {\n                this._sizingAction('maximize', function () {\n                    var that = this, wrapper = that.wrapper, containmentContext = this.containment && !that._isPinned, position = wrapper.position(), doc = $(document);\n                    extend(that.restoreOptions, {\n                        left: position.left + (containmentContext ? this.containment.scrollLeft() : 0),\n                        top: position.top + (containmentContext ? this.containment.scrollTop() : 0)\n                    });\n                    this._containerScrollTop = containmentContext ? this.containment.scrollTop() : doc.scrollTop();\n                    this._containerScrollLeft = containmentContext ? this.containment.scrollLeft() : doc.scrollLeft();\n                    that._stopDocumentScrolling();\n                    wrapper.css({\n                        top: containmentContext ? this.containment.scrollTop() : 0,\n                        left: containmentContext ? this.containment.scrollLeft() : 0,\n                        position: containmentContext ? 'absolute' : 'fixed'\n                    }).addClass(MAXIMIZEDSTATE);\n                    that.options.isMaximized = true;\n                    that._onDocumentResize();\n                });\n                return this;\n            },\n            _stopDocumentScrolling: function () {\n                var that = this;\n                var containment = that.containment;\n                if (containment && !that._isPinned) {\n                    that._storeOverflowRule(containment);\n                    containment.css(OVERFLOW, HIDDEN);\n                    that.wrapper.css({\n                        maxWidth: containment.innerWidth(),\n                        maxHeight: containment.innerHeight()\n                    });\n                    return;\n                }\n                var $body = $('body');\n                that._storeOverflowRule($body);\n                $body.css(OVERFLOW, HIDDEN);\n                var $html = $('html');\n                that._storeOverflowRule($html);\n                $html.css(OVERFLOW, HIDDEN);\n            },\n            _enableDocumentScrolling: function () {\n                var that = this;\n                var containment = that.containment;\n                if (containment && !that._isPinned) {\n                    that._restoreOverflowRule(containment);\n                    that.wrapper.css({\n                        maxWidth: containment.width,\n                        maxHeight: containment.height\n                    });\n                    return;\n                }\n                that._restoreOverflowRule($(document.body));\n                that._restoreOverflowRule($('html'));\n            },\n            _storeOverflowRule: function ($element) {\n                if (this._isOverflowStored($element)) {\n                    return;\n                }\n                var overflowRule = $element.get(0).style.overflow;\n                if (typeof overflowRule === 'string') {\n                    $element.data(DATADOCOVERFLOWRULE, overflowRule);\n                }\n            },\n            _isOverflowStored: function ($element) {\n                return typeof $element.data(DATADOCOVERFLOWRULE) === 'string';\n            },\n            _restoreOverflowRule: function ($element) {\n                var overflowRule = $element.data(DATADOCOVERFLOWRULE);\n                if (overflowRule !== null && overflowRule !== undefined) {\n                    $element.css(OVERFLOW, overflowRule);\n                    $element.removeData(DATADOCOVERFLOWRULE);\n                } else {\n                    $element.css(OVERFLOW, '');\n                }\n            },\n            isMaximized: function () {\n                return this.options.isMaximized;\n            },\n            minimize: function () {\n                this._sizingAction('minimize', function () {\n                    var that = this;\n                    that.wrapper.css({\n                        height: '',\n                        minHeight: ''\n                    });\n                    that.element.hide();\n                    that.options.isMinimized = true;\n                });\n                this.wrapper.attr('tabindex', 0);\n                this.wrapper.attr('aria-labelled-by', this.element.attr('aria-labelled-by'));\n                this._updateBoundaries();\n                return this;\n            },\n            isMinimized: function () {\n                return this.options.isMinimized;\n            },\n            pin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, options = that.options, position = options.position, top = this.containment ? getPosition(wrapper[0]).top + toInt(this.containment, 'borderTopWidth') : toInt(wrapper, 'top'), left = this.containment ? getPosition(wrapper[0]).left + toInt(this.containment, 'borderLeftWidth') : toInt(wrapper, 'left');\n                if (!that.options.isMaximized) {\n                    position.top = top;\n                    position.left = left;\n                    if (that._scrollIsAppended && (!this.containment || this.containment.css('position') !== 'fixed')) {\n                        position.top -= win.scrollTop();\n                        position.left -= win.scrollLeft();\n                        that._scrollIsAppended = false;\n                    }\n                    wrapper.css(extend(position, { position: 'fixed' }));\n                    wrapper.children(KWINDOWTITLEBAR).find(KPIN).addClass('k-i-unpin').removeClass('k-i-pin');\n                    that._isPinned = true;\n                    that.options.pinned = true;\n                    if (this.containment) {\n                        options.maxWidth = options.maxHeight = Infinity;\n                        wrapper.css({\n                            maxWidth: '',\n                            maxHeight: ''\n                        });\n                    }\n                }\n            },\n            unpin: function () {\n                var that = this, win = $(window), wrapper = that.wrapper, options = that.options, position = that.options.position, containment = that.containment, top = parseInt(wrapper.css('top'), 10) + win.scrollTop(), left = parseInt(wrapper.css('left'), 10) + win.scrollLeft();\n                if (!that.options.isMaximized) {\n                    that._isPinned = false;\n                    that._scrollIsAppended = true;\n                    that.options.pinned = false;\n                    if (containment) {\n                        that._updateBoundaries();\n                        options.maxWidth = Math.min(containment.width, options.maxWidth);\n                        options.maxHeight = Math.min(containment.height - toInt(wrapper, 'padding-top'), options.maxHeight);\n                        wrapper.css({\n                            maxWidth: options.maxWidth,\n                            maxHeight: options.maxHeight\n                        });\n                        if (top < containment.position.top) {\n                            top = that.minTop;\n                        } else if (top > containment.position.top + containment.height) {\n                            top = that.maxTop;\n                        } else {\n                            top = top + containment.scrollTop() - (containment.position.top + toInt(containment, 'border-top-width'));\n                        }\n                        if (left < containment.position.left) {\n                            left = that.minLeft;\n                        } else if (left > containment.position.left + containment.width) {\n                            left = that.maxLeft;\n                        } else {\n                            left = left + containment.scrollLeft() - (containment.position.left + toInt(containment, 'border-left-width'));\n                        }\n                    }\n                    position.top = constrain(top, that.minTop, that.maxTop);\n                    position.left = constrain(left, that.minLeft, that.maxLeft);\n                    wrapper.css(extend(position, { position: '' }));\n                    wrapper.children(KWINDOWTITLEBAR).find(KUNPIN).addClass('k-i-pin').removeClass('k-i-unpin');\n                }\n            },\n            _onDocumentResize: function () {\n                var that = this, wrapper = that.wrapper, wnd = $(window), zoomLevel = kendo.support.zoomLevel(), contentBoxSizing = wrapper.css('box-sizing') == 'content-box', w, h;\n                if (!that.options.isMaximized) {\n                    return;\n                }\n                var lrBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-left-width') + toInt(wrapper, 'border-right-width') : 0;\n                var tbBorderWidth = contentBoxSizing ? toInt(wrapper, 'border-top-width') + toInt(wrapper, 'border-bottom-width') : 0;\n                var paddingTop = contentBoxSizing ? toInt(wrapper, 'padding-top') : 0;\n                if (that.containment && !that._isPinned) {\n                    w = that.containment.innerWidth() - lrBorderWidth;\n                    h = that.containment.innerHeight() - (tbBorderWidth + paddingTop);\n                } else {\n                    w = wnd.width() / zoomLevel - lrBorderWidth;\n                    h = wnd.height() / zoomLevel - (tbBorderWidth + paddingTop);\n                }\n                wrapper.css({\n                    width: w,\n                    height: h\n                });\n                that.options.width = w;\n                that.options.height = h;\n                that.resize();\n            },\n            refresh: function (options) {\n                var that = this, initOptions = that.options, element = $(that.element), iframe, showIframe, url;\n                if (!isPlainObject(options)) {\n                    options = { url: options };\n                }\n                options = extend({}, initOptions.content, options);\n                showIframe = defined(initOptions.iframe) ? initOptions.iframe : options.iframe;\n                url = options.url;\n                if (url) {\n                    if (!defined(showIframe)) {\n                        showIframe = !isLocalUrl(url);\n                    }\n                    if (!showIframe) {\n                        that._ajaxRequest(options);\n                    } else {\n                        iframe = element.find('.' + KCONTENTFRAME)[0];\n                        if (iframe) {\n                            iframe.src = url || iframe.src;\n                        } else {\n                            element.html(templates.contentFrame(extend({}, initOptions, { content: options })));\n                        }\n                        element.find('.' + KCONTENTFRAME).unbind('load' + NS).on('load' + NS, proxy(this._triggerRefresh, this));\n                    }\n                } else {\n                    if (options.template) {\n                        that.content(template(options.template)({}));\n                    }\n                    that.trigger(REFRESH);\n                }\n                element.toggleClass('k-window-iframecontent', !!showIframe);\n                return that;\n            },\n            _triggerRefresh: function () {\n                this.trigger(REFRESH);\n            },\n            _ajaxComplete: function () {\n                clearTimeout(this._loadingIconTimeout);\n                this.wrapper.find(REFRESHICON).removeClass(LOADING);\n            },\n            _ajaxError: function (xhr, status) {\n                this.trigger(ERROR, {\n                    status: status,\n                    xhr: xhr\n                });\n            },\n            _ajaxSuccess: function (contentTemplate) {\n                return function (data) {\n                    var html = data;\n                    if (contentTemplate) {\n                        html = template(contentTemplate)(data || {});\n                    }\n                    this.content(html, data);\n                    this.element.prop('scrollTop', 0);\n                    this.trigger(REFRESH);\n                };\n            },\n            _showLoading: function () {\n                this.wrapper.find(REFRESHICON).addClass(LOADING);\n            },\n            _ajaxRequest: function (options) {\n                this._loadingIconTimeout = setTimeout(proxy(this._showLoading, this), 100);\n                $.ajax(extend({\n                    type: 'GET',\n                    dataType: 'html',\n                    cache: false,\n                    error: proxy(this._ajaxError, this),\n                    complete: proxy(this._ajaxComplete, this),\n                    success: proxy(this._ajaxSuccess(options.template), this)\n                }, options));\n            },\n            _destroy: function () {\n                if (this.resizing) {\n                    this.resizing.destroy();\n                }\n                if (this.dragging) {\n                    this.dragging.destroy();\n                }\n                this.wrapper.off(NS).children(KWINDOWCONTENT).off(NS).end().find('.k-resize-handle,.k-window-titlebar').off(NS);\n                $(window).off('resize' + NS + this._marker);\n                $(window).off(MODAL_NS);\n                $(window).off(NS);\n                clearTimeout(this._loadingIconTimeout);\n                Widget.fn.destroy.call(this);\n                this.unbind(undefined);\n                kendo.destroy(this.wrapper);\n                this._removeOverlay(true);\n            },\n            destroy: function () {\n                this._destroy();\n                this.wrapper.empty().remove();\n                this.wrapper = this.appendTo = this.element = $();\n            },\n            _createWindow: function () {\n                var contentHtml = this.element, options = this.options, iframeSrcAttributes, wrapper, isRtl = kendo.support.isRtl(contentHtml);\n                if (options.scrollable === false) {\n                    contentHtml.css('overflow', 'hidden');\n                }\n                wrapper = $(templates.wrapper(options));\n                iframeSrcAttributes = contentHtml.find('iframe:not(.k-content)').map(function () {\n                    var src = this.getAttribute('src');\n                    this.src = '';\n                    return src;\n                });\n                wrapper.toggleClass('k-rtl', isRtl).append(contentHtml).find('iframe:not(.k-content)').each(function (index) {\n                    this.src = iframeSrcAttributes[index];\n                });\n                if (this.containment) {\n                    this.containment.prepend(wrapper);\n                } else if (this.appendTo) {\n                    wrapper.appendTo(this.appendTo);\n                }\n                wrapper.find('.k-window-title').css(isRtl ? 'left' : 'right', outerWidth(wrapper.find('.k-window-actions')) + 10);\n                contentHtml.css('visibility', '').show();\n                contentHtml.find('[data-role=editor]').each(function () {\n                    var editor = $(this).data('kendoEditor');\n                    if (editor) {\n                        editor.refresh();\n                    }\n                });\n                wrapper = contentHtml = null;\n            }\n        });\n        templates = {\n            wrapper: template('<div class=\\'k-widget k-window\\' />'),\n            action: template('<a role=\\'button\\' href=\\'\\\\#\\' class=\\'k-button k-bare k-button-icon k-window-action\\' aria-label=\\'#= name #\\'>' + '<span class=\\'k-icon k-i-#= name.toLowerCase() #\\'></span>' + '</a>'),\n            titlebar: template('<div class=\\'k-window-titlebar k-header\\'>' + '<span class=\\'k-window-title\\'>#= title #</span>' + '<div class=\\'k-window-actions\\' />' + '</div>'),\n            overlay: '<div class=\\'k-overlay\\' />',\n            contentFrame: template('<iframe frameborder=\\'0\\' title=\\'#= title #\\' class=\\'' + KCONTENTFRAME + '\\' ' + 'src=\\'#= content.url #\\'>' + 'This page requires frames in order to show content' + '</iframe>'),\n            resizeHandle: template('<div class=\\'k-resize-handle k-resize-#= data #\\'></div>')\n        };\n        function WindowResizing(wnd) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: '>' + KWINDOWRESIZEHANDLES,\n                group: wnd.wrapper.id + '-resizing',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that)\n            });\n            that._draggable.userEvents.bind('press', proxy(that.addOverlay, that));\n            that._draggable.userEvents.bind('release', proxy(that.removeOverlay, that));\n        }\n        WindowResizing.prototype = {\n            addOverlay: function () {\n                this.owner.wrapper.append(templates.overlay);\n            },\n            removeOverlay: function () {\n                this.owner.wrapper.find(KOVERLAY).remove();\n            },\n            dragstart: function (e) {\n                var that = this;\n                var wnd = that.owner;\n                var wrapper = wnd.wrapper;\n                that._preventDragging = wnd.trigger(RESIZESTART);\n                if (that._preventDragging) {\n                    return;\n                }\n                that.elementPadding = parseInt(wrapper.css('padding-top'), 10);\n                that.initialPosition = kendo.getOffset(wrapper, 'position');\n                that.resizeDirection = e.currentTarget.prop('className').replace('k-resize-handle k-resize-', '');\n                that.initialSize = {\n                    width: wrapper.width(),\n                    height: wrapper.height()\n                };\n                wnd._updateBoundaries();\n                that.containerOffset = wnd.containment ? wnd.containment.position : kendo.getOffset(wnd.appendTo, 'position');\n                var offsetParent = wrapper.offsetParent();\n                if (offsetParent.is('html')) {\n                    that.containerOffset.top = that.containerOffset.left = 0;\n                } else {\n                    var marginTop = offsetParent.css('margin-top');\n                    var marginLeft = offsetParent.css('margin-left');\n                    var hasMargin = !zero.test(marginTop) || !zero.test(marginLeft);\n                    if (hasMargin) {\n                        var wrapperPosition = getPosition(wrapper[0]);\n                        var relativeElMarginLeft = wrapperPosition.left - that.containerOffset.left - that.initialPosition.left;\n                        var relativeElMarginTop = wrapperPosition.top - that.containerOffset.top - that.initialPosition.top;\n                        that._relativeElMarginLeft = relativeElMarginLeft > 1 ? relativeElMarginLeft : 0;\n                        that._relativeElMarginTop = relativeElMarginTop > 1 ? relativeElMarginTop : 0;\n                        that.initialPosition.left += that._relativeElMarginLeft;\n                        that.initialPosition.top += that._relativeElMarginTop;\n                    }\n                }\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper, options = wnd.options, position = options.position, direction = that.resizeDirection, containerOffset = that.containerOffset, initialPosition = that.initialPosition, initialSize = that.initialSize, containmentContext = wnd.containment && !wnd._isPinned, rtl = kendo.support.isRtl(wnd.containment), leftRtlOffset = containmentContext && rtl && wnd.containment.innerWidth() > wnd.containment.width ? kendo.support.scrollbar() : 0, scrollOffset = containmentContext ? {\n                        top: wnd.containment.scrollTop(),\n                        left: wnd.containment.scrollLeft()\n                    } : {\n                        top: 0,\n                        left: 0\n                    }, newWidth, newHeight, windowBottom, windowRight, x = Math.max(e.x.location, 0), y = Math.max(e.y.location, 0);\n                if (direction.indexOf('e') >= 0) {\n                    if (wnd.containment && x - initialSize.width >= wnd.maxLeft - scrollOffset.left + containerOffset.left + leftRtlOffset) {\n                        newWidth = wnd.maxLeft + leftRtlOffset - initialPosition.left + initialSize.width - scrollOffset.left;\n                    } else {\n                        newWidth = x - initialPosition.left - containerOffset.left;\n                    }\n                    wrapper.width(constrain(newWidth, options.minWidth, options.maxWidth));\n                } else if (direction.indexOf('w') >= 0) {\n                    windowRight = initialPosition.left + initialSize.width + containerOffset.left;\n                    newWidth = constrain(windowRight - x, options.minWidth, options.maxWidth);\n                    position.left = windowRight - newWidth - containerOffset.left - leftRtlOffset - (that._relativeElMarginLeft || 0) + scrollOffset.left;\n                    if (wnd.containment && position.left <= wnd.minLeft) {\n                        position.left = wnd.minLeft;\n                        newWidth = constrain(windowRight - leftRtlOffset - position.left - containerOffset.left + scrollOffset.left, options.minWidth, options.maxWidth);\n                    }\n                    wrapper.css({\n                        left: position.left,\n                        width: newWidth\n                    });\n                }\n                var newWindowTop = y;\n                if (wnd.options.pinned) {\n                    newWindowTop -= $(window).scrollTop();\n                }\n                if (direction.indexOf('s') >= 0) {\n                    newHeight = newWindowTop - initialPosition.top - that.elementPadding - containerOffset.top;\n                    if (newWindowTop - initialSize.height - that.elementPadding >= wnd.maxTop + containerOffset.top - scrollOffset.top) {\n                        newHeight = wnd.maxTop - initialPosition.top + initialSize.height - scrollOffset.top;\n                    }\n                    wrapper.height(constrain(newHeight, options.minHeight, options.maxHeight));\n                } else if (direction.indexOf('n') >= 0) {\n                    windowBottom = initialPosition.top + initialSize.height + containerOffset.top;\n                    newHeight = constrain(windowBottom - newWindowTop, options.minHeight, options.maxHeight);\n                    position.top = windowBottom - newHeight - containerOffset.top - (that._relativeElMarginTop || 0) + scrollOffset.top;\n                    if (position.top <= wnd.minTop && wnd.containment) {\n                        position.top = wnd.minTop;\n                        newHeight = constrain(windowBottom - position.top - containerOffset.top + scrollOffset.top, options.minHeight, options.maxHeight);\n                    }\n                    wrapper.css({\n                        top: position.top,\n                        height: newHeight\n                    });\n                }\n                if (newWidth) {\n                    wnd.options.width = newWidth + 'px';\n                }\n                if (newHeight) {\n                    wnd.options.height = newHeight + 'px';\n                }\n                wnd.resize();\n            },\n            dragend: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                var that = this, wnd = that.owner, wrapper = wnd.wrapper;\n                wrapper.children(KWINDOWRESIZEHANDLES).not(e.currentTarget).show();\n                $(BODY).css(CURSOR, '');\n                if (wnd.touchScroller) {\n                    wnd.touchScroller.reset();\n                }\n                if (e.keyCode == 27) {\n                    wrapper.css(that.initialPosition).css(that.initialSize);\n                }\n                wnd.trigger(RESIZEEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        function WindowDragging(wnd, dragHandle) {\n            var that = this;\n            that.owner = wnd;\n            that._preventDragging = false;\n            that._draggable = new Draggable(wnd.wrapper, {\n                filter: dragHandle,\n                group: wnd.wrapper.id + '-moving',\n                dragstart: proxy(that.dragstart, that),\n                drag: proxy(that.drag, that),\n                dragend: proxy(that.dragend, that),\n                dragcancel: proxy(that.dragcancel, that)\n            });\n            that._draggable.userEvents.stopPropagation = false;\n        }\n        WindowDragging.prototype = {\n            dragstart: function (e) {\n                var wnd = this.owner, draggable = wnd.options.draggable, element = wnd.element, actions = element.find('.k-window-actions'), containerOffset = kendo.getOffset(wnd.appendTo);\n                this._preventDragging = wnd.trigger(DRAGSTART) || !draggable;\n                if (this._preventDragging || wnd.isMaximized()) {\n                    return;\n                }\n                wnd.initialWindowPosition = kendo.getOffset(wnd.wrapper, 'position');\n                wnd.initialPointerPosition = {\n                    left: wnd.options.position.left,\n                    top: wnd.options.position.top\n                };\n                wnd.startPosition = {\n                    left: e.x.client - wnd.initialWindowPosition.left,\n                    top: e.y.client - wnd.initialWindowPosition.top\n                };\n                wnd._updateBoundaries();\n                if (!wnd.containment) {\n                    if (actions.length > 0) {\n                        wnd.minLeft = outerWidth(actions) + parseInt(actions.css('right'), 10) - outerWidth(element);\n                    } else {\n                        wnd.minLeft = 20 - outerWidth(element);\n                    }\n                    wnd.minLeft -= containerOffset.left;\n                    wnd.minTop = -containerOffset.top;\n                }\n                wnd.wrapper.append(templates.overlay).children(KWINDOWRESIZEHANDLES).hide();\n                $(BODY).css(CURSOR, e.currentTarget.css(CURSOR));\n            },\n            drag: function (e) {\n                var wnd = this.owner;\n                var position = wnd.options.position;\n                var axis = wnd.options.draggable.axis;\n                var left;\n                var top;\n                if (this._preventDragging || wnd.isMaximized()) {\n                    return;\n                }\n                if (!axis || axis.toLowerCase() === 'x') {\n                    left = e.x.client - wnd.startPosition.left;\n                    if (wnd.containment && !wnd._isPinned) {\n                        left += wnd.containment.scrollLeft();\n                    }\n                    position.left = constrain(left, wnd.minLeft, wnd.maxLeft);\n                }\n                if (!axis || axis.toLowerCase() === 'y') {\n                    top = e.y.client - wnd.startPosition.top;\n                    if (wnd.containment && !wnd._isPinned) {\n                        top += wnd.containment.scrollTop();\n                    }\n                    position.top = constrain(top, wnd.minTop, wnd.maxTop);\n                }\n                if (kendo.support.transforms) {\n                    $(wnd.wrapper).css('transform', 'translate(' + (position.left - wnd.initialPointerPosition.left) + 'px, ' + (position.top - wnd.initialPointerPosition.top) + 'px)');\n                } else {\n                    $(wnd.wrapper).css(position);\n                }\n            },\n            _finishDrag: function () {\n                var wnd = this.owner;\n                wnd.wrapper.children(KWINDOWRESIZEHANDLES).toggle(!wnd.options.isMinimized).end().find(KOVERLAY).remove();\n                $(BODY).css(CURSOR, '');\n            },\n            dragcancel: function (e) {\n                if (this._preventDragging) {\n                    return;\n                }\n                this._finishDrag();\n                e.currentTarget.closest(KWINDOW).css(this.owner.initialWindowPosition);\n            },\n            dragend: function () {\n                var wnd = this.owner;\n                if (this._preventDragging || wnd.isMaximized()) {\n                    return;\n                }\n                $(wnd.wrapper).css(wnd.options.position).css('transform', '');\n                this._finishDrag();\n                wnd.trigger(DRAGEND);\n                return false;\n            },\n            destroy: function () {\n                if (this._draggable) {\n                    this._draggable.destroy();\n                }\n                this._draggable = this.owner = null;\n            }\n        };\n        kendo.ui.plugin(Window);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.list', [\n        'kendo.data',\n        'kendo.popup'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'list',\n        name: 'List',\n        category: 'framework',\n        depends: [\n            'data',\n            'popup'\n        ],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, outerHeight = kendo._outerHeight, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, Widget = ui.Widget, keys = kendo.keys, support = kendo.support, htmlEncode = kendo.htmlEncode, activeElement = kendo._activeElement, outerWidth = kendo._outerWidth, ObservableArray = kendo.data.ObservableArray, ID = 'id', CHANGE = 'change', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', LOADING = 'k-i-loading', GROUPHEADER = '.k-group-header', ITEMSELECTOR = '.k-item', LABELIDPART = '_label', OPEN = 'open', CLOSE = 'close', CASCADE = 'cascade', SELECT = 'select', SELECTED = 'selected', REQUESTSTART = 'requestStart', REQUESTEND = 'requestEnd', extend = $.extend, proxy = $.proxy, isArray = $.isArray, browser = support.browser, HIDDENCLASS = 'k-hidden', WIDTH = 'width', isIE = browser.msie, isIE8 = isIE && browser.version < 9, quotRegExp = /\"/g, alternativeNames = {\n                'ComboBox': 'DropDownList',\n                'DropDownList': 'ComboBox'\n            };\n        var List = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this, ns = that.ns, id;\n                Widget.fn.init.call(that, element, options);\n                element = that.element;\n                options = that.options;\n                that._isSelect = element.is(SELECT);\n                if (that._isSelect && that.element[0].length) {\n                    if (!options.dataSource) {\n                        options.dataTextField = options.dataTextField || 'text';\n                        options.dataValueField = options.dataValueField || 'value';\n                    }\n                }\n                that.ul = $('<ul unselectable=\"on\" class=\"k-list k-reset\"/>').attr({\n                    tabIndex: -1,\n                    'aria-hidden': true\n                });\n                that.list = $('<div class=\\'k-list-container\\'/>').append(that.ul).on('mousedown' + ns, proxy(that._listMousedown, that));\n                id = element.attr(ID);\n                if (!id) {\n                    id = kendo.guid();\n                }\n                that.list.attr(ID, id + '-list');\n                that.ul.attr(ID, id + '_listbox');\n                if (options.columns && options.columns.length) {\n                    that.ul.removeClass('k-list').addClass('k-grid-list');\n                    that._columnsHeader();\n                }\n                that._header();\n                that._noData();\n                that._footer();\n                that._accessors();\n                that._initValue();\n            },\n            options: {\n                valuePrimitive: false,\n                footerTemplate: '',\n                headerTemplate: '',\n                noDataTemplate: 'No data found.'\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                if (options && options.enable !== undefined) {\n                    options.enabled = options.enable;\n                }\n                if (options.columns && options.columns.length) {\n                    this._columnsHeader();\n                }\n                this._header();\n                this._noData();\n                this._footer();\n                this._renderFooter();\n                this._renderNoData();\n            },\n            focus: function () {\n                this._focused.focus();\n            },\n            readonly: function (readonly) {\n                this._editable({\n                    readonly: readonly === undefined ? true : readonly,\n                    disable: false\n                });\n            },\n            enable: function (enable) {\n                this._editable({\n                    readonly: false,\n                    disable: !(enable = enable === undefined ? true : enable)\n                });\n            },\n            _header: function () {\n                var list = this;\n                var header = $(list.header);\n                var template = list.options.headerTemplate;\n                this._angularElement(header, 'cleanup');\n                kendo.destroy(header);\n                header.remove();\n                if (!template) {\n                    list.header = null;\n                    return;\n                }\n                var headerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n                header = $(headerTemplate({}));\n                list.header = header[0] ? header : null;\n                list.list.prepend(header);\n                this._angularElement(list.header, 'compile');\n            },\n            _columnsHeader: function () {\n                var list = this;\n                var columnsHeader = $(list.columnsHeader);\n                this._angularElement(columnsHeader, 'cleanup');\n                kendo.destroy(columnsHeader);\n                columnsHeader.remove();\n                var header = '<div class=\\'k-grid-header\\'><div class=\\'k-grid-header-wrap\\'><table>';\n                var colGroup = '<colgroup>';\n                var row = '<tr>';\n                for (var idx = 0; idx < this.options.columns.length; idx++) {\n                    var currentColumn = this.options.columns[idx];\n                    var title = currentColumn.title || currentColumn.field || '';\n                    var template = currentColumn.headerTemplate || title;\n                    var columnsHeaderTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n                    var currentWidth = currentColumn.width;\n                    var currentWidthInt = parseInt(currentWidth, 10);\n                    var widthStyle = '';\n                    if (currentWidth && !isNaN(currentWidthInt)) {\n                        widthStyle += 'style=\\'width:';\n                        widthStyle += currentWidthInt;\n                        widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n                        widthStyle += ';\\'';\n                    }\n                    colGroup += '<col ' + widthStyle + '/>';\n                    row += '<th class=\\'k-header\\'>';\n                    row += columnsHeaderTemplate(currentColumn);\n                    row += '</th>';\n                }\n                colGroup += '</colgroup>';\n                row += '</tr>';\n                header += colGroup;\n                header += row;\n                header += '</table></div></div>';\n                list.columnsHeader = columnsHeader = $(header);\n                list.list.prepend(columnsHeader);\n                this._angularElement(list.columnsHeader, 'compile');\n            },\n            _noData: function () {\n                var list = this;\n                var noData = $(list.noData);\n                var template = list.options.noDataTemplate;\n                list.angular('cleanup', function () {\n                    return { elements: noData };\n                });\n                kendo.destroy(noData);\n                noData.remove();\n                if (!template) {\n                    list.noData = null;\n                    return;\n                }\n                list.noData = $('<div class=\"k-nodata\" style=\"display:none\"><div></div></div>').appendTo(list.list);\n                list.noDataTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n            },\n            _footer: function () {\n                var list = this;\n                var footer = $(list.footer);\n                var template = list.options.footerTemplate;\n                this._angularElement(footer, 'cleanup');\n                kendo.destroy(footer);\n                footer.remove();\n                if (!template) {\n                    list.footer = null;\n                    return;\n                }\n                list.footer = $('<div class=\"k-footer\"></div>').appendTo(list.list);\n                list.footerTemplate = typeof template !== 'function' ? kendo.template(template) : template;\n            },\n            _listOptions: function (options) {\n                var that = this;\n                var currentOptions = that.options;\n                var virtual = currentOptions.virtual;\n                var changeEventOption = { change: proxy(that._listChange, that) };\n                var listBoundHandler = proxy(that._listBound, that);\n                virtual = typeof virtual === 'object' ? virtual : {};\n                options = $.extend({\n                    autoBind: false,\n                    selectable: true,\n                    dataSource: that.dataSource,\n                    click: proxy(that._click, that),\n                    activate: proxy(that._activateItem, that),\n                    columns: currentOptions.columns,\n                    deactivate: proxy(that._deactivateItem, that),\n                    dataBinding: function () {\n                        that.trigger('dataBinding');\n                    },\n                    dataBound: listBoundHandler,\n                    height: currentOptions.height,\n                    dataValueField: currentOptions.dataValueField,\n                    dataTextField: currentOptions.dataTextField,\n                    groupTemplate: currentOptions.groupTemplate,\n                    fixedGroupTemplate: currentOptions.fixedGroupTemplate,\n                    template: currentOptions.template\n                }, options, virtual, changeEventOption);\n                if (!options.template) {\n                    options.template = '#:' + kendo.expr(options.dataTextField, 'data') + '#';\n                }\n                if (currentOptions.$angular) {\n                    options.$angular = currentOptions.$angular;\n                }\n                return options;\n            },\n            _initList: function () {\n                var that = this;\n                var listOptions = that._listOptions({ selectedItemChange: proxy(that._listChange, that) });\n                if (!that.options.virtual) {\n                    that.listView = new kendo.ui.StaticList(that.ul, listOptions);\n                } else {\n                    that.listView = new kendo.ui.VirtualList(that.ul, listOptions);\n                }\n                that.listView.bind('listBound', proxy(that._listBound, that));\n                that._setListValue();\n            },\n            _setListValue: function (value) {\n                value = value || this.options.value;\n                if (value !== undefined) {\n                    this.listView.value(value).done(proxy(this._updateSelectionState, this));\n                }\n            },\n            _updateSelectionState: $.noop,\n            _listMousedown: function (e) {\n                if (!this.filterInput || this.filterInput[0] !== e.target) {\n                    e.preventDefault();\n                }\n            },\n            _isFilterEnabled: function () {\n                var filter = this.options.filter;\n                return filter && filter !== 'none';\n            },\n            _hideClear: function () {\n                var list = this;\n                if (list._clear) {\n                    list._clear.addClass(HIDDENCLASS);\n                }\n            },\n            _showClear: function () {\n                if (this._clear) {\n                    this._clear.removeClass(HIDDENCLASS);\n                }\n            },\n            _clearValue: function () {\n                this._clearText();\n                this._accessor('');\n                this.listView.value([]);\n                if (this._isSelect) {\n                    this._customOption = undefined;\n                }\n                if (this._isFilterEnabled() && !this.options.enforceMinLength) {\n                    this._filter({\n                        word: '',\n                        open: false\n                    });\n                    if (this.options.highlightFirst) {\n                        this.listView.focus(0);\n                    }\n                }\n                this._change();\n            },\n            _clearText: function () {\n                this.text('');\n            },\n            _clearFilter: function () {\n                if (!this.options.virtual) {\n                    this.listView.bound(false);\n                }\n                this._filterSource();\n            },\n            _filterSource: function (filter, force) {\n                var that = this;\n                var options = that.options;\n                var isMultiColumnFiltering = options.filterFields && filter && filter.logic && filter.filters && filter.filters.length;\n                var dataSource = that.dataSource;\n                var expression = extend({}, dataSource.filter() || {});\n                var resetPageSettings = filter || expression.filters && expression.filters.length && !filter;\n                var removed = removeFiltersForField(expression, options.dataTextField);\n                this._clearFilterExpressions(expression);\n                if ((filter || removed) && that.trigger('filtering', { filter: filter })) {\n                    return;\n                }\n                var newExpression = {\n                    filters: [],\n                    logic: 'and'\n                };\n                if (isMultiColumnFiltering) {\n                    newExpression.filters.push(filter);\n                } else {\n                    this._pushFilterExpression(newExpression, filter);\n                }\n                if (isValidFilterExpr(expression)) {\n                    if (newExpression.logic === expression.logic) {\n                        newExpression.filters = newExpression.filters.concat(expression.filters);\n                    } else {\n                        newExpression.filters.push(expression);\n                    }\n                }\n                if (that._cascading) {\n                    this.listView.setDSFilter(newExpression);\n                }\n                var dataSourceState = extend({}, {\n                    page: resetPageSettings ? 1 : dataSource.page(),\n                    pageSize: resetPageSettings ? dataSource.options.pageSize : dataSource.pageSize(),\n                    sort: dataSource.sort(),\n                    filter: dataSource.filter(),\n                    group: dataSource.group(),\n                    aggregate: dataSource.aggregate()\n                }, { filter: newExpression });\n                return dataSource[force ? 'read' : 'query'](dataSource._mergeState(dataSourceState));\n            },\n            _pushFilterExpression: function (newExpression, filter) {\n                if (isValidFilterExpr(filter) && filter.value !== '') {\n                    newExpression.filters.push(filter);\n                }\n            },\n            _clearFilterExpressions: function (expression) {\n                if (!expression.filters) {\n                    return;\n                }\n                var filtersToRemove;\n                for (var i = 0; i < expression.filters.length; i++) {\n                    if ('fromFilter' in expression.filters[i]) {\n                        filtersToRemove = i;\n                    }\n                }\n                if (!isNaN(filtersToRemove)) {\n                    expression.filters.splice(filtersToRemove, 1);\n                }\n            },\n            _angularElement: function (element, action) {\n                if (!element) {\n                    return;\n                }\n                this.angular(action, function () {\n                    return { elements: element };\n                });\n            },\n            _renderNoData: function () {\n                var list = this;\n                var noData = list.noData;\n                if (!noData) {\n                    return;\n                }\n                this._angularElement(noData, 'cleanup');\n                noData.children(':first').html(list.noDataTemplate({ instance: list }));\n                this._angularElement(noData, 'compile');\n            },\n            _toggleNoData: function (show) {\n                $(this.noData).toggle(show);\n            },\n            _toggleHeader: function (show) {\n                var groupHeader = this.listView.content.prev(GROUPHEADER);\n                groupHeader.toggle(show);\n            },\n            _renderFooter: function () {\n                var list = this;\n                var footer = list.footer;\n                if (!footer) {\n                    return;\n                }\n                this._angularElement(footer, 'cleanup');\n                footer.html(list.footerTemplate({ instance: list }));\n                this._angularElement(footer, 'compile');\n            },\n            _allowOpening: function () {\n                return this.options.noDataTemplate || this.dataSource.flatView().length;\n            },\n            _initValue: function () {\n                var that = this, value = that.options.value;\n                if (value !== null) {\n                    that.element.val(value);\n                } else {\n                    value = that._accessor();\n                    that.options.value = value;\n                }\n                that._old = value;\n            },\n            _ignoreCase: function () {\n                var that = this, model = that.dataSource.reader.model, field;\n                if (model && model.fields) {\n                    field = model.fields[that.options.dataTextField];\n                    if (field && field.type && field.type !== 'string') {\n                        that.options.ignoreCase = false;\n                    }\n                }\n            },\n            _focus: function (candidate) {\n                return this.listView.focus(candidate);\n            },\n            _filter: function (options) {\n                var that = this;\n                var widgetOptions = that.options;\n                var word = options.word;\n                var filterFields = widgetOptions.filterFields;\n                var field = widgetOptions.dataTextField;\n                var expression;\n                if (filterFields && filterFields.length) {\n                    expression = {\n                        logic: 'or',\n                        filters: [],\n                        fromFilter: true\n                    };\n                    for (var i = 0; i < filterFields.length; i++) {\n                        this._pushFilterExpression(expression, that._buildExpression(word, filterFields[i]));\n                    }\n                } else {\n                    expression = that._buildExpression(word, field);\n                }\n                that._open = options.open;\n                that._filterSource(expression);\n            },\n            _buildExpression: function (value, field) {\n                var that = this;\n                var widgetOptions = that.options;\n                var ignoreCase = widgetOptions.ignoreCase;\n                var accentFoldingFiltering = that.dataSource.options.accentFoldingFiltering;\n                return {\n                    value: ignoreCase ? accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase() : value,\n                    field: field,\n                    operator: widgetOptions.filter,\n                    ignoreCase: ignoreCase\n                };\n            },\n            _clearButton: function () {\n                var list = this;\n                var clearTitle = list.options.messages && list.options.messages.clear ? list.options.messages.clear : 'clear';\n                if (!list._clear) {\n                    list._clear = $('<span unselectable=\"on\" class=\"k-icon k-clear-value k-i-close\" title=\"' + clearTitle + '\"></span>').attr({\n                        'role': 'button',\n                        'tabIndex': -1\n                    });\n                }\n                if (!list.options.clearButton) {\n                    list._clear.remove();\n                }\n                this._hideClear();\n            },\n            search: function (word) {\n                var options = this.options;\n                word = typeof word === 'string' ? word : this._inputValue();\n                clearTimeout(this._typingTimeout);\n                if (!options.enforceMinLength && !word.length || word.length >= options.minLength) {\n                    this._state = 'filter';\n                    if (this.listView) {\n                        this.listView._emptySearch = !$.trim(word).length;\n                    }\n                    if (!this._isFilterEnabled()) {\n                        this._searchByWord(word);\n                    } else {\n                        this._filter({\n                            word: word,\n                            open: true\n                        });\n                    }\n                }\n            },\n            current: function (candidate) {\n                return this._focus(candidate);\n            },\n            items: function () {\n                return this.ul[0].children;\n            },\n            destroy: function () {\n                var that = this;\n                var ns = that.ns;\n                Widget.fn.destroy.call(that);\n                that._unbindDataSource();\n                that.listView.destroy();\n                that.list.off(ns);\n                that.popup.destroy();\n                if (that._form) {\n                    that._form.off('reset', that._resetHandler);\n                }\n            },\n            dataItem: function (index) {\n                var that = this;\n                if (index === undefined) {\n                    return that.listView.selectedDataItems()[0];\n                }\n                if (typeof index !== 'number') {\n                    if (that.options.virtual) {\n                        return that.dataSource.getByUid($(index).data('uid'));\n                    }\n                    index = $(that.items()).index(index);\n                }\n                return that.dataSource.flatView()[index];\n            },\n            _activateItem: function () {\n                var current = this.listView.focus();\n                if (current) {\n                    this._focused.add(this.filterInput).attr('aria-activedescendant', current.attr('id'));\n                }\n            },\n            _deactivateItem: function () {\n                this._focused.add(this.filterInput).removeAttr('aria-activedescendant');\n            },\n            _accessors: function () {\n                var that = this;\n                var element = that.element;\n                var options = that.options;\n                var getter = kendo.getter;\n                var textField = element.attr(kendo.attr('text-field'));\n                var valueField = element.attr(kendo.attr('value-field'));\n                if (!options.dataTextField && textField) {\n                    options.dataTextField = textField;\n                }\n                if (!options.dataValueField && valueField) {\n                    options.dataValueField = valueField;\n                }\n                that._text = getter(options.dataTextField);\n                that._value = getter(options.dataValueField);\n            },\n            _aria: function (id) {\n                var that = this, options = that.options, element = that._focused.add(that.filterInput);\n                if (options.suggest !== undefined) {\n                    element.attr('aria-autocomplete', options.suggest ? 'both' : 'list');\n                }\n                id = id ? id + ' ' + that.ul[0].id : that.ul[0].id;\n                element.attr('aria-owns', id);\n                that.ul.attr('aria-live', !that._isFilterEnabled() ? 'off' : 'polite');\n                that._ariaLabel();\n            },\n            _ariaLabel: function () {\n                var that = this;\n                var focusedElm = that._focused;\n                var inputElm = that.element;\n                var inputId = inputElm.attr('id');\n                var labelElm = $('label[for=\"' + inputId + '\"]');\n                var ariaLabel = inputElm.attr('aria-label');\n                var ariaLabelledBy = inputElm.attr('aria-labelledby');\n                if (focusedElm === inputElm) {\n                    return;\n                }\n                if (ariaLabel) {\n                    focusedElm.attr('aria-label', ariaLabel);\n                } else if (ariaLabelledBy) {\n                    focusedElm.attr('aria-labelledby', ariaLabelledBy);\n                } else if (labelElm.length) {\n                    var labelId = labelElm.attr('id') || that._generateLabelId(labelElm, inputId || kendo.guid());\n                    focusedElm.attr('aria-labelledby', labelId);\n                }\n            },\n            _generateLabelId: function (label, inputId) {\n                var labelId = inputId + LABELIDPART;\n                label.attr('id', labelId);\n                return labelId;\n            },\n            _blur: function () {\n                var that = this;\n                that._change();\n                that.close();\n            },\n            _change: function () {\n                var that = this;\n                var index = that.selectedIndex;\n                var optionValue = that.options.value;\n                var value = that.value();\n                var trigger;\n                if (that._isSelect && !that.listView.bound() && optionValue) {\n                    value = optionValue;\n                }\n                if (value !== unifyType(that._old, typeof value) && value !== unifyType(that._oldText, typeof value)) {\n                    trigger = true;\n                } else if (that._valueBeforeCascade !== undefined && that._valueBeforeCascade !== unifyType(that._old, typeof that._valueBeforeCascade) && that._userTriggered) {\n                    trigger = true;\n                } else if (index !== undefined && index !== that._oldIndex && !that.listView.isFiltered()) {\n                    trigger = true;\n                }\n                if (trigger) {\n                    if (that._old === null || that._old === '' || value === '') {\n                        that._valueBeforeCascade = that._old = value;\n                    } else {\n                        if (that.dataItem()) {\n                            that._valueBeforeCascade = that._old = that.options.dataValueField ? that.dataItem()[that.options.dataValueField] : that.dataItem();\n                        } else {\n                            that._valueBeforeCascade = that._old = null;\n                        }\n                    }\n                    that._oldIndex = index;\n                    that._oldText = that.text && that.text();\n                    if (!that._typing) {\n                        that.element.trigger(CHANGE);\n                    }\n                    that.trigger(CHANGE);\n                }\n                that.typing = false;\n            },\n            _data: function () {\n                return this.dataSource.view();\n            },\n            _enable: function () {\n                var that = this, options = that.options, disabled = that.element.is('[disabled]');\n                if (options.enable !== undefined) {\n                    options.enabled = options.enable;\n                }\n                if (!options.enabled || disabled) {\n                    that.enable(false);\n                } else {\n                    that.readonly(that.element.is('[readonly]'));\n                }\n            },\n            _dataValue: function (dataItem) {\n                var value = this._value(dataItem);\n                if (value === undefined) {\n                    value = this._text(dataItem);\n                }\n                return value;\n            },\n            _offsetHeight: function () {\n                var offsetHeight = 0;\n                var siblings = this.listView.content.prevAll(':visible');\n                siblings.each(function () {\n                    var element = $(this);\n                    offsetHeight += outerHeight(element, true);\n                });\n                return offsetHeight;\n            },\n            _height: function (length) {\n                var that = this;\n                var list = that.list;\n                var height = that.options.height;\n                var visible = that.popup.visible();\n                var offsetTop;\n                var popups;\n                var footerHeight;\n                if (length || that.options.noDataTemplate) {\n                    popups = list.add(list.parent('.k-animation-container')).show();\n                    if (!list.is(':visible')) {\n                        popups.hide();\n                        return;\n                    }\n                    height = that.listView.content[0].scrollHeight > height ? height : 'auto';\n                    popups.height(height);\n                    if (height !== 'auto') {\n                        offsetTop = that._offsetHeight();\n                        footerHeight = outerHeight($(that.footer)) || 0;\n                        height = height - offsetTop - footerHeight;\n                    }\n                    that.listView.content.height(height);\n                    if (!visible) {\n                        popups.hide();\n                    }\n                }\n                return height;\n            },\n            _openHandler: function (e) {\n                this._adjustListWidth();\n                if (this.trigger(OPEN)) {\n                    e.preventDefault();\n                } else {\n                    this._focused.attr('aria-expanded', true);\n                    this.ul.attr('aria-hidden', false);\n                }\n            },\n            _adjustListWidth: function () {\n                var that = this, list = that.list, width = list[0].style.width, wrapper = that.wrapper, computedStyle, computedWidth;\n                if (!list.data(WIDTH) && width) {\n                    return;\n                }\n                computedStyle = window.getComputedStyle ? window.getComputedStyle(wrapper[0], null) : 0;\n                computedWidth = parseFloat(computedStyle && computedStyle.width) || outerWidth(wrapper);\n                if (computedStyle && browser.msie) {\n                    computedWidth += parseFloat(computedStyle.paddingLeft) + parseFloat(computedStyle.paddingRight) + parseFloat(computedStyle.borderLeftWidth) + parseFloat(computedStyle.borderRightWidth);\n                }\n                if (list.css('box-sizing') !== 'border-box') {\n                    width = computedWidth - (outerWidth(list) - list.width());\n                } else {\n                    width = computedWidth;\n                }\n                list.css({\n                    fontFamily: wrapper.css('font-family'),\n                    width: that.options.autoWidth ? 'auto' : width,\n                    minWidth: width,\n                    whiteSpace: that.options.autoWidth ? 'nowrap' : 'normal'\n                }).data(WIDTH, width);\n                return true;\n            },\n            _closeHandler: function (e) {\n                if (this.trigger(CLOSE)) {\n                    e.preventDefault();\n                } else {\n                    this._focused.attr('aria-expanded', false);\n                    this.ul.attr('aria-hidden', true);\n                }\n            },\n            _focusItem: function () {\n                var listView = this.listView;\n                var noFocusedItem = !listView.focus();\n                var index = last(listView.select());\n                if (index === undefined && this.options.highlightFirst && noFocusedItem) {\n                    index = 0;\n                }\n                if (index !== undefined) {\n                    listView.focus(index);\n                } else if (noFocusedItem) {\n                    listView.scrollToIndex(0);\n                }\n            },\n            _calculateGroupPadding: function (height) {\n                var li = this.ul.children('.k-first:first');\n                var groupHeader = this.listView.content.prev(GROUPHEADER);\n                var padding = 0;\n                var direction = 'right';\n                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    if (this.element.parents('.k-rtl').length) {\n                        direction = 'left';\n                    }\n                    padding += parseFloat(li.css('border-' + direction + '-width'), 10) + parseFloat(li.children('.k-group').css('padding-' + direction), 10);\n                    groupHeader.css('padding-' + direction, padding);\n                }\n            },\n            _calculatePopupHeight: function (force) {\n                var height = this._height(this.dataSource.flatView().length || force);\n                this._calculateGroupPadding(height);\n                this._calculateColumnsHeaderPadding(height);\n            },\n            _calculateColumnsHeaderPadding: function (height) {\n                if (this.options.columns && this.options.columns.length) {\n                    var list = this;\n                    var isRtl = support.isRtl(list.wrapper);\n                    var scrollbar = kendo.support.scrollbar();\n                    list.columnsHeader.css(isRtl ? 'padding-left' : 'padding-right', height !== 'auto' ? scrollbar : 0);\n                }\n            },\n            _refreshScroll: function () {\n                var listView = this.listView;\n                var enableYScroll = listView.element.height() > listView.content.height();\n                if (this.options.autoWidth) {\n                    listView.content.css({\n                        overflowX: 'hidden',\n                        overflowY: enableYScroll ? 'scroll' : 'auto'\n                    });\n                }\n            },\n            _resizePopup: function (force) {\n                if (this.options.virtual) {\n                    return;\n                }\n                if (!this.popup.element.is(':visible')) {\n                    this.popup.one('open', function (force) {\n                        return proxy(function () {\n                            this._calculatePopupHeight(force);\n                        }, this);\n                    }.call(this, force));\n                    this.popup.one('activate', proxy(this._refreshScroll, this));\n                } else {\n                    this._calculatePopupHeight(force);\n                }\n            },\n            _popup: function () {\n                var list = this;\n                list.popup = new ui.Popup(list.list, extend({}, list.options.popup, {\n                    anchor: list.wrapper,\n                    open: proxy(list._openHandler, list),\n                    close: proxy(list._closeHandler, list),\n                    animation: list.options.animation,\n                    isRtl: support.isRtl(list.wrapper),\n                    autosize: list.options.autoWidth\n                }));\n            },\n            _makeUnselectable: function () {\n                if (isIE8) {\n                    this.list.find('*').not('.k-textbox').attr('unselectable', 'on');\n                }\n            },\n            _toggleHover: function (e) {\n                $(e.currentTarget).toggleClass(HOVER, e.type === 'mouseenter');\n            },\n            _toggle: function (open, preventFocus) {\n                var that = this;\n                var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n                open = open !== undefined ? open : !that.popup.visible();\n                if (!preventFocus && !touchEnabled && that._focused[0] !== activeElement()) {\n                    that._prevent = true;\n                    that._focused.focus();\n                    that._prevent = false;\n                }\n                that[open ? OPEN : CLOSE]();\n            },\n            _triggerCascade: function () {\n                var that = this;\n                if (!that._cascadeTriggered || that.value() !== unifyType(that._cascadedValue, typeof that.value())) {\n                    that._cascadedValue = that.value();\n                    that._cascadeTriggered = true;\n                    that.trigger(CASCADE, { userTriggered: that._userTriggered });\n                }\n            },\n            _triggerChange: function () {\n                if (this._valueBeforeCascade !== this.value()) {\n                    this.trigger(CHANGE);\n                }\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(REQUESTSTART, that._requestStartHandler).unbind(REQUESTEND, that._requestEndHandler).unbind('error', that._errorHandler);\n            },\n            requireValueMapper: function (options, value) {\n                var hasValue = (options.value instanceof Array ? options.value.length : options.value) || (value instanceof Array ? value.length : value);\n                if (hasValue && options.virtual && typeof options.virtual.valueMapper !== 'function') {\n                    throw new Error('ValueMapper is not provided while the value is being set. See http://docs.telerik.com/kendo-ui/controls/editors/combobox/virtualization#the-valuemapper-function');\n                }\n            }\n        });\n        function unifyType(value, type) {\n            if (value !== undefined && value !== '' && value !== null) {\n                if (type === 'boolean') {\n                    value = Boolean(value);\n                } else if (type === 'number') {\n                    value = Number(value);\n                } else if (type === 'string') {\n                    value = value.toString();\n                }\n            }\n            return value;\n        }\n        extend(List, {\n            inArray: function (node, parentNode) {\n                var idx, length, siblings = parentNode.children;\n                if (!node || node.parentNode !== parentNode) {\n                    return -1;\n                }\n                for (idx = 0, length = siblings.length; idx < length; idx++) {\n                    if (node === siblings[idx]) {\n                        return idx;\n                    }\n                }\n                return -1;\n            },\n            unifyType: unifyType\n        });\n        kendo.ui.List = List;\n        ui.Select = List.extend({\n            init: function (element, options) {\n                List.fn.init.call(this, element, options);\n                this._initial = this.element.val();\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                var parent;\n                that.options.dataSource = dataSource;\n                that._dataSource();\n                if (that.listView.bound()) {\n                    that._initialIndex = null;\n                    that.listView._current = null;\n                }\n                that.listView.setDataSource(that.dataSource);\n                if (that.options.autoBind) {\n                    that.dataSource.fetch();\n                }\n                parent = that._parentWidget();\n                if (parent) {\n                    that._cascadeSelect(parent);\n                }\n            },\n            close: function () {\n                this.popup.close();\n            },\n            select: function (candidate) {\n                var that = this;\n                if (candidate === undefined) {\n                    return that.selectedIndex;\n                } else {\n                    return that._select(candidate).done(function () {\n                        that._cascadeValue = that._old = that._accessor();\n                        that._oldIndex = that.selectedIndex;\n                    });\n                }\n            },\n            _accessor: function (value, idx) {\n                return this[this._isSelect ? '_accessorSelect' : '_accessorInput'](value, idx);\n            },\n            _accessorInput: function (value) {\n                var element = this.element[0];\n                if (value === undefined) {\n                    return element.value;\n                } else {\n                    if (value === null) {\n                        value = '';\n                    }\n                    element.value = value;\n                }\n            },\n            _accessorSelect: function (value, idx) {\n                var element = this.element[0];\n                var hasValue;\n                if (value === undefined) {\n                    return getSelectedOption(element).value || '';\n                }\n                getSelectedOption(element).selected = false;\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                hasValue = value !== null && value !== '';\n                if (hasValue && idx == -1) {\n                    this._custom(value);\n                } else {\n                    if (value) {\n                        element.value = value;\n                    } else {\n                        element.selectedIndex = idx;\n                    }\n                }\n            },\n            _syncValueAndText: function () {\n                return true;\n            },\n            _custom: function (value) {\n                var that = this;\n                var element = that.element;\n                var custom = that._customOption;\n                if (!custom) {\n                    custom = $('<option/>');\n                    that._customOption = custom;\n                    element.append(custom);\n                }\n                custom.text(value);\n                custom[0].selected = true;\n            },\n            _hideBusy: function () {\n                var that = this;\n                clearTimeout(that._busy);\n                that._arrowIcon.removeClass(LOADING);\n                that._focused.attr('aria-busy', false);\n                that._busy = null;\n                that._showClear();\n            },\n            _showBusy: function (e) {\n                var that = this;\n                if (e.isDefaultPrevented()) {\n                    return;\n                }\n                that._request = true;\n                if (that._busy) {\n                    return;\n                }\n                that._busy = setTimeout(function () {\n                    if (that._arrowIcon) {\n                        that._focused.attr('aria-busy', true);\n                        that._arrowIcon.addClass(LOADING);\n                        that._hideClear();\n                    }\n                }, 100);\n            },\n            _requestEnd: function () {\n                this._request = false;\n                this._hideBusy();\n            },\n            _dataSource: function () {\n                var that = this, element = that.element, options = that.options, dataSource = options.dataSource || {}, idx;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (that._isSelect) {\n                    idx = element[0].selectedIndex;\n                    if (idx > -1) {\n                        options.index = idx;\n                    }\n                    dataSource.select = element;\n                    dataSource.fields = [\n                        { field: options.dataTextField },\n                        { field: options.dataValueField }\n                    ];\n                }\n                if (that.dataSource) {\n                    that._unbindDataSource();\n                } else {\n                    that._requestStartHandler = proxy(that._showBusy, that);\n                    that._requestEndHandler = proxy(that._requestEnd, that);\n                    that._errorHandler = proxy(that._hideBusy, that);\n                }\n                that.dataSource = kendo.data.DataSource.create(dataSource).bind(REQUESTSTART, that._requestStartHandler).bind(REQUESTEND, that._requestEndHandler).bind('error', that._errorHandler);\n            },\n            _firstItem: function () {\n                this.listView.focusFirst();\n            },\n            _lastItem: function () {\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                this.listView.focusNext();\n            },\n            _prevItem: function () {\n                this.listView.focusPrev();\n            },\n            _move: function (e) {\n                var that = this;\n                var listView = that.listView;\n                var key = e.keyCode;\n                var down = key === keys.DOWN;\n                var dataItem;\n                var pressed;\n                var current;\n                if (key === keys.UP || down) {\n                    if (e.altKey) {\n                        that.toggle(down);\n                    } else {\n                        if (!listView.bound() && !that.ul[0].firstChild) {\n                            if (!that._fetch) {\n                                that.dataSource.one(CHANGE, function () {\n                                    that._fetch = false;\n                                    that._move(e);\n                                });\n                                that._fetch = true;\n                                that._filterSource();\n                            }\n                            e.preventDefault();\n                            return true;\n                        }\n                        current = that._focus();\n                        if (!that._fetch && (!current || current.hasClass('k-state-selected'))) {\n                            if (down) {\n                                that._nextItem();\n                                if (!that._focus()) {\n                                    that._lastItem();\n                                }\n                            } else {\n                                that._prevItem();\n                                if (!that._focus()) {\n                                    that._firstItem();\n                                }\n                            }\n                        }\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(that._focus()));\n                        if (that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: that._focus()\n                            })) {\n                            that._focus(current);\n                            return;\n                        }\n                        that._select(that._focus(), true).done(function () {\n                            if (!that.popup.visible()) {\n                                that._blur();\n                            }\n                            if (that._cascadedValue === null) {\n                                that._cascadedValue = that.value();\n                            } else {\n                                that._cascadedValue = that.dataItem() ? that.dataItem()[that.options.dataValueField] || that.dataItem() : null;\n                            }\n                        });\n                    }\n                    e.preventDefault();\n                    pressed = true;\n                } else if (key === keys.ENTER || key === keys.TAB) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    current = that._focus();\n                    dataItem = that.dataItem();\n                    if (!that.popup.visible() && (!dataItem || that.text() !== that._text(dataItem))) {\n                        current = null;\n                    }\n                    var activeFilter = that.filterInput && that.filterInput[0] === activeElement();\n                    var selection;\n                    if (current) {\n                        dataItem = listView.dataItemByIndex(listView.getElementIndex(current));\n                        var shouldTrigger = true;\n                        if (dataItem) {\n                            shouldTrigger = that._value(dataItem) !== List.unifyType(that.value(), typeof that._value(dataItem));\n                        }\n                        if (shouldTrigger && that.trigger(SELECT, {\n                                dataItem: dataItem,\n                                item: current\n                            })) {\n                            return;\n                        }\n                        selection = that._select(current);\n                    } else if (that.input) {\n                        if (that._syncValueAndText() || that._isSelect) {\n                            that._accessor(that.input.val());\n                        }\n                        that.listView.value(that.input.val());\n                    }\n                    if (that._focusElement) {\n                        that._focusElement(that.wrapper);\n                    }\n                    if (activeFilter && key === keys.TAB) {\n                        that.wrapper.focusout();\n                    } else {\n                        if (selection && typeof selection.done === 'function') {\n                            selection.done(function () {\n                                that._blur();\n                            });\n                        } else {\n                            that._blur();\n                        }\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (key === keys.ESC) {\n                    if (that.popup.visible()) {\n                        e.preventDefault();\n                    }\n                    that.close();\n                    pressed = true;\n                } else if (that.popup.visible() && (key === keys.PAGEDOWN || key === keys.PAGEUP)) {\n                    e.preventDefault();\n                    var direction = key === keys.PAGEDOWN ? 1 : -1;\n                    listView.scrollWith(direction * listView.screenHeight());\n                    pressed = true;\n                }\n                return pressed;\n            },\n            _fetchData: function () {\n                var that = this;\n                var hasItems = !!that.dataSource.view().length;\n                if (that._request || that.options.cascadeFrom) {\n                    return;\n                }\n                if (!that.listView.bound() && !that._fetch && !hasItems) {\n                    that._fetch = true;\n                    that.dataSource.fetch().done(function () {\n                        that._fetch = false;\n                    });\n                }\n            },\n            _options: function (data, optionLabel, value) {\n                var that = this, element = that.element, htmlElement = element[0], length = data.length, options = '', option, dataItem, dataText, dataValue, idx = 0;\n                if (optionLabel) {\n                    options = optionLabel;\n                }\n                for (; idx < length; idx++) {\n                    option = '<option';\n                    dataItem = data[idx];\n                    dataText = that._text(dataItem);\n                    dataValue = that._value(dataItem);\n                    if (dataValue !== undefined) {\n                        dataValue += '';\n                        if (dataValue.indexOf('\"') !== -1) {\n                            dataValue = dataValue.replace(quotRegExp, '&quot;');\n                        }\n                        option += ' value=\"' + dataValue + '\"';\n                    }\n                    option += '>';\n                    if (dataText !== undefined) {\n                        option += htmlEncode(dataText);\n                    }\n                    option += '</option>';\n                    options += option;\n                }\n                element.html(options);\n                if (value !== undefined) {\n                    htmlElement.value = value;\n                    if (htmlElement.value && !value) {\n                        htmlElement.selectedIndex = -1;\n                    }\n                }\n                if (htmlElement.selectedIndex !== -1) {\n                    option = getSelectedOption(htmlElement);\n                    if (option) {\n                        option.setAttribute(SELECTED, SELECTED);\n                    }\n                }\n            },\n            _reset: function () {\n                var that = this, element = that.element, formId = element.attr('form'), form = formId ? $('#' + formId) : element.closest('form');\n                if (form[0]) {\n                    that._resetHandler = function () {\n                        setTimeout(function () {\n                            that.value(that._initial);\n                        });\n                    };\n                    that._form = form.on('reset', that._resetHandler);\n                }\n            },\n            _parentWidget: function () {\n                var name = this.options.name;\n                if (!this.options.cascadeFrom) {\n                    return;\n                }\n                var parentElement = $('#' + this.options.cascadeFrom);\n                var parent = parentElement.data('kendo' + name);\n                if (!parent) {\n                    parent = parentElement.data('kendo' + alternativeNames[name]);\n                }\n                return parent;\n            },\n            _cascade: function () {\n                var that = this;\n                var options = that.options;\n                var cascade = options.cascadeFrom;\n                var parent;\n                if (cascade) {\n                    parent = that._parentWidget();\n                    if (!parent) {\n                        return;\n                    }\n                    that._cascadeHandlerProxy = proxy(that._cascadeHandler, that);\n                    that._cascadeFilterRequests = [];\n                    options.autoBind = false;\n                    parent.bind('set', function () {\n                        that.one('set', function (e) {\n                            that._selectedValue = e.value || that._accessor();\n                        });\n                    });\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                    if (parent.listView.bound()) {\n                        that._toggleCascadeOnFocus();\n                        that._cascadeSelect(parent);\n                    } else {\n                        parent.one('dataBound', function () {\n                            that._toggleCascadeOnFocus();\n                            if (parent.popup.visible()) {\n                                parent._focused.focus();\n                            }\n                        });\n                        if (!parent.value()) {\n                            that.enable(false);\n                        }\n                    }\n                }\n            },\n            _toggleCascadeOnFocus: function () {\n                var that = this;\n                var parent = that._parentWidget();\n                var focusout = isIE ? 'blur' : 'focusout';\n                parent._focused.add(parent.filterInput).bind('focus', function () {\n                    parent.unbind(CASCADE, that._cascadeHandlerProxy);\n                    parent.first(CHANGE, that._cascadeHandlerProxy);\n                });\n                parent._focused.add(parent.filterInput).bind(focusout, function () {\n                    parent.unbind(CHANGE, that._cascadeHandlerProxy);\n                    parent.first(CASCADE, that._cascadeHandlerProxy);\n                });\n            },\n            _cascadeHandler: function (e) {\n                var parent = this._parentWidget();\n                var valueBeforeCascade = this.value();\n                this._userTriggered = e.userTriggered;\n                if (this.listView.bound()) {\n                    this._clearSelection(parent, true);\n                }\n                this._cascadeSelect(parent, valueBeforeCascade);\n            },\n            _cascadeChange: function (parent) {\n                var that = this;\n                var value = that._accessor() || that._selectedValue;\n                if (!that._cascadeFilterRequests.length) {\n                    that._selectedValue = null;\n                }\n                if (that._userTriggered) {\n                    that._clearSelection(parent, true);\n                } else if (value) {\n                    if (value !== unifyType(that.listView.value()[0], typeof value)) {\n                        that.value(value);\n                    }\n                    if (!that.dataSource.view()[0] || that.selectedIndex === -1) {\n                        that._clearSelection(parent, true);\n                    }\n                } else if (that.dataSource.flatView().length) {\n                    that.select(that.options.index);\n                }\n                that.enable();\n                that._triggerCascade();\n                that._triggerChange();\n                that._userTriggered = false;\n            },\n            _cascadeSelect: function (parent, valueBeforeCascade) {\n                var that = this;\n                var dataItem = parent.dataItem();\n                var filterValue = dataItem ? dataItem[that.options.cascadeFromParentField] || parent._value(dataItem) : null;\n                var valueField = that.options.cascadeFromField || parent.options.dataValueField;\n                var expressions;\n                that._valueBeforeCascade = valueBeforeCascade !== undefined ? valueBeforeCascade : that.value();\n                if (filterValue || filterValue === 0) {\n                    expressions = that.dataSource.filter() || {};\n                    removeFiltersForField(expressions, valueField);\n                    var handler = function () {\n                        var currentHandler = that._cascadeFilterRequests.shift();\n                        if (currentHandler) {\n                            that.unbind('dataBound', currentHandler);\n                        }\n                        currentHandler = that._cascadeFilterRequests[0];\n                        if (currentHandler) {\n                            that.first('dataBound', currentHandler);\n                        }\n                        that._cascadeChange(parent);\n                    };\n                    that._cascadeFilterRequests.push(handler);\n                    if (that._cascadeFilterRequests.length === 1) {\n                        that.first('dataBound', handler);\n                    }\n                    that._cascading = true;\n                    that._filterSource({\n                        field: valueField,\n                        operator: 'eq',\n                        value: filterValue\n                    });\n                    that._cascading = false;\n                } else {\n                    that.enable(false);\n                    that._clearSelection(parent);\n                    that._triggerCascade();\n                    that._triggerChange();\n                    that._userTriggered = false;\n                }\n            }\n        });\n        var STATIC_LIST_NS = '.StaticList';\n        var StaticList = kendo.ui.DataBoundWidget.extend({\n            init: function (element, options) {\n                Widget.fn.init.call(this, element, options);\n                this.element.attr('role', 'listbox').on('click' + STATIC_LIST_NS, 'li', proxy(this._click, this)).on('mouseenter' + STATIC_LIST_NS, 'li', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + STATIC_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                if (support.touch) {\n                    this._touchHandlers();\n                }\n                if (this.options.selectable === 'multiple') {\n                    this.element.attr('aria-multiselectable', true);\n                }\n                this.content = this.element.wrap('<div class=\\'k-list-scroller\\' unselectable=\\'on\\'></div>').parent();\n                this.header = this.content.before('<div class=\"k-group-header\" style=\"display:none\"></div>').prev();\n                this.bound(false);\n                this._optionID = kendo.guid();\n                this._selectedIndices = [];\n                this._view = [];\n                this._dataItems = [];\n                this._values = [];\n                var value = this.options.value;\n                if (value) {\n                    this._values = $.isArray(value) ? value.slice(0) : [value];\n                }\n                this._getter();\n                this._templates();\n                this.setDataSource(this.options.dataSource);\n                this._onScroll = proxy(function () {\n                    var that = this;\n                    clearTimeout(that._scrollId);\n                    that._scrollId = setTimeout(function () {\n                        that._renderHeader();\n                    }, 50);\n                }, this);\n            },\n            options: {\n                name: 'StaticList',\n                dataValueField: null,\n                valuePrimitive: false,\n                selectable: true,\n                template: null,\n                groupTemplate: null,\n                fixedGroupTemplate: null\n            },\n            events: [\n                'click',\n                CHANGE,\n                'activate',\n                'deactivate',\n                'dataBinding',\n                'dataBound',\n                'selectedItemChange'\n            ],\n            setDataSource: function (source) {\n                var that = this;\n                var dataSource = source || {};\n                var value;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource = kendo.data.DataSource.create(dataSource);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    value = that.value();\n                    that.value([]);\n                    that.bound(false);\n                    that.value(value);\n                } else {\n                    that._refreshHandler = proxy(that.refresh, that);\n                }\n                that.setDSFilter(dataSource.filter());\n                that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n                that._fixedHeader();\n            },\n            _touchHandlers: function () {\n                var that = this;\n                var startY;\n                var endY;\n                var tapPosition = function (event) {\n                    return (event.originalEvent || event).changedTouches[0].pageY;\n                };\n                that.element.on('touchstart' + STATIC_LIST_NS, function (e) {\n                    startY = tapPosition(e);\n                });\n                that.element.on('touchend' + STATIC_LIST_NS, function (e) {\n                    if (e.isDefaultPrevented()) {\n                        return;\n                    }\n                    endY = tapPosition(e);\n                    if (Math.abs(endY - startY) < 10) {\n                        that._touchTriggered = true;\n                        that._triggerClick($(e.target).closest(ITEMSELECTOR).get(0));\n                    }\n                });\n            },\n            skip: function () {\n                return this.dataSource.skip();\n            },\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                this._getter();\n                this._templates();\n                this._render();\n            },\n            destroy: function () {\n                this.element.off(STATIC_LIST_NS);\n                if (this._refreshHandler) {\n                    this.dataSource.unbind(CHANGE, this._refreshHandler);\n                }\n                clearTimeout(this._scrollId);\n                Widget.fn.destroy.call(this);\n            },\n            dataItemByIndex: function (index) {\n                return this.dataSource.flatView()[index];\n            },\n            screenHeight: function () {\n                return this.content[0].clientHeight;\n            },\n            scrollToIndex: function (index) {\n                var item = this.element[0].children[index];\n                if (item) {\n                    this.scroll(item);\n                }\n            },\n            scrollWith: function (value) {\n                this.content.scrollTop(this.content.scrollTop() + value);\n            },\n            scroll: function (item) {\n                if (!item) {\n                    return;\n                }\n                if (item[0]) {\n                    item = item[0];\n                }\n                var content = this.content[0], itemOffsetTop = item.offsetTop, itemOffsetHeight = item.offsetHeight, contentScrollTop = content.scrollTop, contentOffsetHeight = content.clientHeight, bottomDistance = itemOffsetTop + itemOffsetHeight;\n                if (contentScrollTop > itemOffsetTop) {\n                    contentScrollTop = itemOffsetTop;\n                } else if (bottomDistance > contentScrollTop + contentOffsetHeight) {\n                    contentScrollTop = bottomDistance - contentOffsetHeight;\n                }\n                content.scrollTop = contentScrollTop;\n            },\n            selectedDataItems: function (dataItems) {\n                if (dataItems === undefined) {\n                    return this._dataItems.slice();\n                }\n                this._dataItems = dataItems;\n                this._values = this._getValues(dataItems);\n            },\n            _getValues: function (dataItems) {\n                var getter = this._valueGetter;\n                return $.map(dataItems, function (dataItem) {\n                    return getter(dataItem);\n                });\n            },\n            focusNext: function () {\n                var current = this.focus();\n                if (!current) {\n                    current = 0;\n                } else {\n                    current = current.next();\n                }\n                this.focus(current);\n            },\n            focusPrev: function () {\n                var current = this.focus();\n                if (!current) {\n                    current = this.element[0].children.length - 1;\n                } else {\n                    current = current.prev();\n                }\n                this.focus(current);\n            },\n            focusFirst: function () {\n                this.focus(this.element[0].children[0]);\n            },\n            focusLast: function () {\n                this.focus(last(this.element[0].children));\n            },\n            focus: function (candidate) {\n                var that = this;\n                var id = that._optionID;\n                var hasCandidate;\n                if (candidate === undefined) {\n                    return that._current;\n                }\n                candidate = last(that._get(candidate));\n                candidate = $(this.element[0].children[candidate]);\n                if (that._current) {\n                    that._current.removeClass(FOCUSED).removeAttr(ID);\n                    that.trigger('deactivate');\n                }\n                hasCandidate = !!candidate[0];\n                if (hasCandidate) {\n                    candidate.addClass(FOCUSED);\n                    that.scroll(candidate);\n                    candidate.attr('id', id);\n                }\n                that._current = hasCandidate ? candidate : null;\n                that.trigger('activate');\n            },\n            focusIndex: function () {\n                return this.focus() ? this.focus().index() : undefined;\n            },\n            skipUpdate: function (skipUpdate) {\n                this._skipUpdate = skipUpdate;\n            },\n            select: function (indices) {\n                var that = this;\n                var selectable = that.options.selectable;\n                var singleSelection = selectable !== 'multiple' && selectable !== false;\n                var selectedIndices = that._selectedIndices;\n                var uiSelectedIndices = [this.element.find('.k-state-selected').index()];\n                var added = [];\n                var removed = [];\n                var result;\n                if (indices === undefined) {\n                    return selectedIndices.slice();\n                }\n                indices = that._get(indices);\n                if (indices.length === 1 && indices[0] === -1) {\n                    indices = [];\n                }\n                var deferred = $.Deferred().resolve();\n                var filtered = that.isFiltered();\n                if (filtered && !singleSelection && that._deselectFiltered(indices)) {\n                    return deferred;\n                }\n                if (singleSelection && !filtered && $.inArray(last(indices), selectedIndices) !== -1 && $.inArray(last(indices), uiSelectedIndices) !== -1) {\n                    if (that._dataItems.length && that._view.length) {\n                        that._dataItems = [that._view[selectedIndices[0]].item];\n                    }\n                    return deferred;\n                }\n                result = that._deselect(indices);\n                removed = result.removed;\n                indices = result.indices;\n                if (indices.length) {\n                    if (singleSelection) {\n                        indices = [last(indices)];\n                    }\n                    added = that._select(indices);\n                }\n                if (added.length || removed.length) {\n                    that._valueComparer = null;\n                    that.trigger(CHANGE, {\n                        added: added,\n                        removed: removed\n                    });\n                }\n                return deferred;\n            },\n            removeAt: function (position) {\n                this._selectedIndices.splice(position, 1);\n                this._values.splice(position, 1);\n                this._valueComparer = null;\n                return {\n                    position: position,\n                    dataItem: this._dataItems.splice(position, 1)[0]\n                };\n            },\n            setValue: function (value) {\n                value = $.isArray(value) || value instanceof ObservableArray ? value.slice(0) : [value];\n                this._values = value;\n                this._valueComparer = null;\n            },\n            value: function (value) {\n                var that = this;\n                var deferred = that._valueDeferred;\n                var indices;\n                if (value === undefined) {\n                    return that._values.slice();\n                }\n                that.setValue(value);\n                if (!deferred || deferred.state() === 'resolved') {\n                    that._valueDeferred = deferred = $.Deferred();\n                }\n                if (that.bound()) {\n                    indices = that._valueIndices(that._values);\n                    if (that.options.selectable === 'multiple') {\n                        that.select(-1);\n                    }\n                    that.select(indices);\n                    deferred.resolve();\n                }\n                that._skipUpdate = false;\n                return deferred;\n            },\n            items: function () {\n                return this.element.children(ITEMSELECTOR);\n            },\n            _click: function (e) {\n                if (this._touchTriggered) {\n                    this._touchTriggered = false;\n                    return;\n                }\n                if (!e.isDefaultPrevented()) {\n                    this._triggerClick(e.currentTarget);\n                }\n            },\n            _triggerClick: function (item) {\n                if (!this.trigger('click', { item: $(item) })) {\n                    this.select(item);\n                }\n            },\n            _valueExpr: function (type, values) {\n                var that = this;\n                var idx = 0;\n                var body;\n                var comparer;\n                var normalized = [];\n                if (!that._valueComparer || that._valueType !== type) {\n                    that._valueType = type;\n                    for (; idx < values.length; idx++) {\n                        normalized.push(unifyType(values[idx], type));\n                    }\n                    body = 'for (var idx = 0; idx < ' + normalized.length + '; idx++) {' + ' if (current === values[idx]) {' + '   return idx;' + ' }' + '} ' + 'return -1;';\n                    comparer = new Function('current', 'values', body);\n                    that._valueComparer = function (current) {\n                        return comparer(current, normalized);\n                    };\n                }\n                return that._valueComparer;\n            },\n            _dataItemPosition: function (dataItem, values) {\n                var value = this._valueGetter(dataItem);\n                var valueExpr = this._valueExpr(typeof value, values);\n                return valueExpr(value);\n            },\n            _getter: function () {\n                this._valueGetter = kendo.getter(this.options.dataValueField);\n            },\n            _deselect: function (indices) {\n                var that = this;\n                var children = that.element[0].children;\n                var selectable = that.options.selectable;\n                var selectedIndices = that._selectedIndices;\n                var dataItems = that._dataItems;\n                var values = that._values;\n                var removed = [];\n                var i = 0;\n                var j;\n                var index, selectedIndex;\n                var removedIndices = 0;\n                indices = indices.slice();\n                if (selectable === true || !indices.length) {\n                    for (; i < selectedIndices.length; i++) {\n                        $(children[selectedIndices[i]]).removeClass('k-state-selected').attr('aria-selected', false);\n                        removed.push({\n                            position: i,\n                            dataItem: dataItems[i]\n                        });\n                    }\n                    that._values = [];\n                    that._dataItems = [];\n                    that._selectedIndices = [];\n                } else if (selectable === 'multiple') {\n                    for (; i < indices.length; i++) {\n                        index = indices[i];\n                        if (!$(children[index]).hasClass('k-state-selected')) {\n                            continue;\n                        }\n                        for (j = 0; j < selectedIndices.length; j++) {\n                            selectedIndex = selectedIndices[j];\n                            if (selectedIndex === index) {\n                                $(children[selectedIndex]).removeClass('k-state-selected').attr('aria-selected', false);\n                                removed.push({\n                                    position: j + removedIndices,\n                                    dataItem: dataItems.splice(j, 1)[0]\n                                });\n                                selectedIndices.splice(j, 1);\n                                indices.splice(i, 1);\n                                values.splice(j, 1);\n                                removedIndices += 1;\n                                i -= 1;\n                                j -= 1;\n                                break;\n                            }\n                        }\n                    }\n                }\n                return {\n                    indices: indices,\n                    removed: removed\n                };\n            },\n            _deselectFiltered: function (indices) {\n                var children = this.element[0].children;\n                var dataItem, index, position;\n                var removed = [];\n                var idx = 0;\n                for (; idx < indices.length; idx++) {\n                    index = indices[idx];\n                    dataItem = this._view[index].item;\n                    position = this._dataItemPosition(dataItem, this._values);\n                    if (position > -1) {\n                        removed.push(this.removeAt(position));\n                        $(children[index]).removeClass('k-state-selected');\n                    }\n                }\n                if (removed.length) {\n                    this.trigger(CHANGE, {\n                        added: [],\n                        removed: removed\n                    });\n                    return true;\n                }\n                return false;\n            },\n            _select: function (indices) {\n                var that = this;\n                var children = that.element[0].children;\n                var data = that._view;\n                var dataItem, index;\n                var added = [];\n                var idx = 0;\n                if (last(indices) !== -1) {\n                    that.focus(indices);\n                }\n                for (; idx < indices.length; idx++) {\n                    index = indices[idx];\n                    dataItem = data[index];\n                    if (index === -1 || !dataItem) {\n                        continue;\n                    }\n                    dataItem = dataItem.item;\n                    that._selectedIndices.push(index);\n                    that._dataItems.push(dataItem);\n                    that._values.push(that._valueGetter(dataItem));\n                    $(children[index]).addClass('k-state-selected').attr('aria-selected', true);\n                    added.push({ dataItem: dataItem });\n                }\n                return added;\n            },\n            getElementIndex: function (element) {\n                return $(element).data('offset-index');\n            },\n            _get: function (candidate) {\n                if (typeof candidate === 'number') {\n                    candidate = [candidate];\n                } else if (!isArray(candidate)) {\n                    candidate = this.getElementIndex(candidate);\n                    candidate = [candidate !== undefined ? candidate : -1];\n                }\n                return candidate;\n            },\n            _template: function () {\n                var that = this;\n                var options = that.options;\n                var template = options.template;\n                if (!template) {\n                    template = kendo.template('<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">${' + kendo.expr(options.dataTextField, 'data') + '}</li>', { useWithBlock: false });\n                } else {\n                    template = kendo.template(template);\n                    template = function (data) {\n                        return '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item\">' + template(data) + '</li>';\n                    };\n                }\n                return template;\n            },\n            _templates: function () {\n                var template;\n                var options = this.options;\n                var templates = {\n                    template: options.template,\n                    groupTemplate: options.groupTemplate,\n                    fixedGroupTemplate: options.fixedGroupTemplate\n                };\n                if (options.columns) {\n                    for (var i = 0; i < options.columns.length; i++) {\n                        var currentColumn = options.columns[i];\n                        var templateText = currentColumn.field ? currentColumn.field.toString() : 'text';\n                        templates['column' + i] = currentColumn.template || '#: ' + templateText + '#';\n                    }\n                }\n                for (var key in templates) {\n                    template = templates[key];\n                    if (template && typeof template !== 'function') {\n                        templates[key] = kendo.template(template);\n                    }\n                }\n                this.templates = templates;\n            },\n            _normalizeIndices: function (indices) {\n                var newIndices = [];\n                var idx = 0;\n                for (; idx < indices.length; idx++) {\n                    if (indices[idx] !== undefined) {\n                        newIndices.push(indices[idx]);\n                    }\n                }\n                return newIndices;\n            },\n            _valueIndices: function (values, indices) {\n                var data = this._view;\n                var idx = 0;\n                var index;\n                indices = indices ? indices.slice() : [];\n                if (!values.length) {\n                    return [];\n                }\n                for (; idx < data.length; idx++) {\n                    index = this._dataItemPosition(data[idx].item, values);\n                    if (index !== -1) {\n                        indices[index] = idx;\n                    }\n                }\n                return this._normalizeIndices(indices);\n            },\n            _firstVisibleItem: function () {\n                var element = this.element[0];\n                var content = this.content[0];\n                var scrollTop = content.scrollTop;\n                var itemHeight = $(element.children[0]).height();\n                var itemIndex = Math.floor(scrollTop / itemHeight) || 0;\n                var item = element.children[itemIndex] || element.lastChild;\n                var forward = item.offsetTop < scrollTop;\n                while (item) {\n                    if (forward) {\n                        if (item.offsetTop + itemHeight > scrollTop || !item.nextSibling) {\n                            break;\n                        }\n                        item = item.nextSibling;\n                    } else {\n                        if (item.offsetTop <= scrollTop || !item.previousSibling) {\n                            break;\n                        }\n                        item = item.previousSibling;\n                    }\n                }\n                return this._view[$(item).data('offset-index')];\n            },\n            _fixedHeader: function () {\n                if (this.isGrouped() && this.templates.fixedGroupTemplate) {\n                    this.header.show();\n                    this.content.scroll(this._onScroll);\n                } else {\n                    this.header.hide();\n                    this.content.off('scroll', this._onScroll);\n                }\n            },\n            _renderHeader: function () {\n                var template = this.templates.fixedGroupTemplate;\n                if (!template) {\n                    return;\n                }\n                var visibleItem = this._firstVisibleItem();\n                if (visibleItem && visibleItem.group.toString().length) {\n                    this.header.html(template(visibleItem.group));\n                }\n            },\n            _renderItem: function (context) {\n                var item = '<li tabindex=\"-1\" role=\"option\" unselectable=\"on\" class=\"k-item';\n                var dataItem = context.item;\n                var notFirstItem = context.index !== 0;\n                var selected = context.selected;\n                var isGrouped = this.isGrouped();\n                var hasColumns = this.options.columns && this.options.columns.length;\n                if (notFirstItem && context.newGroup) {\n                    item += ' k-first';\n                }\n                if (context.isLastGroupedItem && hasColumns) {\n                    item += ' k-last';\n                }\n                if (selected) {\n                    item += ' k-state-selected';\n                }\n                item += '\" aria-selected=\"' + (selected ? 'true' : 'false') + '\" data-offset-index=\"' + context.index + '\">';\n                if (hasColumns) {\n                    item += this._renderColumns(dataItem);\n                } else {\n                    item += this.templates.template(dataItem);\n                }\n                if (notFirstItem && context.newGroup) {\n                    if (hasColumns) {\n                        item += '<div class=\"k-cell k-group-cell\"><span>' + this.templates.groupTemplate(context.group) + '</span></div>';\n                    } else {\n                        item += '<div class=\"k-group\">' + this.templates.groupTemplate(context.group) + '</div>';\n                    }\n                } else if (isGrouped && hasColumns) {\n                    item += '<div class=\\'k-cell k-spacer-cell\\'></div>';\n                }\n                return item + '</li>';\n            },\n            _renderColumns: function (dataItem) {\n                var item = '';\n                for (var i = 0; i < this.options.columns.length; i++) {\n                    var currentWidth = this.options.columns[i].width;\n                    var currentWidthInt = parseInt(currentWidth, 10);\n                    var widthStyle = '';\n                    if (currentWidth && !isNaN(currentWidthInt)) {\n                        widthStyle += 'style=\\'width:';\n                        widthStyle += currentWidthInt;\n                        widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n                        widthStyle += ';\\'';\n                    }\n                    item += '<span class=\\'k-cell\\' ' + widthStyle + '>';\n                    item += this.templates['column' + i](dataItem);\n                    item += '</span>';\n                }\n                return item;\n            },\n            _render: function () {\n                var html = '';\n                var i = 0;\n                var idx = 0;\n                var context;\n                var dataContext = [];\n                var view = this.dataSource.view();\n                var values = this.value();\n                var group, newGroup, j;\n                var isGrouped = this.isGrouped();\n                if (isGrouped) {\n                    for (i = 0; i < view.length; i++) {\n                        group = view[i];\n                        newGroup = true;\n                        for (j = 0; j < group.items.length; j++) {\n                            context = {\n                                selected: this._selected(group.items[j], values),\n                                item: group.items[j],\n                                group: group.value,\n                                newGroup: newGroup,\n                                isLastGroupedItem: j === group.items.length - 1,\n                                index: idx\n                            };\n                            dataContext[idx] = context;\n                            idx += 1;\n                            html += this._renderItem(context);\n                            newGroup = false;\n                        }\n                    }\n                } else {\n                    for (i = 0; i < view.length; i++) {\n                        context = {\n                            selected: this._selected(view[i], values),\n                            item: view[i],\n                            index: i\n                        };\n                        dataContext[i] = context;\n                        html += this._renderItem(context);\n                    }\n                }\n                this._view = dataContext;\n                this.element[0].innerHTML = html;\n                if (isGrouped && dataContext.length) {\n                    this._renderHeader();\n                }\n            },\n            _selected: function (dataItem, values) {\n                var select = !this.isFiltered() || this.options.selectable === 'multiple';\n                return select && this._dataItemPosition(dataItem, values) !== -1;\n            },\n            setDSFilter: function (filter) {\n                this._lastDSFilter = extend({}, filter);\n            },\n            isFiltered: function () {\n                if (!this._lastDSFilter) {\n                    this.setDSFilter(this.dataSource.filter());\n                }\n                return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n            },\n            refresh: function (e) {\n                var that = this;\n                var action = e && e.action;\n                var skipUpdateOnBind = that.options.skipUpdateOnBind;\n                var isItemChange = action === 'itemchange';\n                var result;\n                that.trigger('dataBinding');\n                that._angularItems('cleanup');\n                that._fixedHeader();\n                that._render();\n                that.bound(true);\n                if (isItemChange || action === 'remove') {\n                    result = mapChangedItems(that._dataItems, e.items);\n                    if (result.changed.length) {\n                        if (isItemChange) {\n                            that.trigger('selectedItemChange', { items: result.changed });\n                        } else {\n                            that.value(that._getValues(result.unchanged));\n                        }\n                    }\n                } else if (that.isFiltered() || that._skipUpdate || that._emptySearch) {\n                    that.focus(0);\n                    if (that._skipUpdate) {\n                        that._skipUpdate = false;\n                        that._selectedIndices = that._valueIndices(that._values, that._selectedIndices);\n                    }\n                } else if (!skipUpdateOnBind && (!action || action === 'add')) {\n                    that.value(that._values);\n                }\n                if (that._valueDeferred) {\n                    that._valueDeferred.resolve();\n                }\n                that._angularItems('compile');\n                that.trigger('dataBound');\n            },\n            bound: function (bound) {\n                if (bound === undefined) {\n                    return this._bound;\n                }\n                this._bound = bound;\n            },\n            isGrouped: function () {\n                return (this.dataSource.group() || []).length;\n            }\n        });\n        ui.plugin(StaticList);\n        function last(list) {\n            return list[list.length - 1];\n        }\n        function getSelectedOption(select) {\n            var index = select.selectedIndex;\n            return index > -1 ? select.options[index] : {};\n        }\n        function mapChangedItems(selected, itemsToMatch) {\n            var itemsLength = itemsToMatch.length;\n            var selectedLength = selected.length;\n            var dataItem;\n            var found;\n            var i, j;\n            var changed = [];\n            var unchanged = [];\n            if (selectedLength) {\n                for (i = 0; i < selectedLength; i++) {\n                    dataItem = selected[i];\n                    found = false;\n                    for (j = 0; j < itemsLength; j++) {\n                        if (dataItem === itemsToMatch[j]) {\n                            found = true;\n                            changed.push({\n                                index: i,\n                                item: dataItem\n                            });\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        unchanged.push(dataItem);\n                    }\n                }\n            }\n            return {\n                changed: changed,\n                unchanged: unchanged\n            };\n        }\n        function isValidFilterExpr(expression) {\n            if (!expression || $.isEmptyObject(expression)) {\n                return false;\n            }\n            if (expression.filters && !expression.filters.length) {\n                return false;\n            }\n            return true;\n        }\n        function removeFiltersForField(expression, field) {\n            var filters;\n            var found = false;\n            if (expression.filters) {\n                filters = $.grep(expression.filters, function (filter) {\n                    found = removeFiltersForField(filter, field);\n                    if (filter.filters) {\n                        return filter.filters.length;\n                    } else {\n                        return filter.field != field;\n                    }\n                });\n                if (!found && expression.filters.length !== filters.length) {\n                    found = true;\n                }\n                expression.filters = filters;\n            }\n            return found;\n        }\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.virtuallist', ['kendo.data'], f);\n}(function () {\n    var __meta__ = {\n        id: 'virtuallist',\n        name: 'VirtualList',\n        category: 'framework',\n        depends: ['data'],\n        hidden: true\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, Widget = ui.Widget, DataBoundWidget = ui.DataBoundWidget, proxy = $.proxy, percentageUnitsRegex = /^\\d+(\\.\\d+)?%$/i, WRAPPER = 'k-virtual-wrap', VIRTUALLIST = 'k-virtual-list', CONTENT = 'k-virtual-content', LIST = 'k-list', HEADER = 'k-group-header', VIRTUALITEM = 'k-virtual-item', ITEM = 'k-item', HEIGHTCONTAINER = 'k-height-container', GROUPITEM = 'k-group', SELECTED = 'k-state-selected', FOCUSED = 'k-state-focused', HOVER = 'k-state-hover', CHANGE = 'change', CLICK = 'click', LISTBOUND = 'listBound', ITEMCHANGE = 'itemChange', ACTIVATE = 'activate', DEACTIVATE = 'deactivate', VIRTUAL_LIST_NS = '.VirtualList';\n        function lastFrom(array) {\n            return array[array.length - 1];\n        }\n        function toArray(value) {\n            return value instanceof Array ? value : [value];\n        }\n        function isPrimitive(dataItem) {\n            return typeof dataItem === 'string' || typeof dataItem === 'number' || typeof dataItem === 'boolean';\n        }\n        function getItemCount(screenHeight, listScreens, itemHeight) {\n            return Math.ceil(screenHeight * listScreens / itemHeight);\n        }\n        function appendChild(parent, className, tagName) {\n            var element = document.createElement(tagName || 'div');\n            if (className) {\n                element.className = className;\n            }\n            parent.appendChild(element);\n            return element;\n        }\n        function getDefaultItemHeight() {\n            var mockList = $('<div class=\"k-popup\"><ul class=\"k-list\"><li class=\"k-item\"><li></ul></div>'), lineHeight;\n            mockList.css({\n                position: 'absolute',\n                left: '-200000px',\n                visibility: 'hidden'\n            });\n            mockList.appendTo(document.body);\n            lineHeight = parseFloat(kendo.getComputedStyles(mockList.find('.k-item')[0], ['line-height'])['line-height']);\n            mockList.remove();\n            return lineHeight;\n        }\n        function bufferSizes(screenHeight, listScreens, opposite) {\n            return {\n                down: screenHeight * opposite,\n                up: screenHeight * (listScreens - 1 - opposite)\n            };\n        }\n        function listValidator(options, screenHeight) {\n            var downThreshold = (options.listScreens - 1 - options.threshold) * screenHeight;\n            var upThreshold = options.threshold * screenHeight;\n            return function (list, scrollTop, lastScrollTop) {\n                if (scrollTop > lastScrollTop) {\n                    return scrollTop - list.top < downThreshold;\n                } else {\n                    return list.top === 0 || scrollTop - list.top > upThreshold;\n                }\n            };\n        }\n        function scrollCallback(element, callback) {\n            return function (force) {\n                return callback(element.scrollTop, force);\n            };\n        }\n        function syncList(reorder) {\n            return function (list, force) {\n                reorder(list.items, list.index, force);\n                return list;\n            };\n        }\n        function position(element, y) {\n            if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n                element.style.top = y + 'px';\n            } else {\n                element.style.webkitTransform = 'translateY(' + y + 'px)';\n                element.style.transform = 'translateY(' + y + 'px)';\n            }\n        }\n        function map2(callback, templates) {\n            return function (arr1, arr2) {\n                for (var i = 0, len = arr1.length; i < len; i++) {\n                    callback(arr1[i], arr2[i], templates);\n                    if (arr2[i].item) {\n                        this.trigger(ITEMCHANGE, {\n                            item: $(arr1[i]),\n                            data: arr2[i].item,\n                            ns: kendo.ui\n                        });\n                    }\n                }\n            };\n        }\n        function reshift(items, diff) {\n            var range;\n            if (diff > 0) {\n                range = items.splice(0, diff);\n                items.push.apply(items, range);\n            } else {\n                range = items.splice(diff, -diff);\n                items.unshift.apply(items, range);\n            }\n            return range;\n        }\n        function render(element, data, templates) {\n            var itemTemplate = templates.template;\n            element = $(element);\n            if (!data.item) {\n                itemTemplate = templates.placeholderTemplate;\n            }\n            if (data.index === 0 && this.header && data.group) {\n                this.header.html(templates.fixedGroupTemplate(data.group));\n            }\n            this.angular('cleanup', function () {\n                return { elements: [element] };\n            });\n            element.attr('data-uid', data.item ? data.item.uid : '').attr('data-offset-index', data.index);\n            if (this.options.columns && this.options.columns.length && data.item) {\n                element.html(renderColumns(this.options, data.item, templates));\n            } else {\n                element.html(itemTemplate(data.item || {}));\n            }\n            element.toggleClass(FOCUSED, data.current);\n            element.toggleClass(SELECTED, data.selected);\n            element.toggleClass('k-first', data.newGroup);\n            element.toggleClass('k-last', data.isLastGroupedItem);\n            element.toggleClass('k-loading-item', !data.item);\n            if (data.index !== 0 && data.newGroup) {\n                $('<div class=' + GROUPITEM + '></div>').appendTo(element).html(templates.groupTemplate(data.group));\n            }\n            if (data.top !== undefined) {\n                position(element[0], data.top);\n            }\n            this.angular('compile', function () {\n                return {\n                    elements: [element],\n                    data: [{\n                            dataItem: data.item,\n                            group: data.group,\n                            newGroup: data.newGroup\n                        }]\n                };\n            });\n        }\n        function renderColumns(options, dataItem, templates) {\n            var item = '';\n            for (var i = 0; i < options.columns.length; i++) {\n                var currentWidth = options.columns[i].width;\n                var currentWidthInt = parseInt(currentWidth, 10);\n                var widthStyle = '';\n                if (currentWidth) {\n                    widthStyle += 'style=\\'width:';\n                    widthStyle += currentWidthInt;\n                    widthStyle += percentageUnitsRegex.test(currentWidth) ? '%' : 'px';\n                    widthStyle += ';\\'';\n                }\n                item += '<span class=\\'k-cell\\' ' + widthStyle + '>';\n                item += templates['column' + i](dataItem);\n                item += '</span>';\n            }\n            return item;\n        }\n        function mapChangedItems(selected, itemsToMatch) {\n            var itemsLength = itemsToMatch.length;\n            var selectedLength = selected.length;\n            var dataItem;\n            var found;\n            var i, j;\n            var changed = [];\n            var unchanged = [];\n            if (selectedLength) {\n                for (i = 0; i < selectedLength; i++) {\n                    dataItem = selected[i];\n                    found = false;\n                    for (j = 0; j < itemsLength; j++) {\n                        if (dataItem === itemsToMatch[j]) {\n                            found = true;\n                            changed.push({\n                                index: i,\n                                item: dataItem\n                            });\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        unchanged.push(dataItem);\n                    }\n                }\n            }\n            return {\n                changed: changed,\n                unchanged: unchanged\n            };\n        }\n        function isActivePromise(promise) {\n            return promise && promise.state() !== 'resolved';\n        }\n        var VirtualList = DataBoundWidget.extend({\n            init: function (element, options) {\n                var that = this;\n                that.bound(false);\n                that._fetching = false;\n                Widget.fn.init.call(that, element, options);\n                if (!that.options.itemHeight) {\n                    that.options.itemHeight = getDefaultItemHeight();\n                }\n                options = that.options;\n                that.element.addClass(LIST + ' ' + VIRTUALLIST).attr('role', 'listbox');\n                that.content = that.element.wrap('<div unselectable=\\'on\\' class=\\'' + CONTENT + '\\'></div>').parent();\n                that.wrapper = that.content.wrap('<div class=\\'' + WRAPPER + '\\'></div>').parent();\n                that.header = that.content.before('<div class=\\'' + HEADER + '\\'></div>').prev();\n                if (options.columns && options.columns.length) {\n                    that.element.removeClass(LIST);\n                }\n                that.element.on('mouseenter' + VIRTUAL_LIST_NS, 'li:not(.k-loading-item)', function () {\n                    $(this).addClass(HOVER);\n                }).on('mouseleave' + VIRTUAL_LIST_NS, 'li', function () {\n                    $(this).removeClass(HOVER);\n                });\n                that._values = toArray(that.options.value);\n                that._selectedDataItems = [];\n                that._selectedIndexes = [];\n                that._rangesList = {};\n                that._promisesList = [];\n                that._optionID = kendo.guid();\n                that._templates();\n                that.setDataSource(options.dataSource);\n                that.content.on('scroll' + VIRTUAL_LIST_NS, kendo.throttle(function () {\n                    that._renderItems();\n                    that._triggerListBound();\n                }, options.delay));\n                that._selectable();\n            },\n            options: {\n                name: 'VirtualList',\n                autoBind: true,\n                delay: 100,\n                height: null,\n                listScreens: 4,\n                threshold: 0.5,\n                itemHeight: null,\n                oppositeBuffer: 1,\n                type: 'flat',\n                selectable: false,\n                value: [],\n                dataValueField: null,\n                template: '#:data#',\n                placeholderTemplate: 'loading...',\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                mapValueTo: 'index',\n                valueMapper: null\n            },\n            events: [\n                CHANGE,\n                CLICK,\n                LISTBOUND,\n                ITEMCHANGE,\n                ACTIVATE,\n                DEACTIVATE\n            ],\n            setOptions: function (options) {\n                Widget.fn.setOptions.call(this, options);\n                if (this._selectProxy && this.options.selectable === false) {\n                    this.element.off(CLICK, '.' + VIRTUALITEM, this._selectProxy);\n                } else if (!this._selectProxy && this.options.selectable) {\n                    this._selectable();\n                }\n                this._templates();\n                this.refresh();\n            },\n            items: function () {\n                return $(this._items);\n            },\n            destroy: function () {\n                this.wrapper.off(VIRTUAL_LIST_NS);\n                this.dataSource.unbind(CHANGE, this._refreshHandler);\n                Widget.fn.destroy.call(this);\n            },\n            setDataSource: function (source) {\n                var that = this;\n                var dataSource = source || {};\n                var value;\n                dataSource = $.isArray(dataSource) ? { data: dataSource } : dataSource;\n                dataSource = kendo.data.DataSource.create(dataSource);\n                if (that.dataSource) {\n                    that.dataSource.unbind(CHANGE, that._refreshHandler);\n                    that._clean();\n                    that.bound(false);\n                    that._deferValueSet = true;\n                    value = that.value();\n                    that.value([]);\n                    that.mute(function () {\n                        that.value(value);\n                    });\n                } else {\n                    that._refreshHandler = $.proxy(that.refresh, that);\n                }\n                that.dataSource = dataSource.bind(CHANGE, that._refreshHandler);\n                that.setDSFilter(dataSource.filter());\n                if (dataSource.view().length !== 0) {\n                    that.refresh();\n                } else if (that.options.autoBind) {\n                    dataSource.fetch();\n                }\n            },\n            skip: function () {\n                return this.dataSource.currentRangeStart();\n            },\n            _triggerListBound: function () {\n                var that = this;\n                var skip = that.skip();\n                if (that.bound() && !that._selectingValue && that._skip !== skip) {\n                    that._skip = skip;\n                    that.trigger(LISTBOUND);\n                }\n            },\n            _getValues: function (dataItems) {\n                var getter = this._valueGetter;\n                return $.map(dataItems, function (dataItem) {\n                    return getter(dataItem);\n                });\n            },\n            _highlightSelectedItems: function () {\n                for (var i = 0; i < this._selectedDataItems.length; i++) {\n                    var item = this._getElementByDataItem(this._selectedDataItems[i]);\n                    if (item.length) {\n                        item.addClass(SELECTED);\n                    }\n                }\n            },\n            refresh: function (e) {\n                var that = this;\n                var action = e && e.action;\n                var isItemChange = action === 'itemchange';\n                var filtered = this.isFiltered();\n                var result;\n                if (that._mute) {\n                    return;\n                }\n                that._deferValueSet = false;\n                if (!that._fetching) {\n                    if (filtered) {\n                        that.focus(0);\n                    }\n                    that._createList();\n                    if (!action && that._values.length && !filtered && !that.options.skipUpdateOnBind && !that._emptySearch) {\n                        that._selectingValue = true;\n                        that.bound(true);\n                        that.value(that._values, true).done(function () {\n                            that._selectingValue = false;\n                            that._triggerListBound();\n                        });\n                    } else {\n                        that.bound(true);\n                        that._highlightSelectedItems();\n                        that._triggerListBound();\n                    }\n                } else {\n                    if (that._renderItems) {\n                        that._renderItems(true);\n                    }\n                    that._triggerListBound();\n                }\n                if (isItemChange || action === 'remove') {\n                    result = mapChangedItems(that._selectedDataItems, e.items);\n                    if (result.changed.length) {\n                        if (isItemChange) {\n                            that.trigger('selectedItemChange', { items: result.changed });\n                        } else {\n                            that.value(that._getValues(result.unchanged));\n                        }\n                    }\n                }\n                that._fetching = false;\n            },\n            removeAt: function (position) {\n                this._selectedIndexes.splice(position, 1);\n                this._values.splice(position, 1);\n                return {\n                    position: position,\n                    dataItem: this._selectedDataItems.splice(position, 1)[0]\n                };\n            },\n            setValue: function (value) {\n                this._values = toArray(value);\n            },\n            value: function (value, _forcePrefetch) {\n                var that = this;\n                if (value === undefined) {\n                    return that._values.slice();\n                }\n                if (value === null) {\n                    value = [];\n                }\n                value = toArray(value);\n                if (!that._valueDeferred || that._valueDeferred.state() === 'resolved') {\n                    that._valueDeferred = $.Deferred();\n                }\n                var shouldClear = that.options.selectable === 'multiple' && that.select().length && value.length;\n                if (shouldClear || !value.length) {\n                    that.select(-1);\n                }\n                that._values = value;\n                if (that.bound() && !that._mute && !that._deferValueSet || _forcePrefetch) {\n                    that._prefetchByValue(value);\n                }\n                return that._valueDeferred;\n            },\n            _checkValuesOrder: function (value) {\n                if (this._removedAddedIndexes && this._removedAddedIndexes.length === value.length) {\n                    var newValue = this._removedAddedIndexes.slice();\n                    this._removedAddedIndexes = null;\n                    return newValue;\n                }\n                return value;\n            },\n            _prefetchByValue: function (value) {\n                var that = this, dataView = that._dataView, valueGetter = that._valueGetter, mapValueTo = that.options.mapValueTo, item, match = false, forSelection = [];\n                for (var i = 0; i < value.length; i++) {\n                    for (var idx = 0; idx < dataView.length; idx++) {\n                        item = dataView[idx].item;\n                        if (item) {\n                            match = isPrimitive(item) ? value[i] === item : value[i] === valueGetter(item);\n                            if (match) {\n                                forSelection.push(dataView[idx].index);\n                            }\n                        }\n                    }\n                }\n                if (forSelection.length === value.length) {\n                    that._values = [];\n                    that.select(forSelection);\n                    return;\n                }\n                if (typeof that.options.valueMapper === 'function') {\n                    that.options.valueMapper({\n                        value: this.options.selectable === 'multiple' ? value : value[0],\n                        success: function (response) {\n                            if (mapValueTo === 'index') {\n                                that.mapValueToIndex(response);\n                            } else if (mapValueTo === 'dataItem') {\n                                that.mapValueToDataItem(response);\n                            }\n                        }\n                    });\n                } else {\n                    if (!that.value()[0]) {\n                        that.select([-1]);\n                    } else {\n                        that._selectingValue = false;\n                        that._triggerListBound();\n                    }\n                }\n            },\n            mapValueToIndex: function (indexes) {\n                if (indexes === undefined || indexes === -1 || indexes === null) {\n                    indexes = [];\n                } else {\n                    indexes = toArray(indexes);\n                }\n                if (!indexes.length) {\n                    indexes = [-1];\n                } else {\n                    var removed = this._deselect([]).removed;\n                    if (removed.length) {\n                        this._triggerChange(removed, []);\n                    }\n                }\n                this.select(indexes);\n            },\n            mapValueToDataItem: function (dataItems) {\n                var removed, added;\n                if (dataItems === undefined || dataItems === null) {\n                    dataItems = [];\n                } else {\n                    dataItems = toArray(dataItems);\n                }\n                if (!dataItems.length) {\n                    this.select([-1]);\n                } else {\n                    removed = $.map(this._selectedDataItems, function (item, index) {\n                        return {\n                            index: index,\n                            dataItem: item\n                        };\n                    });\n                    added = $.map(dataItems, function (item, index) {\n                        return {\n                            index: index,\n                            dataItem: item\n                        };\n                    });\n                    this._selectedDataItems = dataItems;\n                    this._selectedIndexes = [];\n                    for (var i = 0; i < this._selectedDataItems.length; i++) {\n                        var item = this._getElementByDataItem(this._selectedDataItems[i]);\n                        this._selectedIndexes.push(this._getIndecies(item)[0]);\n                        item.addClass(SELECTED);\n                    }\n                    this._triggerChange(removed, added);\n                    if (this._valueDeferred) {\n                        this._valueDeferred.resolve();\n                    }\n                }\n            },\n            deferredRange: function (index) {\n                var dataSource = this.dataSource;\n                var take = this.itemCount;\n                var ranges = this._rangesList;\n                var result = $.Deferred();\n                var defs = [];\n                var low = Math.floor(index / take) * take;\n                var high = Math.ceil(index / take) * take;\n                var pages = high === low ? [high] : [\n                    low,\n                    high\n                ];\n                $.each(pages, function (_, skip) {\n                    var end = skip + take;\n                    var existingRange = ranges[skip];\n                    var deferred;\n                    if (!existingRange || existingRange.end !== end) {\n                        deferred = $.Deferred();\n                        ranges[skip] = {\n                            end: end,\n                            deferred: deferred\n                        };\n                        dataSource._multiplePrefetch(skip, take, function () {\n                            deferred.resolve();\n                        });\n                    } else {\n                        deferred = existingRange.deferred;\n                    }\n                    defs.push(deferred);\n                });\n                $.when.apply($, defs).then(function () {\n                    result.resolve();\n                });\n                return result;\n            },\n            prefetch: function (indexes) {\n                var that = this, take = this.itemCount, isEmptyList = !that._promisesList.length;\n                if (!isActivePromise(that._activeDeferred)) {\n                    that._activeDeferred = $.Deferred();\n                    that._promisesList = [];\n                }\n                $.each(indexes, function (_, index) {\n                    that._promisesList.push(that.deferredRange(that._getSkip(index, take)));\n                });\n                if (isEmptyList) {\n                    $.when.apply($, that._promisesList).done(function () {\n                        that._promisesList = [];\n                        that._activeDeferred.resolve();\n                    });\n                }\n                return that._activeDeferred;\n            },\n            _findDataItem: function (view, index) {\n                var group;\n                if (this.options.type === 'group') {\n                    for (var i = 0; i < view.length; i++) {\n                        group = view[i].items;\n                        if (group.length <= index) {\n                            index = index - group.length;\n                        } else {\n                            return group[index];\n                        }\n                    }\n                }\n                return view[index];\n            },\n            _getRange: function (skip, take) {\n                return this.dataSource._findRange(skip, Math.min(skip + take, this.dataSource.total()));\n            },\n            dataItemByIndex: function (index) {\n                var that = this;\n                var take = that.itemCount;\n                var skip = that._getSkip(index, take);\n                var view = this._getRange(skip, take);\n                if (!that._getRange(skip, take).length) {\n                    return null;\n                }\n                if (that.options.type === 'group') {\n                    kendo.ui.progress($(that.wrapper), true);\n                    that.mute(function () {\n                        that.dataSource.range(skip, take, function () {\n                            kendo.ui.progress($(that.wrapper), false);\n                        });\n                        view = that.dataSource.view();\n                    });\n                }\n                return that._findDataItem(view, [index - skip]);\n            },\n            selectedDataItems: function () {\n                return this._selectedDataItems.slice();\n            },\n            scrollWith: function (value) {\n                this.content.scrollTop(this.content.scrollTop() + value);\n            },\n            scrollTo: function (y) {\n                this.content.scrollTop(y);\n            },\n            scrollToIndex: function (index) {\n                this.scrollTo(index * this.options.itemHeight);\n            },\n            focus: function (candidate) {\n                var element, index, data, current, itemHeight = this.options.itemHeight, id = this._optionID, triggerEvent = true;\n                if (candidate === undefined) {\n                    current = this.element.find('.' + FOCUSED);\n                    return current.length ? current : null;\n                }\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            break;\n                        }\n                    }\n                }\n                if (candidate instanceof Array) {\n                    candidate = lastFrom(candidate);\n                }\n                if (isNaN(candidate)) {\n                    element = $(candidate);\n                    index = parseInt($(element).attr('data-offset-index'), 10);\n                } else {\n                    index = candidate;\n                    element = this._getElementByIndex(index);\n                }\n                if (index === -1) {\n                    this.element.find('.' + FOCUSED).removeClass(FOCUSED);\n                    this._focusedIndex = undefined;\n                    return;\n                }\n                if (element.length) {\n                    if (element.hasClass(FOCUSED)) {\n                        triggerEvent = false;\n                    }\n                    if (this._focusedIndex !== undefined) {\n                        current = this._getElementByIndex(this._focusedIndex);\n                        current.removeClass(FOCUSED).removeAttr('id');\n                        if (triggerEvent) {\n                            this.trigger(DEACTIVATE);\n                        }\n                    }\n                    this._focusedIndex = index;\n                    element.addClass(FOCUSED).attr('id', id);\n                    var position = this._getElementLocation(index);\n                    if (position === 'top') {\n                        this.scrollTo(index * itemHeight);\n                    } else if (position === 'bottom') {\n                        this.scrollTo(index * itemHeight + itemHeight - this._screenHeight);\n                    } else if (position === 'outScreen') {\n                        this.scrollTo(index * itemHeight);\n                    }\n                    if (triggerEvent) {\n                        this.trigger(ACTIVATE);\n                    }\n                } else {\n                    this._focusedIndex = index;\n                    this.items().removeClass(FOCUSED);\n                    this.scrollToIndex(index);\n                }\n            },\n            focusIndex: function () {\n                return this._focusedIndex;\n            },\n            focusFirst: function () {\n                this.scrollTo(0);\n                this.focus(0);\n            },\n            focusLast: function () {\n                var lastIndex = this.dataSource.total();\n                this.scrollTo(this.heightContainer.offsetHeight);\n                this.focus(lastIndex - 1);\n            },\n            focusPrev: function () {\n                var index = this._focusedIndex;\n                var current;\n                if (!isNaN(index) && index > 0) {\n                    index -= 1;\n                    this.focus(index);\n                    current = this.focus();\n                    if (current && current.hasClass('k-loading-item')) {\n                        index += 1;\n                        this.focus(index);\n                    }\n                    return index;\n                } else {\n                    index = this.dataSource.total() - 1;\n                    this.focus(index);\n                    return index;\n                }\n            },\n            focusNext: function () {\n                var index = this._focusedIndex;\n                var lastIndex = this.dataSource.total() - 1;\n                var current;\n                if (!isNaN(index) && index < lastIndex) {\n                    index += 1;\n                    this.focus(index);\n                    current = this.focus();\n                    if (current && current.hasClass('k-loading-item')) {\n                        index -= 1;\n                        this.focus(index);\n                    }\n                    return index;\n                } else {\n                    index = 0;\n                    this.focus(index);\n                    return index;\n                }\n            },\n            _triggerChange: function (removed, added) {\n                removed = removed || [];\n                added = added || [];\n                if (removed.length || added.length) {\n                    this.trigger(CHANGE, {\n                        removed: removed,\n                        added: added\n                    });\n                }\n            },\n            select: function (candidate) {\n                var that = this, indices, initialIndices, singleSelection = that.options.selectable !== 'multiple', prefetchStarted = isActivePromise(that._activeDeferred), filtered = this.isFiltered(), isAlreadySelected, deferred, result, removed = [];\n                if (candidate === undefined) {\n                    return that._selectedIndexes.slice();\n                }\n                if (!that._selectDeferred || that._selectDeferred.state() === 'resolved') {\n                    that._selectDeferred = $.Deferred();\n                }\n                indices = that._getIndecies(candidate);\n                isAlreadySelected = singleSelection && !filtered && lastFrom(indices) === lastFrom(this._selectedIndexes);\n                removed = that._deselectCurrentValues(indices);\n                if (removed.length || !indices.length || isAlreadySelected) {\n                    that._triggerChange(removed);\n                    if (that._valueDeferred) {\n                        that._valueDeferred.resolve().promise();\n                    }\n                    return that._selectDeferred.resolve().promise();\n                }\n                if (indices.length === 1 && indices[0] === -1) {\n                    indices = [];\n                }\n                initialIndices = indices;\n                result = that._deselect(indices);\n                removed = result.removed;\n                indices = result.indices;\n                if (singleSelection) {\n                    prefetchStarted = false;\n                    if (indices.length) {\n                        indices = [lastFrom(indices)];\n                    }\n                }\n                var done = function () {\n                    var added = that._select(indices);\n                    if (initialIndices.length === indices.length || singleSelection) {\n                        that.focus(indices);\n                    }\n                    that._triggerChange(removed, added);\n                    if (that._valueDeferred) {\n                        that._valueDeferred.resolve();\n                    }\n                    that._selectDeferred.resolve();\n                };\n                deferred = that.prefetch(indices);\n                if (!prefetchStarted) {\n                    if (deferred) {\n                        deferred.done(done);\n                    } else {\n                        done();\n                    }\n                }\n                return that._selectDeferred.promise();\n            },\n            bound: function (bound) {\n                if (bound === undefined) {\n                    return this._listCreated;\n                }\n                this._listCreated = bound;\n            },\n            mute: function (callback) {\n                this._mute = true;\n                proxy(callback(), this);\n                this._mute = false;\n            },\n            setDSFilter: function (filter) {\n                this._lastDSFilter = $.extend({}, filter);\n            },\n            isFiltered: function () {\n                if (!this._lastDSFilter) {\n                    this.setDSFilter(this.dataSource.filter());\n                }\n                return !kendo.data.Query.compareFilters(this.dataSource.filter(), this._lastDSFilter);\n            },\n            skipUpdate: $.noop,\n            _getElementByIndex: function (index) {\n                return this.items().filter(function (idx, element) {\n                    return index === parseInt($(element).attr('data-offset-index'), 10);\n                });\n            },\n            _getElementByDataItem: function (dataItem) {\n                var dataView = this._dataView, valueGetter = this._valueGetter, element, match;\n                for (var i = 0; i < dataView.length; i++) {\n                    match = dataView[i].item && isPrimitive(dataView[i].item) ? dataView[i].item === dataItem : dataView[i].item && dataItem && valueGetter(dataView[i].item) == valueGetter(dataItem);\n                    if (match) {\n                        element = dataView[i];\n                        break;\n                    }\n                }\n                return element ? this._getElementByIndex(element.index) : $();\n            },\n            _clean: function () {\n                this.result = undefined;\n                this._lastScrollTop = undefined;\n                this._skip = undefined;\n                $(this.heightContainer).remove();\n                this.heightContainer = undefined;\n                this.element.empty();\n            },\n            _height: function () {\n                var hasData = !!this.dataSource.view().length, height = this.options.height, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n                if (!hasData) {\n                    height = 0;\n                } else if (height / itemHeight > total) {\n                    height = total * itemHeight;\n                }\n                return height;\n            },\n            setScreenHeight: function () {\n                var height = this._height();\n                this.content.height(height);\n                this._screenHeight = height;\n            },\n            screenHeight: function () {\n                return this._screenHeight;\n            },\n            _getElementLocation: function (index) {\n                var scrollTop = this.content.scrollTop(), screenHeight = this._screenHeight, itemHeight = this.options.itemHeight, yPosition = index * itemHeight, yDownPostion = yPosition + itemHeight, screenEnd = scrollTop + screenHeight, position;\n                if (yPosition === scrollTop - itemHeight || yDownPostion > scrollTop && yPosition < scrollTop) {\n                    position = 'top';\n                } else if (yPosition === screenEnd || yPosition < screenEnd && screenEnd < yDownPostion) {\n                    position = 'bottom';\n                } else if (yPosition >= scrollTop && yPosition <= scrollTop + (screenHeight - itemHeight)) {\n                    position = 'inScreen';\n                } else {\n                    position = 'outScreen';\n                }\n                return position;\n            },\n            _templates: function () {\n                var options = this.options;\n                var templates = {\n                    template: options.template,\n                    placeholderTemplate: options.placeholderTemplate,\n                    groupTemplate: options.groupTemplate,\n                    fixedGroupTemplate: options.fixedGroupTemplate\n                };\n                if (options.columns) {\n                    for (var i = 0; i < options.columns.length; i++) {\n                        var currentColumn = options.columns[i];\n                        var templateText = currentColumn.field ? currentColumn.field.toString() : 'text';\n                        templates['column' + i] = currentColumn.template || '#: ' + templateText + '#';\n                    }\n                }\n                for (var key in templates) {\n                    if (typeof templates[key] !== 'function') {\n                        templates[key] = kendo.template(templates[key] || '');\n                    }\n                }\n                this.templates = templates;\n            },\n            _generateItems: function (element, count) {\n                var items = [], item, itemHeight = this.options.itemHeight + 'px';\n                while (count-- > 0) {\n                    item = document.createElement('li');\n                    item.tabIndex = -1;\n                    item.className = VIRTUALITEM + ' ' + ITEM;\n                    item.setAttribute('role', 'option');\n                    item.style.height = itemHeight;\n                    item.style.minHeight = itemHeight;\n                    element.appendChild(item);\n                    items.push(item);\n                }\n                return items;\n            },\n            _saveInitialRanges: function () {\n                var ranges = this.dataSource._ranges;\n                var deferred = $.Deferred();\n                deferred.resolve();\n                this._rangesList = {};\n                for (var i = 0; i < ranges.length; i++) {\n                    this._rangesList[ranges[i].start] = {\n                        end: ranges[i].end,\n                        deferred: deferred\n                    };\n                }\n            },\n            _createList: function () {\n                var that = this, content = that.content.get(0), options = that.options, dataSource = that.dataSource;\n                if (that.bound()) {\n                    that._clean();\n                }\n                that._saveInitialRanges();\n                that._buildValueGetter();\n                that.setScreenHeight();\n                that.itemCount = getItemCount(that._screenHeight, options.listScreens, options.itemHeight);\n                if (that.itemCount > dataSource.total()) {\n                    that.itemCount = dataSource.total();\n                }\n                that._items = that._generateItems(that.element[0], that.itemCount);\n                that._setHeight(options.itemHeight * dataSource.total());\n                that.options.type = (dataSource.group() || []).length ? 'group' : 'flat';\n                if (that.options.type === 'flat') {\n                    that.header.hide();\n                } else {\n                    that.header.show();\n                }\n                that.getter = that._getter(function () {\n                    that._renderItems(true);\n                });\n                that._onScroll = function (scrollTop, force) {\n                    var getList = that._listItems(that.getter);\n                    return that._fixedHeader(scrollTop, getList(scrollTop, force));\n                };\n                that._renderItems = that._whenChanged(scrollCallback(content, that._onScroll), syncList(that._reorderList(that._items, $.proxy(render, that))));\n                that._renderItems();\n                that._calculateGroupPadding(that._screenHeight);\n                that._calculateColumnsHeaderPadding();\n            },\n            _setHeight: function (height) {\n                var currentHeight, heightContainer = this.heightContainer;\n                if (!heightContainer) {\n                    heightContainer = this.heightContainer = appendChild(this.content[0], HEIGHTCONTAINER);\n                } else {\n                    currentHeight = heightContainer.offsetHeight;\n                }\n                if (height !== currentHeight) {\n                    heightContainer.innerHTML = '';\n                    while (height > 0) {\n                        var padHeight = Math.min(height, 250000);\n                        appendChild(heightContainer).style.height = padHeight + 'px';\n                        height -= padHeight;\n                    }\n                }\n            },\n            _getter: function () {\n                var lastRequestedRange = null, dataSource = this.dataSource, lastRangeStart = dataSource.skip(), type = this.options.type, pageSize = this.itemCount, flatGroups = {};\n                if (dataSource.pageSize() < pageSize) {\n                    this.mute(function () {\n                        dataSource.pageSize(pageSize);\n                    });\n                }\n                return function (index, rangeStart) {\n                    var that = this;\n                    if (!dataSource.inRange(rangeStart, pageSize)) {\n                        if (lastRequestedRange !== rangeStart) {\n                            lastRequestedRange = rangeStart;\n                            lastRangeStart = rangeStart;\n                            if (that._getterDeferred) {\n                                that._getterDeferred.reject();\n                            }\n                            that._getterDeferred = that.deferredRange(rangeStart);\n                            that._getterDeferred.then(function () {\n                                var firstItemIndex = that._indexConstraint(that.content[0].scrollTop);\n                                that._getterDeferred = null;\n                                if (rangeStart <= firstItemIndex && firstItemIndex <= rangeStart + pageSize) {\n                                    that._fetching = true;\n                                    dataSource.range(rangeStart, pageSize);\n                                }\n                            });\n                        }\n                        return null;\n                    } else {\n                        if (lastRangeStart !== rangeStart) {\n                            this.mute(function () {\n                                dataSource.range(rangeStart, pageSize);\n                                lastRangeStart = rangeStart;\n                            });\n                        }\n                        var result;\n                        if (type === 'group') {\n                            if (!flatGroups[rangeStart]) {\n                                var flatGroup = flatGroups[rangeStart] = [];\n                                var groups = dataSource.view();\n                                for (var i = 0, len = groups.length; i < len; i++) {\n                                    var group = groups[i];\n                                    for (var j = 0, groupLength = group.items.length; j < groupLength; j++) {\n                                        flatGroup.push({\n                                            item: group.items[j],\n                                            group: group.value\n                                        });\n                                    }\n                                }\n                            }\n                            result = flatGroups[rangeStart][index - rangeStart];\n                        } else {\n                            result = dataSource.view()[index - rangeStart];\n                        }\n                        return result;\n                    }\n                };\n            },\n            _fixedHeader: function (scrollTop, list) {\n                var group = this.currentVisibleGroup, itemHeight = this.options.itemHeight, firstVisibleDataItemIndex = Math.floor((scrollTop - list.top) / itemHeight), firstVisibleDataItem = list.items[firstVisibleDataItemIndex];\n                if (firstVisibleDataItem && firstVisibleDataItem.item) {\n                    var firstVisibleGroup = firstVisibleDataItem.group;\n                    if (firstVisibleGroup !== group) {\n                        var fixedGroupText = firstVisibleGroup || '';\n                        this.header.html(this.templates.fixedGroupTemplate(fixedGroupText));\n                        this.currentVisibleGroup = firstVisibleGroup;\n                    }\n                }\n                return list;\n            },\n            _itemMapper: function (item, index, value) {\n                var listType = this.options.type, itemHeight = this.options.itemHeight, currentIndex = this._focusedIndex, selected = false, current = false, newGroup = false, group = null, match = false, valueGetter = this._valueGetter;\n                if (listType === 'group') {\n                    if (item) {\n                        newGroup = index === 0 || this._currentGroup !== false && this._currentGroup !== item.group;\n                        this._currentGroup = item.group;\n                    }\n                    group = item ? item.group : null;\n                    item = item ? item.item : null;\n                }\n                if (this.options.mapValueTo === 'dataItem' && this._selectedDataItems.length && item) {\n                    for (var i = 0; i < this._selectedDataItems.length; i++) {\n                        match = valueGetter(this._selectedDataItems[i]) === valueGetter(item);\n                        if (match) {\n                            selected = true;\n                            break;\n                        }\n                    }\n                } else if (!this.isFiltered() && value.length && item) {\n                    for (var j = 0; j < value.length; j++) {\n                        match = isPrimitive(item) ? value[j] === item : value[j] === valueGetter(item);\n                        if (match) {\n                            value.splice(j, 1);\n                            selected = true;\n                            break;\n                        }\n                    }\n                }\n                if (currentIndex === index) {\n                    current = true;\n                }\n                return {\n                    item: item ? item : null,\n                    group: group,\n                    newGroup: newGroup,\n                    selected: selected,\n                    current: current,\n                    index: index,\n                    top: index * itemHeight\n                };\n            },\n            _range: function (index) {\n                var itemCount = this.itemCount, value = this._values.slice(), items = [], item;\n                this._view = {};\n                this._currentGroup = false;\n                for (var i = index, length = index + itemCount; i < length; i++) {\n                    item = this._itemMapper(this.getter(i, index), i, value);\n                    if (items[items.length - 1]) {\n                        items[items.length - 1].isLastGroupedItem = item.newGroup;\n                    }\n                    items.push(item);\n                    this._view[item.index] = item;\n                }\n                this._dataView = items;\n                return items;\n            },\n            _getDataItemsCollection: function (scrollTop, lastScrollTop) {\n                var items = this._range(this._listIndex(scrollTop, lastScrollTop));\n                return {\n                    index: items.length ? items[0].index : 0,\n                    top: items.length ? items[0].top : 0,\n                    items: items\n                };\n            },\n            _listItems: function () {\n                var screenHeight = this._screenHeight, options = this.options;\n                var theValidator = listValidator(options, screenHeight);\n                return $.proxy(function (value, force) {\n                    var result = this.result, lastScrollTop = this._lastScrollTop;\n                    if (force || !result || !theValidator(result, value, lastScrollTop)) {\n                        result = this._getDataItemsCollection(value, lastScrollTop);\n                    }\n                    this._lastScrollTop = value;\n                    this.result = result;\n                    return result;\n                }, this);\n            },\n            _whenChanged: function (getter, callback) {\n                var current;\n                return function (force) {\n                    var theNew = getter(force);\n                    if (theNew !== current) {\n                        current = theNew;\n                        callback(theNew, force);\n                    }\n                };\n            },\n            _reorderList: function (list, reorder) {\n                var that = this;\n                var length = list.length;\n                var currentOffset = -Infinity;\n                reorder = $.proxy(map2(reorder, this.templates), this);\n                return function (list2, offset, force) {\n                    var diff = offset - currentOffset;\n                    var range, range2;\n                    if (force || Math.abs(diff) >= length) {\n                        range = list;\n                        range2 = list2;\n                    } else {\n                        range = reshift(list, diff);\n                        range2 = diff > 0 ? list2.slice(-diff) : list2.slice(0, -diff);\n                    }\n                    reorder(range, range2, that.bound());\n                    currentOffset = offset;\n                };\n            },\n            _bufferSizes: function () {\n                var options = this.options;\n                return bufferSizes(this._screenHeight, options.listScreens, options.oppositeBuffer);\n            },\n            _indexConstraint: function (position) {\n                var itemCount = this.itemCount, itemHeight = this.options.itemHeight, total = this.dataSource.total();\n                return Math.min(Math.max(total - itemCount, 0), Math.max(0, Math.floor(position / itemHeight)));\n            },\n            _listIndex: function (scrollTop, lastScrollTop) {\n                var buffers = this._bufferSizes(), position;\n                position = scrollTop - (scrollTop > lastScrollTop ? buffers.down : buffers.up);\n                return this._indexConstraint(position);\n            },\n            _selectable: function () {\n                if (this.options.selectable) {\n                    this._selectProxy = $.proxy(this, '_clickHandler');\n                    this.element.on(CLICK + VIRTUAL_LIST_NS, '.' + VIRTUALITEM, this._selectProxy);\n                }\n            },\n            getElementIndex: function (element) {\n                if (!(element instanceof jQuery)) {\n                    return undefined;\n                }\n                return parseInt(element.attr('data-offset-index'), 10);\n            },\n            _getIndecies: function (candidate) {\n                var result = [], data;\n                if (typeof candidate === 'function') {\n                    data = this.dataSource.flatView();\n                    for (var idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            result.push(idx);\n                            break;\n                        }\n                    }\n                }\n                if (typeof candidate === 'number') {\n                    result.push(candidate);\n                }\n                var elementIndex = this.getElementIndex(candidate);\n                if (!isNaN(elementIndex)) {\n                    result.push(elementIndex);\n                }\n                if (candidate instanceof Array) {\n                    result = candidate;\n                }\n                return result;\n            },\n            _deselect: function (indices) {\n                var removed = [], selectedIndex, dataItem, selectedIndexes = this._selectedIndexes, selectedDataItems = this._selectedDataItems, position = 0, selectable = this.options.selectable, removedindexesCounter = 0, valueGetter = this._valueGetter, item, match, result = null;\n                indices = indices.slice();\n                if (selectable === true || !indices.length) {\n                    for (var idx = 0; idx < selectedIndexes.length; idx++) {\n                        if (selectedIndexes[idx] !== undefined) {\n                            this._getElementByIndex(selectedIndexes[idx]).removeClass(SELECTED);\n                        } else if (selectedDataItems[idx]) {\n                            this._getElementByDataItem(selectedDataItems[idx]).removeClass(SELECTED);\n                        }\n                        removed.push({\n                            index: selectedIndexes[idx],\n                            position: idx,\n                            dataItem: selectedDataItems[idx]\n                        });\n                    }\n                    this._values = [];\n                    this._selectedDataItems = [];\n                    this._selectedIndexes = [];\n                } else if (selectable === 'multiple') {\n                    for (var i = 0; i < indices.length; i++) {\n                        result = null;\n                        position = $.inArray(indices[i], selectedIndexes);\n                        dataItem = this.dataItemByIndex(indices[i]);\n                        if (position === -1 && dataItem) {\n                            for (var j = 0; j < selectedDataItems.length; j++) {\n                                match = isPrimitive(dataItem) ? selectedDataItems[j] === dataItem : valueGetter(selectedDataItems[j]) === valueGetter(dataItem);\n                                if (match) {\n                                    item = this._getElementByIndex(indices[i]);\n                                    result = this._deselectSingleItem(item, j, indices[i], removedindexesCounter);\n                                }\n                            }\n                        } else {\n                            selectedIndex = selectedIndexes[position];\n                            if (selectedIndex !== undefined) {\n                                item = this._getElementByIndex(selectedIndex);\n                                result = this._deselectSingleItem(item, position, selectedIndex, removedindexesCounter);\n                            }\n                        }\n                        if (result) {\n                            indices.splice(i, 1);\n                            removed.push(result);\n                            removedindexesCounter++;\n                            i--;\n                        }\n                    }\n                }\n                return {\n                    indices: indices,\n                    removed: removed\n                };\n            },\n            _deselectSingleItem: function (item, position, selectedIndex, removedindexesCounter) {\n                var dataItem;\n                if (!item.hasClass('k-state-selected')) {\n                    return;\n                }\n                item.removeClass(SELECTED);\n                this._values.splice(position, 1);\n                this._selectedIndexes.splice(position, 1);\n                dataItem = this._selectedDataItems.splice(position, 1)[0];\n                return {\n                    index: selectedIndex,\n                    position: position + removedindexesCounter,\n                    dataItem: dataItem\n                };\n            },\n            _deselectCurrentValues: function (indices) {\n                var children = this.element[0].children;\n                var value, index, position;\n                var values = this._values;\n                var removed = [];\n                var idx = 0;\n                var j;\n                if (this.options.selectable !== 'multiple' || !this.isFiltered()) {\n                    return [];\n                }\n                if (indices[0] === -1) {\n                    $(children).removeClass('k-state-selected');\n                    removed = $.map(this._selectedDataItems.slice(0), function (dataItem, idx) {\n                        return {\n                            dataItem: dataItem,\n                            position: idx\n                        };\n                    });\n                    this._selectedIndexes = [];\n                    this._selectedDataItems = [];\n                    this._values = [];\n                    return removed;\n                }\n                for (; idx < indices.length; idx++) {\n                    position = -1;\n                    index = indices[idx];\n                    if (this.dataItemByIndex(index)) {\n                        value = this._valueGetter(this.dataItemByIndex(index));\n                    }\n                    for (j = 0; j < values.length; j++) {\n                        if (value == values[j]) {\n                            position = j;\n                            break;\n                        }\n                    }\n                    if (position > -1) {\n                        removed.push(this.removeAt(position));\n                        $(children[index]).removeClass('k-state-selected');\n                    }\n                }\n                return removed;\n            },\n            _getSkip: function (index, take) {\n                var page = index < take ? 1 : Math.floor(index / take) + 1;\n                return (page - 1) * take;\n            },\n            _select: function (indexes) {\n                var that = this, singleSelection = this.options.selectable !== 'multiple', dataSource = this.dataSource, dataItem, oldSkip, take = this.itemCount, valueGetter = this._valueGetter, added = [];\n                if (singleSelection) {\n                    that._selectedIndexes = [];\n                    that._selectedDataItems = [];\n                    that._values = [];\n                }\n                oldSkip = dataSource.skip();\n                $.each(indexes, function (_, index) {\n                    var skip = that._getSkip(index, take);\n                    that.mute(function () {\n                        dataSource.range(skip, take);\n                        dataItem = that._findDataItem(dataSource.view(), [index - skip]);\n                        that._selectedIndexes.push(index);\n                        that._selectedDataItems.push(dataItem);\n                        that._values.push(isPrimitive(dataItem) ? dataItem : valueGetter(dataItem));\n                        added.push({\n                            index: index,\n                            dataItem: dataItem\n                        });\n                        that._getElementByIndex(index).addClass(SELECTED);\n                        dataSource.range(oldSkip, take);\n                    });\n                });\n                that._values = that._checkValuesOrder(that._values);\n                return added;\n            },\n            _clickHandler: function (e) {\n                var item = $(e.currentTarget);\n                if (!e.isDefaultPrevented() && item.attr('data-uid')) {\n                    this.trigger(CLICK, { item: item });\n                }\n            },\n            _buildValueGetter: function () {\n                this._valueGetter = kendo.getter(this.options.dataValueField);\n            },\n            _calculateGroupPadding: function (height) {\n                var firstItem = this.items().first(), groupHeader = this.header, padding = 0;\n                if (groupHeader[0] && groupHeader[0].style.display !== 'none') {\n                    if (height !== 'auto') {\n                        padding = kendo.support.scrollbar();\n                    }\n                    padding += parseFloat(firstItem.css('border-right-width'), 10) + parseFloat(firstItem.children('.k-group').css('right'), 10);\n                    groupHeader.css('padding-right', padding);\n                }\n            },\n            _calculateColumnsHeaderPadding: function () {\n                if (this.options.columns && this.options.columns.length) {\n                    var isRtl = kendo.support.isRtl(this.wrapper);\n                    var scrollbar = kendo.support.scrollbar();\n                    var columnsHeader = this.content.parent().parent().find('.k-grid-header');\n                    var total = this.dataSource.total();\n                    columnsHeader.css(isRtl ? 'padding-left' : 'padding-right', total ? scrollbar : 0);\n                }\n            }\n        });\n        kendo.ui.VirtualList = VirtualList;\n        kendo.ui.plugin(VirtualList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dropdownlist', [\n        'kendo.list',\n        'kendo.mobile.scroller',\n        'kendo.virtuallist'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dropdownlist',\n        name: 'DropDownList',\n        category: 'web',\n        description: 'The DropDownList widget displays a list of values and allows the selection of a single value from the list.',\n        depends: ['list'],\n        features: [\n            {\n                id: 'mobile-scroller',\n                name: 'Mobile scroller',\n                description: 'Support for kinetic scrolling in mobile device',\n                depends: ['mobile.scroller']\n            },\n            {\n                id: 'virtualization',\n                name: 'VirtualList',\n                description: 'Support for virtualization',\n                depends: ['virtuallist']\n            }\n        ]\n    };\n    (function ($, undefined) {\n        var kendo = window.kendo, ui = kendo.ui, List = ui.List, Select = ui.Select, support = kendo.support, activeElement = kendo._activeElement, ObservableObject = kendo.data.ObservableObject, keys = kendo.keys, ns = '.kendoDropDownList', nsFocusEvent = ns + 'FocusEvent', DISABLED = 'disabled', READONLY = 'readonly', CHANGE = 'change', FOCUSED = 'k-state-focused', DEFAULT = 'k-state-default', STATEDISABLED = 'k-state-disabled', ARIA_DISABLED = 'aria-disabled', CLICKEVENTS = 'click' + ns + ' touchend' + ns, HOVEREVENTS = 'mouseenter' + ns + ' mouseleave' + ns, TABINDEX = 'tabindex', STATE_FILTER = 'filter', STATE_ACCEPT = 'accept', MSG_INVALID_OPTION_LABEL = 'The `optionLabel` option is not valid due to missing fields. Define a custom optionLabel as shown here http://docs.telerik.com/kendo-ui/api/javascript/ui/dropdownlist#configuration-optionLabel', proxy = $.proxy;\n        var DropDownList = Select.extend({\n            init: function (element, options) {\n                var that = this;\n                var index = options && options.index;\n                var optionLabel, text, disabled;\n                that.ns = ns;\n                options = $.isArray(options) ? { dataSource: options } : options;\n                Select.fn.init.call(that, element, options);\n                options = that.options;\n                element = that.element.on('focus' + ns, proxy(that._focusHandler, that));\n                that._focusInputHandler = $.proxy(that._focusInput, that);\n                that.optionLabel = $();\n                that._optionLabel();\n                that._inputTemplate();\n                that._reset();\n                that._prev = '';\n                that._word = '';\n                that._wrapper();\n                that._tabindex();\n                that.wrapper.data(TABINDEX, that.wrapper.attr(TABINDEX));\n                that._span();\n                that._popup();\n                that._mobile();\n                that._dataSource();\n                that._ignoreCase();\n                that._filterHeader();\n                that._aria();\n                that.wrapper.attr('aria-live', 'polite');\n                that._enable();\n                that._attachFocusHandlers();\n                that._oldIndex = that.selectedIndex = -1;\n                if (index !== undefined) {\n                    options.index = index;\n                }\n                that._initialIndex = options.index;\n                that.requireValueMapper(that.options);\n                that._initList();\n                that._cascade();\n                that.one('set', function (e) {\n                    if (!e.sender.listView.bound() && that.hasOptionLabel()) {\n                        that._textAccessor(that._optionLabelText());\n                    }\n                });\n                if (options.autoBind) {\n                    that.dataSource.fetch();\n                } else if (that.selectedIndex === -1) {\n                    text = options.text || '';\n                    if (!text) {\n                        optionLabel = options.optionLabel;\n                        if (optionLabel && options.index === 0) {\n                            text = optionLabel;\n                        } else if (that._isSelect) {\n                            text = element.children(':selected').text();\n                        }\n                    }\n                    that._textAccessor(text);\n                }\n                disabled = $(that.element).parents('fieldset').is(':disabled');\n                if (disabled) {\n                    that.enable(false);\n                }\n                that.listView.bind('click', function (e) {\n                    e.preventDefault();\n                });\n                kendo.notify(that);\n            },\n            options: {\n                name: 'DropDownList',\n                enabled: true,\n                autoBind: true,\n                index: 0,\n                text: null,\n                value: null,\n                delay: 500,\n                height: 200,\n                dataTextField: '',\n                dataValueField: '',\n                optionLabel: '',\n                cascadeFrom: '',\n                cascadeFromField: '',\n                cascadeFromParentField: '',\n                ignoreCase: true,\n                animation: {},\n                filter: 'none',\n                minLength: 1,\n                enforceMinLength: false,\n                virtual: false,\n                template: null,\n                valueTemplate: null,\n                optionLabelTemplate: null,\n                groupTemplate: '#:data#',\n                fixedGroupTemplate: '#:data#',\n                autoWidth: false,\n                popup: null\n            },\n            events: [\n                'open',\n                'close',\n                CHANGE,\n                'select',\n                'filtering',\n                'dataBinding',\n                'dataBound',\n                'cascade',\n                'set'\n            ],\n            setOptions: function (options) {\n                Select.fn.setOptions.call(this, options);\n                this.listView.setOptions(this._listOptions(options));\n                this._optionLabel();\n                this._inputTemplate();\n                this._accessors();\n                this._filterHeader();\n                this._enable();\n                this._aria();\n                if (!this.value() && this.hasOptionLabel()) {\n                    this.select(0);\n                }\n            },\n            destroy: function () {\n                var that = this;\n                Select.fn.destroy.call(that);\n                that.wrapper.off(ns);\n                that.wrapper.off(nsFocusEvent);\n                that.element.off(ns);\n                that._inputWrapper.off(ns);\n                that._arrow.off();\n                that._arrow = null;\n                that._arrowIcon = null;\n                that.optionLabel.off();\n                if (that.filterInput) {\n                    that.filterInput.off(nsFocusEvent);\n                }\n            },\n            open: function () {\n                var that = this;\n                var isFiltered = that.dataSource.filter() ? that.dataSource.filter().filters.length > 0 : false;\n                if (that.popup.visible()) {\n                    return;\n                }\n                if (!that.listView.bound() || that._state === STATE_ACCEPT) {\n                    that._open = true;\n                    that._state = 'rebind';\n                    if (that.filterInput) {\n                        that.filterInput.val('');\n                        that._prev = '';\n                    }\n                    if (that.filterInput && that.options.minLength !== 1 && !isFiltered) {\n                        that.refresh();\n                        that.popup.one('activate', that._focusInputHandler);\n                        that.popup.open();\n                        that._resizeFilterInput();\n                    } else {\n                        that._filterSource();\n                    }\n                } else if (that._allowOpening()) {\n                    that._focusFilter = true;\n                    that.popup.one('activate', that._focusInputHandler);\n                    that.popup._hovered = true;\n                    that.popup.open();\n                    that._resizeFilterInput();\n                    that._focusItem();\n                }\n            },\n            _focusInput: function () {\n                this._focusElement(this.filterInput);\n            },\n            _resizeFilterInput: function () {\n                var filterInput = this.filterInput;\n                var originalPrevent = this._prevent;\n                if (!filterInput) {\n                    return;\n                }\n                var isInputActive = this.filterInput[0] === activeElement();\n                var caret = kendo.caret(this.filterInput[0])[0];\n                this._prevent = true;\n                filterInput.css('display', 'none').css('width', this.popup.element.css('width')).css('display', 'inline-block');\n                if (isInputActive) {\n                    filterInput.focus();\n                    kendo.caret(filterInput[0], caret);\n                }\n                this._prevent = originalPrevent;\n            },\n            _allowOpening: function () {\n                return this.hasOptionLabel() || this.filterInput || Select.fn._allowOpening.call(this);\n            },\n            toggle: function (toggle) {\n                this._toggle(toggle, true);\n            },\n            current: function (candidate) {\n                var current;\n                if (candidate === undefined) {\n                    current = this.listView.focus();\n                    if (!current && this.selectedIndex === 0 && this.hasOptionLabel()) {\n                        return this.optionLabel;\n                    }\n                    return current;\n                }\n                this._focus(candidate);\n            },\n            dataItem: function (index) {\n                var that = this;\n                var dataItem = null;\n                if (index === null) {\n                    return index;\n                }\n                if (index === undefined) {\n                    dataItem = that.listView.selectedDataItems()[0];\n                } else {\n                    if (typeof index !== 'number') {\n                        if (that.options.virtual) {\n                            return that.dataSource.getByUid($(index).data('uid'));\n                        }\n                        if (index.hasClass('k-list-optionlabel')) {\n                            index = -1;\n                        } else {\n                            index = $(that.items()).index(index);\n                        }\n                    } else if (that.hasOptionLabel()) {\n                        index -= 1;\n                    }\n                    dataItem = that.dataSource.flatView()[index];\n                }\n                if (!dataItem) {\n                    dataItem = that._optionLabelDataItem();\n                }\n                return dataItem;\n            },\n            refresh: function () {\n                this.listView.refresh();\n            },\n            text: function (text) {\n                var that = this;\n                var loweredText;\n                var ignoreCase = that.options.ignoreCase;\n                text = text === null ? '' : text;\n                if (text !== undefined) {\n                    if (typeof text !== 'string') {\n                        that._textAccessor(text);\n                        return;\n                    }\n                    loweredText = ignoreCase ? text.toLowerCase() : text;\n                    that._select(function (data) {\n                        data = that._text(data);\n                        if (ignoreCase) {\n                            data = (data + '').toLowerCase();\n                        }\n                        return data === loweredText;\n                    }).done(function () {\n                        that._textAccessor(that.dataItem() || text);\n                    });\n                } else {\n                    return that._textAccessor();\n                }\n            },\n            _clearFilter: function () {\n                $(this.filterInput).val('');\n                Select.fn._clearFilter.call(this);\n            },\n            value: function (value) {\n                var that = this;\n                var listView = that.listView;\n                var dataSource = that.dataSource;\n                if (value === undefined) {\n                    value = that._accessor() || that.listView.value()[0];\n                    return value === undefined || value === null ? '' : value;\n                }\n                that.requireValueMapper(that.options, value);\n                if (value || !that.hasOptionLabel()) {\n                    that._initialIndex = null;\n                }\n                this.trigger('set', { value: value });\n                if (that._request && that.options.cascadeFrom && that.listView.bound()) {\n                    if (that._valueSetter) {\n                        dataSource.unbind(CHANGE, that._valueSetter);\n                    }\n                    that._valueSetter = proxy(function () {\n                        that.value(value);\n                    }, that);\n                    dataSource.one(CHANGE, that._valueSetter);\n                    return;\n                }\n                if (that._isFilterEnabled() && listView.bound() && listView.isFiltered()) {\n                    that._clearFilter();\n                } else {\n                    that._fetchData();\n                }\n                listView.value(value).done(function () {\n                    that._old = that._valueBeforeCascade = that._accessor();\n                    that._oldIndex = that.selectedIndex;\n                });\n            },\n            hasOptionLabel: function () {\n                return this.optionLabel && !!this.optionLabel[0];\n            },\n            _optionLabel: function () {\n                var that = this;\n                var options = that.options;\n                var optionLabel = options.optionLabel;\n                var template = options.optionLabelTemplate;\n                if (!optionLabel) {\n                    that.optionLabel.off().remove();\n                    that.optionLabel = $();\n                    return;\n                }\n                if (!template) {\n                    template = '#:';\n                    if (typeof optionLabel === 'string') {\n                        template += 'data';\n                    } else {\n                        template += kendo.expr(options.dataTextField, 'data');\n                    }\n                    template += '#';\n                }\n                if (typeof template !== 'function') {\n                    template = kendo.template(template);\n                }\n                that.optionLabelTemplate = template;\n                if (!that.hasOptionLabel()) {\n                    that.optionLabel = $('<div class=\"k-list-optionlabel\"></div>').prependTo(that.list);\n                }\n                that.optionLabel.html(template(optionLabel)).off().on(CLICKEVENTS, proxy(that._click, that)).on(HOVEREVENTS, that._toggleHover);\n                that.angular('compile', function () {\n                    return {\n                        elements: that.optionLabel,\n                        data: [{ dataItem: that._optionLabelDataItem() }]\n                    };\n                });\n            },\n            _optionLabelText: function () {\n                var optionLabel = this.options.optionLabel;\n                return typeof optionLabel === 'string' ? optionLabel : this._text(optionLabel);\n            },\n            _optionLabelDataItem: function () {\n                var that = this;\n                var optionLabel = that.options.optionLabel;\n                if (that.hasOptionLabel()) {\n                    return $.isPlainObject(optionLabel) ? new ObservableObject(optionLabel) : that._assignInstance(that._optionLabelText(), '');\n                }\n                return undefined;\n            },\n            _buildOptions: function (data) {\n                var that = this;\n                if (!that._isSelect) {\n                    return;\n                }\n                var value = that.listView.value()[0];\n                var optionLabel = that._optionLabelDataItem();\n                var optionLabelValue = optionLabel && that._value(optionLabel);\n                if (value === undefined || value === null) {\n                    value = '';\n                }\n                if (optionLabel) {\n                    if (optionLabelValue === undefined || optionLabelValue === null) {\n                        optionLabelValue = '';\n                    }\n                    optionLabel = '<option value=\"' + optionLabelValue + '\">' + that._text(optionLabel) + '</option>';\n                }\n                that._options(data, optionLabel, value);\n                if (value !== List.unifyType(that._accessor(), typeof value)) {\n                    that._customOption = null;\n                    that._custom(value);\n                }\n            },\n            _listBound: function () {\n                var that = this;\n                var initialIndex = that._initialIndex;\n                var filtered = that._state === STATE_FILTER;\n                var data = that.dataSource.flatView();\n                var dataItem;\n                that._presetValue = false;\n                that._renderFooter();\n                that._renderNoData();\n                that._toggleNoData(!data.length);\n                that._resizePopup(true);\n                that.popup.position();\n                that._buildOptions(data);\n                that._makeUnselectable();\n                if (!filtered) {\n                    if (that._open) {\n                        that.toggle(that._allowOpening());\n                    }\n                    that._open = false;\n                    if (!that._fetch) {\n                        if (data.length) {\n                            if (!that.listView.value().length && initialIndex > -1 && initialIndex !== null) {\n                                that.select(initialIndex);\n                            }\n                            that._initialIndex = null;\n                            dataItem = that.listView.selectedDataItems()[0];\n                            if (dataItem && that.text() !== that._text(dataItem)) {\n                                that._selectValue(dataItem);\n                            }\n                        } else if (that._textAccessor() !== that._optionLabelText()) {\n                            that.listView.value('');\n                            that._selectValue(null);\n                            that._oldIndex = that.selectedIndex;\n                        }\n                    }\n                }\n                that._hideBusy();\n                that.trigger('dataBound');\n            },\n            _listChange: function () {\n                this._selectValue(this.listView.selectedDataItems()[0]);\n                if (this._presetValue || this._old && this._oldIndex === -1) {\n                    this._oldIndex = this.selectedIndex;\n                }\n            },\n            _filterPaste: function () {\n                this._search();\n            },\n            _attachFocusHandlers: function () {\n                var that = this;\n                var wrapper = that.wrapper;\n                wrapper.on('focusin' + nsFocusEvent, proxy(that._focusinHandler, that)).on('focusout' + nsFocusEvent, proxy(that._focusoutHandler, that));\n                if (that.filterInput) {\n                    that.filterInput.on('focusin' + nsFocusEvent, proxy(that._focusinHandler, that)).on('focusout' + nsFocusEvent, proxy(that._focusoutHandler, that));\n                }\n            },\n            _focusHandler: function () {\n                this.wrapper.focus();\n            },\n            _focusinHandler: function () {\n                this._inputWrapper.addClass(FOCUSED);\n                this._prevent = false;\n            },\n            _focusoutHandler: function () {\n                var that = this;\n                var isIFrame = window.self !== window.top;\n                if (!that._prevent) {\n                    clearTimeout(that._typingTimeout);\n                    if (support.mobileOS.ios && isIFrame) {\n                        that._change();\n                    } else {\n                        that._blur();\n                    }\n                    that._inputWrapper.removeClass(FOCUSED);\n                    that._prevent = true;\n                    that._open = false;\n                    that.element.blur();\n                }\n            },\n            _wrapperMousedown: function () {\n                this._prevent = !!this.filterInput;\n            },\n            _wrapperClick: function (e) {\n                e.preventDefault();\n                this.popup.unbind('activate', this._focusInputHandler);\n                this._focused = this.wrapper;\n                this._prevent = false;\n                this._toggle();\n            },\n            _editable: function (options) {\n                var that = this;\n                var element = that.element;\n                var disable = options.disable;\n                var readonly = options.readonly;\n                var wrapper = that.wrapper.add(that.filterInput).off(ns);\n                var dropDownWrapper = that._inputWrapper.off(HOVEREVENTS);\n                if (!readonly && !disable) {\n                    element.removeAttr(DISABLED).removeAttr(READONLY);\n                    dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED).on(HOVEREVENTS, that._toggleHover);\n                    wrapper.attr(TABINDEX, wrapper.data(TABINDEX)).attr(ARIA_DISABLED, false).on('keydown' + ns, proxy(that._keydown, that)).on(kendo.support.mousedown + ns, proxy(that._wrapperMousedown, that)).on('paste' + ns, proxy(that._filterPaste, that));\n                    that.wrapper.on('click' + ns, proxy(that._wrapperClick, that));\n                    if (!that.filterInput) {\n                        wrapper.on('keypress' + ns, proxy(that._keypress, that));\n                    } else {\n                        wrapper.on('input' + ns, proxy(that._search, that));\n                    }\n                } else if (disable) {\n                    wrapper.removeAttr(TABINDEX);\n                    dropDownWrapper.addClass(STATEDISABLED).removeClass(DEFAULT);\n                } else {\n                    dropDownWrapper.addClass(DEFAULT).removeClass(STATEDISABLED);\n                }\n                element.attr(DISABLED, disable).attr(READONLY, readonly);\n                wrapper.attr(ARIA_DISABLED, disable);\n            },\n            _keydown: function (e) {\n                var that = this;\n                var key = e.keyCode;\n                var altKey = e.altKey;\n                var isInputActive;\n                var handled;\n                var isPopupVisible = that.popup.visible();\n                if (that.filterInput) {\n                    isInputActive = that.filterInput[0] === activeElement();\n                }\n                if (key === keys.LEFT) {\n                    key = keys.UP;\n                    handled = true;\n                } else if (key === keys.RIGHT) {\n                    key = keys.DOWN;\n                    handled = true;\n                }\n                if (handled && isInputActive) {\n                    return;\n                }\n                e.keyCode = key;\n                if (altKey && key === keys.UP || key === keys.ESC) {\n                    that._focusElement(that.wrapper);\n                }\n                if (that._state === STATE_FILTER && key === keys.ESC) {\n                    that._clearFilter();\n                    that._open = false;\n                    that._state = STATE_ACCEPT;\n                }\n                if (key === keys.ENTER && that._typingTimeout && that.filterInput && isPopupVisible) {\n                    e.preventDefault();\n                    return;\n                }\n                if (key === keys.SPACEBAR && !isInputActive) {\n                    that.toggle(!isPopupVisible);\n                    e.preventDefault();\n                }\n                handled = that._move(e);\n                if (handled) {\n                    return;\n                }\n                if (!isPopupVisible || !that.filterInput) {\n                    var current = that._focus();\n                    if (key === keys.HOME) {\n                        handled = true;\n                        that._firstItem();\n                    } else if (key === keys.END) {\n                        handled = true;\n                        that._lastItem();\n                    }\n                    if (handled) {\n                        if (that.trigger('select', {\n                                dataItem: that._getElementDataItem(that._focus()),\n                                item: that._focus()\n                            })) {\n                            that._focus(current);\n                            return;\n                        }\n                        that._select(that._focus(), true).done(function () {\n                            if (!isPopupVisible) {\n                                that._blur();\n                            }\n                        });\n                        e.preventDefault();\n                    }\n                }\n                if (!altKey && !handled && that.filterInput) {\n                    that._search();\n                }\n            },\n            _matchText: function (text, word) {\n                var ignoreCase = this.options.ignoreCase;\n                if (text === undefined || text === null) {\n                    return false;\n                }\n                text = text + '';\n                if (ignoreCase) {\n                    text = text.toLowerCase();\n                }\n                return text.indexOf(word) === 0;\n            },\n            _shuffleData: function (data, splitIndex) {\n                var optionDataItem = this._optionLabelDataItem();\n                if (optionDataItem) {\n                    data = [optionDataItem].concat(data);\n                }\n                return data.slice(splitIndex).concat(data.slice(0, splitIndex));\n            },\n            _selectNext: function () {\n                var that = this;\n                var data = that.dataSource.flatView();\n                var dataLength = data.length + (that.hasOptionLabel() ? 1 : 0);\n                var isInLoop = sameCharsOnly(that._word, that._last);\n                var startIndex = that.selectedIndex;\n                var oldFocusedItem;\n                var text;\n                if (startIndex === -1) {\n                    startIndex = 0;\n                } else {\n                    startIndex += isInLoop ? 1 : 0;\n                    startIndex = normalizeIndex(startIndex, dataLength);\n                }\n                data = data.toJSON ? data.toJSON() : data.slice();\n                data = that._shuffleData(data, startIndex);\n                for (var idx = 0; idx < dataLength; idx++) {\n                    text = that._text(data[idx]);\n                    if (isInLoop && that._matchText(text, that._last)) {\n                        break;\n                    } else if (that._matchText(text, that._word)) {\n                        break;\n                    }\n                }\n                if (idx !== dataLength) {\n                    oldFocusedItem = that._focus();\n                    that._select(normalizeIndex(startIndex + idx, dataLength)).done(function () {\n                        var done = function () {\n                            if (!that.popup.visible()) {\n                                that._change();\n                            }\n                        };\n                        if (that.trigger('select', {\n                                dataItem: that._getElementDataItem(that._focus()),\n                                item: that._focus()\n                            })) {\n                            that._select(oldFocusedItem).done(done);\n                        } else {\n                            done();\n                        }\n                    });\n                }\n            },\n            _keypress: function (e) {\n                var that = this;\n                if (e.which === 0 || e.keyCode === kendo.keys.ENTER) {\n                    return;\n                }\n                var character = String.fromCharCode(e.charCode || e.keyCode);\n                if (that.options.ignoreCase) {\n                    character = character.toLowerCase();\n                }\n                if (character === ' ') {\n                    e.preventDefault();\n                }\n                that._word += character;\n                that._last = character;\n                that._search();\n            },\n            _popupOpen: function () {\n                var popup = this.popup;\n                popup.wrapper = kendo.wrap(popup.element);\n                if (popup.element.closest('.km-root')[0]) {\n                    popup.wrapper.addClass('km-popup km-widget');\n                    this.wrapper.addClass('km-widget');\n                }\n            },\n            _popup: function () {\n                Select.fn._popup.call(this);\n                this.popup.one('open', proxy(this._popupOpen, this));\n            },\n            _getElementDataItem: function (element) {\n                if (!element || !element[0]) {\n                    return null;\n                }\n                if (element[0] === this.optionLabel[0]) {\n                    return this._optionLabelDataItem();\n                }\n                return this.listView.dataItemByIndex(this.listView.getElementIndex(element));\n            },\n            _click: function (e) {\n                var that = this;\n                var item = e.item || $(e.currentTarget);\n                e.preventDefault();\n                if (that.trigger('select', {\n                        dataItem: that._getElementDataItem(item),\n                        item: item\n                    })) {\n                    that.close();\n                    return;\n                }\n                that._userTriggered = true;\n                that._select(item).done(function () {\n                    that._focusElement(that.wrapper);\n                    that._blur();\n                });\n            },\n            _focusElement: function (element) {\n                var active = activeElement();\n                var wrapper = this.wrapper;\n                var filterInput = this.filterInput;\n                var compareElement = element === filterInput ? wrapper : filterInput;\n                var touchEnabled = support.mobileOS && (support.touch || support.MSPointers || support.pointers);\n                if (filterInput && filterInput[0] === element[0] && touchEnabled) {\n                    return;\n                }\n                if (filterInput && (compareElement[0] === active || this._focusFilter)) {\n                    this._focusFilter = false;\n                    this._prevent = true;\n                    this._focused = element.focus();\n                }\n            },\n            _searchByWord: function (word) {\n                if (!word) {\n                    return;\n                }\n                var that = this;\n                var ignoreCase = that.options.ignoreCase;\n                if (ignoreCase) {\n                    word = word.toLowerCase();\n                }\n                that._select(function (dataItem) {\n                    return that._matchText(that._text(dataItem), word);\n                });\n            },\n            _inputValue: function () {\n                return this.text();\n            },\n            _search: function () {\n                var that = this;\n                var dataSource = that.dataSource;\n                clearTimeout(that._typingTimeout);\n                if (that._isFilterEnabled()) {\n                    that._typingTimeout = setTimeout(function () {\n                        var value = that.filterInput.val();\n                        if (that._prev !== value) {\n                            that._prev = value;\n                            that.search(value);\n                            that._resizeFilterInput();\n                        }\n                        that._typingTimeout = null;\n                    }, that.options.delay);\n                } else {\n                    that._typingTimeout = setTimeout(function () {\n                        that._word = '';\n                    }, that.options.delay);\n                    if (!that.listView.bound()) {\n                        dataSource.fetch().done(function () {\n                            that._selectNext();\n                        });\n                        return;\n                    }\n                    that._selectNext();\n                }\n            },\n            _get: function (candidate) {\n                var data, found, idx;\n                var isFunction = typeof candidate === 'function';\n                var jQueryCandidate = !isFunction ? $(candidate) : $();\n                if (this.hasOptionLabel()) {\n                    if (typeof candidate === 'number') {\n                        if (candidate > -1) {\n                            candidate -= 1;\n                        }\n                    } else if (jQueryCandidate.hasClass('k-list-optionlabel')) {\n                        candidate = -1;\n                    }\n                }\n                if (isFunction) {\n                    data = this.dataSource.flatView();\n                    for (idx = 0; idx < data.length; idx++) {\n                        if (candidate(data[idx])) {\n                            candidate = idx;\n                            found = true;\n                            break;\n                        }\n                    }\n                    if (!found) {\n                        candidate = -1;\n                    }\n                }\n                return candidate;\n            },\n            _firstItem: function () {\n                if (this.hasOptionLabel()) {\n                    this._focus(this.optionLabel);\n                } else {\n                    this.listView.focusFirst();\n                }\n            },\n            _lastItem: function () {\n                this._resetOptionLabel();\n                this.listView.focusLast();\n            },\n            _nextItem: function () {\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    this._resetOptionLabel();\n                    this.listView.focusFirst();\n                } else {\n                    this.listView.focusNext();\n                }\n            },\n            _prevItem: function () {\n                if (this.optionLabel.hasClass('k-state-focused')) {\n                    return;\n                }\n                this.listView.focusPrev();\n                if (!this.listView.focus()) {\n                    this._focus(this.optionLabel);\n                }\n            },\n            _focusItem: function () {\n                var options = this.options;\n                var listView = this.listView;\n                var focusedItem = listView.focus();\n                var index = listView.select();\n                index = index[index.length - 1];\n                if (index === undefined && options.highlightFirst && !focusedItem) {\n                    index = 0;\n                }\n                if (index !== undefined) {\n                    listView.focus(index);\n                } else {\n                    if (options.optionLabel && (!options.virtual || options.virtual.mapValueTo !== 'dataItem')) {\n                        this._focus(this.optionLabel);\n                        this._select(this.optionLabel);\n                        this.listView.content.scrollTop(0);\n                    } else {\n                        listView.scrollToIndex(0);\n                    }\n                }\n            },\n            _resetOptionLabel: function (additionalClass) {\n                this.optionLabel.removeClass('k-state-focused' + (additionalClass || '')).removeAttr('id');\n            },\n            _focus: function (candidate) {\n                var listView = this.listView;\n                var optionLabel = this.optionLabel;\n                if (candidate === undefined) {\n                    candidate = listView.focus();\n                    if (!candidate && optionLabel.hasClass('k-state-focused')) {\n                        candidate = optionLabel;\n                    }\n                    return candidate;\n                }\n                this._resetOptionLabel();\n                candidate = this._get(candidate);\n                listView.focus(candidate);\n                if (candidate === -1) {\n                    optionLabel.addClass('k-state-focused').attr('id', listView._optionID);\n                    this._focused.add(this.filterInput).removeAttr('aria-activedescendant').attr('aria-activedescendant', listView._optionID);\n                }\n            },\n            _select: function (candidate, keepState) {\n                var that = this;\n                candidate = that._get(candidate);\n                return that.listView.select(candidate).done(function () {\n                    if (!keepState && that._state === STATE_FILTER) {\n                        that._state = STATE_ACCEPT;\n                    }\n                    if (candidate === -1) {\n                        that._selectValue(null);\n                    }\n                });\n            },\n            _selectValue: function (dataItem) {\n                var that = this;\n                var optionLabel = that.options.optionLabel;\n                var idx = that.listView.select();\n                var value = '';\n                var text = '';\n                idx = idx[idx.length - 1];\n                if (idx === undefined) {\n                    idx = -1;\n                }\n                this._resetOptionLabel(' k-state-selected');\n                if (dataItem || dataItem === 0) {\n                    text = dataItem;\n                    value = that._dataValue(dataItem);\n                    if (optionLabel) {\n                        idx += 1;\n                    }\n                } else if (optionLabel) {\n                    that._focus(that.optionLabel.addClass('k-state-selected'));\n                    text = that._optionLabelText();\n                    if (typeof optionLabel === 'string') {\n                        value = '';\n                    } else {\n                        value = that._value(optionLabel);\n                    }\n                    idx = 0;\n                }\n                that.selectedIndex = idx;\n                if (value === null) {\n                    value = '';\n                }\n                that._textAccessor(text);\n                that._accessor(value, idx);\n                that._triggerCascade();\n            },\n            _mobile: function () {\n                var that = this, popup = that.popup, mobileOS = support.mobileOS, root = popup.element.parents('.km-root').eq(0);\n                if (root.length && mobileOS) {\n                    popup.options.animation.open.effects = mobileOS.android || mobileOS.meego ? 'fadeIn' : mobileOS.ios || mobileOS.wp ? 'slideIn:up' : popup.options.animation.open.effects;\n                }\n            },\n            _filterHeader: function () {\n                var icon;\n                if (this.filterInput) {\n                    this.filterInput.off(ns).parent().remove();\n                    this.filterInput = null;\n                }\n                if (this._isFilterEnabled()) {\n                    icon = '<span class=\"k-icon k-i-zoom\"></span>';\n                    this.filterInput = $('<input class=\"k-textbox\"/>').attr({\n                        placeholder: this.element.attr('placeholder'),\n                        title: this.element.attr('title'),\n                        role: 'listbox',\n                        'aria-haspopup': true,\n                        'aria-expanded': false\n                    });\n                    this.list.prepend($('<span class=\"k-list-filter\" />').append(this.filterInput.add(icon)));\n                }\n            },\n            _span: function () {\n                var that = this, wrapper = that.wrapper, SELECTOR = 'span.k-input', span;\n                span = wrapper.find(SELECTOR);\n                if (!span[0]) {\n                    wrapper.append('<span unselectable=\"on\" class=\"k-dropdown-wrap k-state-default\"><span unselectable=\"on\" class=\"k-input\">&nbsp;</span><span unselectable=\"on\" class=\"k-select\" aria-label=\"select\"><span class=\"k-icon k-i-arrow-60-down\"></span></span></span>').append(that.element);\n                    span = wrapper.find(SELECTOR);\n                }\n                that.span = span;\n                that._inputWrapper = $(wrapper[0].firstChild);\n                that._arrow = wrapper.find('.k-select');\n                that._arrowIcon = that._arrow.find('.k-icon');\n            },\n            _wrapper: function () {\n                var that = this, element = that.element, DOMelement = element[0], wrapper;\n                wrapper = element.parent();\n                if (!wrapper.is('span.k-widget')) {\n                    wrapper = element.wrap('<span />').parent();\n                    wrapper[0].style.cssText = DOMelement.style.cssText;\n                    wrapper[0].title = DOMelement.title;\n                }\n                that._focused = that.wrapper = wrapper.addClass('k-widget k-dropdown').addClass(DOMelement.className).css('display', '').attr({\n                    accesskey: element.attr('accesskey'),\n                    unselectable: 'on',\n                    role: 'listbox',\n                    'aria-haspopup': true,\n                    'aria-expanded': false\n                });\n                element.hide().removeAttr('accesskey');\n            },\n            _clearSelection: function (parent) {\n                this.select(parent.value() ? 0 : -1);\n            },\n            _inputTemplate: function () {\n                var that = this, template = that.options.valueTemplate;\n                if (!template) {\n                    template = $.proxy(kendo.template('#:this._text(data)#', { useWithBlock: false }), that);\n                } else {\n                    template = kendo.template(template);\n                }\n                that.valueTemplate = template;\n                if (that.hasOptionLabel() && !that.options.optionLabelTemplate) {\n                    try {\n                        that.valueTemplate(that._optionLabelDataItem());\n                    } catch (e) {\n                        throw new Error(MSG_INVALID_OPTION_LABEL);\n                    }\n                }\n            },\n            _textAccessor: function (text) {\n                var dataItem = null;\n                var template = this.valueTemplate;\n                var optionLabelText = this._optionLabelText();\n                var span = this.span;\n                if (text === undefined) {\n                    return span.text();\n                }\n                if ($.isPlainObject(text) || text instanceof ObservableObject) {\n                    dataItem = text;\n                } else if (optionLabelText && optionLabelText === text) {\n                    dataItem = this.options.optionLabel;\n                }\n                if (!dataItem) {\n                    dataItem = this._assignInstance(text, this._accessor());\n                }\n                if (this.hasOptionLabel()) {\n                    if (dataItem === optionLabelText || this._text(dataItem) === optionLabelText) {\n                        template = this.optionLabelTemplate;\n                        if (typeof this.options.optionLabel === 'string' && !this.options.optionLabelTemplate) {\n                            dataItem = optionLabelText;\n                        }\n                    }\n                }\n                var getElements = function () {\n                    return {\n                        elements: span.get(),\n                        data: [{ dataItem: dataItem }]\n                    };\n                };\n                this.angular('cleanup', getElements);\n                try {\n                    span.html(template(dataItem));\n                } catch (e) {\n                    span.html('');\n                }\n                this.angular('compile', getElements);\n            },\n            _preselect: function (value, text) {\n                if (!value && !text) {\n                    text = this._optionLabelText();\n                }\n                this._accessor(value);\n                this._textAccessor(text);\n                this._old = this._accessor();\n                this._oldIndex = this.selectedIndex;\n                this.listView.setValue(value);\n                this._initialIndex = null;\n                this._presetValue = true;\n            },\n            _assignInstance: function (text, value) {\n                var dataTextField = this.options.dataTextField;\n                var dataItem = {};\n                if (dataTextField) {\n                    assign(dataItem, dataTextField.split('.'), text);\n                    assign(dataItem, this.options.dataValueField.split('.'), value);\n                    dataItem = new ObservableObject(dataItem);\n                } else {\n                    dataItem = text;\n                }\n                return dataItem;\n            }\n        });\n        function assign(instance, fields, value) {\n            var idx = 0, lastIndex = fields.length - 1, field;\n            for (; idx < lastIndex; ++idx) {\n                field = fields[idx];\n                if (!(field in instance)) {\n                    instance[field] = {};\n                }\n                instance = instance[field];\n            }\n            instance[fields[lastIndex]] = value;\n        }\n        function normalizeIndex(index, length) {\n            if (index >= length) {\n                index -= length;\n            }\n            return index;\n        }\n        function sameCharsOnly(word, character) {\n            for (var idx = 0; idx < word.length; idx++) {\n                if (word.charAt(idx) !== character) {\n                    return false;\n                }\n            }\n            return true;\n        }\n        ui.plugin(DropDownList);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('dataviz/diagram/dom', [\n        'kendo.data',\n        'kendo.draganddrop',\n        'kendo.toolbar',\n        'kendo.editable',\n        'kendo.window',\n        'kendo.dropdownlist',\n        'kendo.dataviz.core',\n        'kendo.dataviz.themes',\n        'dataviz/diagram/svg',\n        'dataviz/diagram/services',\n        'dataviz/diagram/layout'\n    ], f);\n}(function () {\n    (function ($, undefined) {\n        var dataviz = kendo.dataviz, draw = kendo.drawing, geom = kendo.geometry, diagram = dataviz.diagram, Widget = kendo.ui.Widget, Class = kendo.Class, proxy = $.proxy, deepExtend = kendo.deepExtend, outerWidth = kendo._outerWidth, outerHeight = kendo._outerHeight, extend = $.extend, HierarchicalDataSource = kendo.data.HierarchicalDataSource, Canvas = diagram.Canvas, Group = diagram.Group, Rectangle = diagram.Rectangle, Circle = diagram.Circle, CompositeTransform = diagram.CompositeTransform, Rect = diagram.Rect, Path = diagram.Path, DeleteShapeUnit = diagram.DeleteShapeUnit, DeleteConnectionUnit = diagram.DeleteConnectionUnit, TextBlock = diagram.TextBlock, Image = diagram.Image, Point = diagram.Point, Intersect = diagram.Intersect, ConnectionEditAdorner = diagram.ConnectionEditAdorner, UndoRedoService = diagram.UndoRedoService, ToolService = diagram.ToolService, Selector = diagram.Selector, ResizingAdorner = diagram.ResizingAdorner, ConnectorsAdorner = diagram.ConnectorsAdorner, Cursors = diagram.Cursors, Utils = diagram.Utils, Observable = kendo.Observable, ToBackUnit = diagram.ToBackUnit, ToFrontUnit = diagram.ToFrontUnit, PolylineRouter = diagram.PolylineRouter, CascadingRouter = diagram.CascadingRouter, isUndefined = Utils.isUndefined, isDefined = Utils.isDefined, defined = draw.util.defined, isArray = $.isArray, isFunction = kendo.isFunction, isString = Utils.isString, isPlainObject = $.isPlainObject, math = Math;\n        var NS = '.kendoDiagram', CASCADING = 'cascading', ITEMBOUNDSCHANGE = 'itemBoundsChange', CHANGE = 'change', CLICK = 'click', DRAG = 'drag', DRAG_END = 'dragEnd', DRAG_START = 'dragStart', MOUSE_ENTER = 'mouseEnter', MOUSE_LEAVE = 'mouseLeave', ERROR = 'error', AUTO = 'Auto', TOP = 'Top', RIGHT = 'Right', LEFT = 'Left', BOTTOM = 'Bottom', MAXINT = 9007199254740992, SELECT = 'select', ITEMROTATE = 'itemRotate', PAN = 'pan', ZOOM_START = 'zoomStart', ZOOM_END = 'zoomEnd', NONE = 'none', DEFAULT_CANVAS_WIDTH = 600, DEFAULT_CANVAS_HEIGHT = 600, DEFAULT_SHAPE_TYPE = 'rectangle', DEFAULT_SHAPE_WIDTH = 100, DEFAULT_SHAPE_HEIGHT = 100, DEFAULT_SHAPE_MINWIDTH = 20, DEFAULT_SHAPE_MINHEIGHT = 20, DEFAULT_SHAPE_POSITION = 0, DEFAULT_CONNECTION_BACKGROUND = 'Yellow', MAX_VALUE = Number.MAX_VALUE, MIN_VALUE = -Number.MAX_VALUE, ABSOLUTE = 'absolute', TRANSFORMED = 'transformed', ROTATED = 'rotated', TRANSPARENT = 'transparent', WIDTH = 'width', HEIGHT = 'height', X = 'x', Y = 'y', MOUSEWHEEL_NS = 'DOMMouseScroll' + NS + ' mousewheel' + NS, MOBILE_ZOOM_RATE = 0.05, MOBILE_PAN_DISTANCE = 5, BUTTON_TEMPLATE = '<a class=\"k-button k-button-icontext #=className#\" href=\"\\\\#\"><span class=\"#=iconClass# #=imageClass#\"></span>#=text#</a>', CONNECTION_CONTENT_OFFSET = 5;\n        diagram.DefaultConnectors = [\n            { name: TOP },\n            { name: BOTTOM },\n            { name: LEFT },\n            { name: RIGHT },\n            {\n                name: AUTO,\n                position: function (shape) {\n                    return shape.getPosition('center');\n                }\n            }\n        ];\n        var defaultButtons = {\n            cancel: {\n                text: 'Cancel',\n                imageClass: 'k-i-cancel',\n                className: 'k-diagram-cancel',\n                iconClass: 'k-icon'\n            },\n            update: {\n                text: 'Update',\n                imageClass: 'k-i-checkmark',\n                className: 'k-diagram-update',\n                iconClass: 'k-icon'\n            }\n        };\n        diagram.shapeDefaults = function (extra) {\n            var defaults = {\n                type: DEFAULT_SHAPE_TYPE,\n                path: '',\n                autoSize: true,\n                visual: null,\n                x: DEFAULT_SHAPE_POSITION,\n                y: DEFAULT_SHAPE_POSITION,\n                minWidth: DEFAULT_SHAPE_MINWIDTH,\n                minHeight: DEFAULT_SHAPE_MINHEIGHT,\n                width: DEFAULT_SHAPE_WIDTH,\n                height: DEFAULT_SHAPE_HEIGHT,\n                hover: {},\n                editable: {\n                    connect: true,\n                    tools: []\n                },\n                connectors: diagram.DefaultConnectors,\n                rotation: { angle: 0 }\n            };\n            Utils.simpleExtend(defaults, extra);\n            return defaults;\n        };\n        function mwDelta(e) {\n            var origEvent = e.originalEvent, delta = 0;\n            if (origEvent.wheelDelta) {\n                delta = -origEvent.wheelDelta / 40;\n                delta = delta > 0 ? math.ceil(delta) : math.floor(delta);\n            } else if (origEvent.detail) {\n                delta = origEvent.detail;\n            }\n            return delta;\n        }\n        function isAutoConnector(connector) {\n            return connector.options.name.toLowerCase() === AUTO.toLowerCase();\n        }\n        function closestConnector(point, connectors) {\n            var minimumDistance = MAXINT, resCtr, connector;\n            for (var i = 0; i < connectors.length; i++) {\n                connector = connectors[i];\n                if (!isAutoConnector(connector)) {\n                    var dist = point.distanceTo(connector.position());\n                    if (dist < minimumDistance) {\n                        minimumDistance = dist;\n                        resCtr = connector;\n                    }\n                }\n            }\n            return resCtr;\n        }\n        function indicesOfItems(group, visuals) {\n            var i, indices = [], visual;\n            var children = group.drawingContainer().children;\n            var length = children.length;\n            for (i = 0; i < visuals.length; i++) {\n                visual = visuals[i];\n                for (var j = 0; j < length; j++) {\n                    if (children[j] == visual.drawingContainer()) {\n                        indices.push(j);\n                        break;\n                    }\n                }\n            }\n            return indices;\n        }\n        var DiagramElement = Observable.extend({\n            init: function (options) {\n                var that = this;\n                that.dataItem = (options || {}).dataItem;\n                Observable.fn.init.call(that);\n                that.options = deepExtend({ id: diagram.randomId() }, that.options, options);\n                that.isSelected = false;\n                that.visual = new Group({\n                    id: that.options.id,\n                    autoSize: that.options.autoSize\n                });\n                that.id = that.options.id;\n                that._template();\n            },\n            options: {\n                hover: {},\n                cursor: Cursors.grip,\n                content: { align: 'center middle' },\n                selectable: true,\n                serializable: true,\n                enable: true\n            },\n            _getCursor: function (point) {\n                if (this.adorner) {\n                    return this.adorner._getCursor(point);\n                }\n                return this.options.cursor;\n            },\n            visible: function (value) {\n                if (isUndefined(value)) {\n                    return this.visual.visible();\n                } else {\n                    this.visual.visible(value);\n                }\n            },\n            bounds: function () {\n            },\n            refresh: function () {\n                this.visual.redraw();\n            },\n            position: function (point) {\n                this.options.x = point.x;\n                this.options.y = point.y;\n                this.visual.position(point);\n            },\n            toString: function () {\n                return this.options.id;\n            },\n            serialize: function () {\n                var json = deepExtend({}, { options: this.options });\n                if (this.dataItem) {\n                    json.dataItem = this.dataItem.toString();\n                }\n                return json;\n            },\n            _content: function (content) {\n                if (content !== undefined) {\n                    var options = this.options;\n                    if (diagram.Utils.isString(content)) {\n                        options.content.text = content;\n                    } else {\n                        deepExtend(options.content, content);\n                    }\n                    var contentOptions = options.content;\n                    var contentVisual = this._contentVisual;\n                    if (!contentVisual) {\n                        this._createContentVisual(contentOptions);\n                    } else {\n                        this._updateContentVisual(contentOptions);\n                    }\n                }\n                return this.options.content.text;\n            },\n            _createContentVisual: function (options) {\n                if (options.text) {\n                    this._contentVisual = new TextBlock(options);\n                    this._contentVisual._includeInBBox = false;\n                    this.visual.append(this._contentVisual);\n                }\n            },\n            _updateContentVisual: function (options) {\n                this._contentVisual.redraw(options);\n            },\n            _hitTest: function (point) {\n                var bounds = this.bounds();\n                return this.visible() && bounds.contains(point) && this.options.enable;\n            },\n            _template: function () {\n                var that = this;\n                if (that.options.content.template) {\n                    var data = that.dataItem || {}, elementTemplate = kendo.template(that.options.content.template, { paramName: 'dataItem' });\n                    that.options.content.text = elementTemplate(data);\n                }\n            },\n            _canSelect: function () {\n                return this.options.selectable !== false;\n            },\n            toJSON: function () {\n                return { id: this.options.id };\n            }\n        });\n        var Connector = Class.extend({\n            init: function (shape, options) {\n                this.options = deepExtend({}, this.options, options);\n                this.connections = [];\n                this.shape = shape;\n            },\n            options: {\n                width: 7,\n                height: 7,\n                fill: { color: DEFAULT_CONNECTION_BACKGROUND },\n                hover: {}\n            },\n            position: function () {\n                if (this.options.position) {\n                    return this.options.position(this.shape);\n                } else {\n                    return this.shape.getPosition(this.options.name);\n                }\n            },\n            toJSON: function () {\n                return {\n                    shapeId: this.shape.toString(),\n                    connector: this.options.name\n                };\n            }\n        });\n        Connector.parse = function (diagram, str) {\n            var tempStr = str.split(':'), id = tempStr[0], name = tempStr[1] || AUTO;\n            for (var i = 0; i < diagram.shapes.length; i++) {\n                var shape = diagram.shapes[i];\n                if (shape.options.id == id) {\n                    return shape.getConnector(name.trim());\n                }\n            }\n        };\n        var Shape = DiagramElement.extend({\n            init: function (options, diagram) {\n                var that = this;\n                DiagramElement.fn.init.call(that, options);\n                this.diagram = diagram;\n                this.updateOptionsFromModel();\n                options = that.options;\n                that.connectors = [];\n                that.type = options.type;\n                that.createShapeVisual();\n                that.updateBounds();\n                that.content(that.content());\n                that._createConnectors();\n            },\n            options: diagram.shapeDefaults(),\n            _setOptionsFromModel: function (model) {\n                var modelOptions = filterShapeDataItem(model || this.dataItem);\n                this.options = deepExtend({}, this.options, modelOptions);\n                this.redrawVisual();\n            },\n            updateOptionsFromModel: function (model, field) {\n                if (this.diagram && this.diagram._isEditable) {\n                    var modelOptions = filterShapeDataItem(model || this.dataItem);\n                    if (model && field) {\n                        if (!dataviz.inArray(field, [\n                                'x',\n                                'y',\n                                'width',\n                                'height'\n                            ])) {\n                            if (this.options.visual) {\n                                this._redrawVisual();\n                            } else if (modelOptions.type) {\n                                this.options = deepExtend({}, this.options, modelOptions);\n                                this._redrawVisual();\n                            }\n                            if (this.options.content) {\n                                this._template();\n                                this.content(this.options.content);\n                            }\n                        } else {\n                            var bounds = this.bounds();\n                            bounds[field] = model[field];\n                            this.bounds(bounds);\n                        }\n                    } else {\n                        this.options = deepExtend({}, this.options, modelOptions);\n                    }\n                }\n            },\n            _redrawVisual: function () {\n                this.visual.clear();\n                this._contentVisual = null;\n                this.options.dataItem = this.dataItem;\n                this.createShapeVisual();\n                this.updateBounds();\n            },\n            redrawVisual: function () {\n                this._redrawVisual();\n                if (this.options.content) {\n                    this._template();\n                    this.content(this.options.content);\n                }\n            },\n            updateModel: function (syncChanges) {\n                var diagram = this.diagram;\n                if (diagram && diagram._isEditable) {\n                    var bounds = this._bounds;\n                    var model = this.dataItem;\n                    if (model) {\n                        diagram._suspendModelRefresh();\n                        if (defined(model.x) && bounds.x !== model.x) {\n                            model.set('x', bounds.x);\n                        }\n                        if (defined(model.y) && bounds.y !== model.y) {\n                            model.set('y', bounds.y);\n                        }\n                        if (defined(model.width) && bounds.width !== model.width) {\n                            model.set('width', bounds.width);\n                        }\n                        if (defined(model.height) && bounds.height !== model.height) {\n                            model.set('height', bounds.height);\n                        }\n                        this.dataItem = model;\n                        diagram._resumeModelRefresh();\n                        if (syncChanges) {\n                            diagram._syncShapeChanges();\n                        }\n                    }\n                }\n            },\n            updateBounds: function () {\n                var bounds = this.visual._measure(true);\n                var options = this.options;\n                this.bounds(new Rect(options.x, options.y, bounds.width, bounds.height));\n                this._rotate();\n                this._alignContent();\n            },\n            content: function (content) {\n                var result = this._content(content);\n                this._alignContent();\n                return result;\n            },\n            _alignContent: function () {\n                var contentOptions = this.options.content || {};\n                var contentVisual = this._contentVisual;\n                if (contentVisual && contentOptions.align) {\n                    var containerRect = this.visual._measure();\n                    var aligner = new diagram.RectAlign(containerRect);\n                    var contentBounds = contentVisual.drawingElement.bbox(null);\n                    var contentRect = new Rect(0, 0, contentBounds.width(), contentBounds.height());\n                    var alignedBounds = aligner.align(contentRect, contentOptions.align);\n                    contentVisual.position(alignedBounds.topLeft());\n                }\n            },\n            _createConnectors: function () {\n                var options = this.options, length = options.connectors.length, connectorDefaults = options.connectorDefaults, connector, i;\n                for (i = 0; i < length; i++) {\n                    connector = new Connector(this, deepExtend({}, connectorDefaults, options.connectors[i]));\n                    this.connectors.push(connector);\n                }\n            },\n            bounds: function (value) {\n                var bounds;\n                if (value) {\n                    if (isString(value)) {\n                        switch (value) {\n                        case TRANSFORMED:\n                            bounds = this._transformedBounds();\n                            break;\n                        case ABSOLUTE:\n                            bounds = this._transformedBounds();\n                            var pan = this.diagram._pan;\n                            bounds.x += pan.x;\n                            bounds.y += pan.y;\n                            break;\n                        case ROTATED:\n                            bounds = this._rotatedBounds();\n                            break;\n                        default:\n                            bounds = this._bounds;\n                        }\n                    } else {\n                        this._setBounds(value);\n                        this._triggerBoundsChange();\n                        if (!(this.diagram && this.diagram._layouting)) {\n                            this.refreshConnections();\n                        }\n                    }\n                } else {\n                    bounds = this._bounds;\n                }\n                return bounds;\n            },\n            _setBounds: function (rect) {\n                var options = this.options;\n                var topLeft = rect.topLeft();\n                var x = options.x = topLeft.x;\n                var y = options.y = topLeft.y;\n                var width = options.width = math.max(rect.width, options.minWidth);\n                var height = options.height = math.max(rect.height, options.minHeight);\n                this._bounds = new Rect(x, y, width, height);\n                this.visual.redraw({\n                    x: x,\n                    y: y,\n                    width: width,\n                    height: height\n                });\n            },\n            position: function (point) {\n                if (point) {\n                    this.bounds(new Rect(point.x, point.y, this._bounds.width, this._bounds.height));\n                } else {\n                    return this._bounds.topLeft();\n                }\n            },\n            clone: function () {\n                var json = this.serialize();\n                json.options.id = diagram.randomId();\n                if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n                    json.options.dataItem = cloneDataItem(this.dataItem);\n                }\n                return new Shape(json.options);\n            },\n            select: function (value) {\n                var diagram = this.diagram, selected, deselected;\n                if (isUndefined(value)) {\n                    value = true;\n                }\n                if (this._canSelect()) {\n                    if (this.isSelected != value) {\n                        selected = [];\n                        deselected = [];\n                        this.isSelected = value;\n                        if (this.isSelected) {\n                            diagram._selectedItems.push(this);\n                            selected.push(this);\n                        } else {\n                            Utils.remove(diagram._selectedItems, this);\n                            deselected.push(this);\n                        }\n                        if (!diagram._internalSelection) {\n                            diagram._selectionChanged(selected, deselected);\n                        }\n                        return true;\n                    }\n                }\n            },\n            rotate: function (angle, center, undoable) {\n                var rotate = this.visual.rotate();\n                if (angle !== undefined) {\n                    if (undoable !== false && this.diagram && this.diagram.undoRedoService && angle !== rotate.angle) {\n                        this.diagram.undoRedoService.add(new diagram.RotateUnit(this.diagram._resizingAdorner, [this], [rotate.angle]), false);\n                    }\n                    var b = this.bounds(), sc = new Point(b.width / 2, b.height / 2), deltaAngle, newPosition;\n                    if (center) {\n                        deltaAngle = angle - rotate.angle;\n                        newPosition = b.center().rotate(center, 360 - deltaAngle).minus(sc);\n                        this._rotationOffset = this._rotationOffset.plus(newPosition.minus(b.topLeft()));\n                        this.position(newPosition);\n                    }\n                    this.visual.rotate(angle, sc);\n                    this.options.rotation.angle = angle;\n                    if (this.diagram && this.diagram._connectorsAdorner) {\n                        this.diagram._connectorsAdorner.refresh();\n                    }\n                    this.refreshConnections();\n                    if (this.diagram) {\n                        this.diagram.trigger(ITEMROTATE, { item: this });\n                    }\n                }\n                return rotate;\n            },\n            connections: function (type) {\n                var result = [], i, j, con, cons, ctr;\n                for (i = 0; i < this.connectors.length; i++) {\n                    ctr = this.connectors[i];\n                    cons = ctr.connections;\n                    for (j = 0, cons; j < cons.length; j++) {\n                        con = cons[j];\n                        if (type == 'out') {\n                            var source = con.source();\n                            if (source.shape && source.shape == this) {\n                                result.push(con);\n                            }\n                        } else if (type == 'in') {\n                            var target = con.target();\n                            if (target.shape && target.shape == this) {\n                                result.push(con);\n                            }\n                        } else {\n                            result.push(con);\n                        }\n                    }\n                }\n                return result;\n            },\n            refreshConnections: function () {\n                $.each(this.connections(), function () {\n                    this.refresh();\n                });\n            },\n            getConnector: function (nameOrPoint) {\n                var i, ctr;\n                if (isString(nameOrPoint)) {\n                    nameOrPoint = nameOrPoint.toLocaleLowerCase();\n                    for (i = 0; i < this.connectors.length; i++) {\n                        ctr = this.connectors[i];\n                        if (ctr.options.name.toLocaleLowerCase() == nameOrPoint) {\n                            return ctr;\n                        }\n                    }\n                } else if (nameOrPoint instanceof Point) {\n                    return closestConnector(nameOrPoint, this.connectors);\n                } else {\n                    return this.connectors.length ? this.connectors[0] : null;\n                }\n            },\n            getPosition: function (side) {\n                var b = this.bounds(), fnName = side.charAt(0).toLowerCase() + side.slice(1);\n                if (isFunction(b[fnName])) {\n                    return this._transformPoint(b[fnName]());\n                }\n                return b.center();\n            },\n            redraw: function (options) {\n                if (options) {\n                    var shapeOptions = this.options;\n                    var boundsChange;\n                    this.shapeVisual.redraw(this._visualOptions(options));\n                    if (this._diffNumericOptions(options, [\n                            WIDTH,\n                            HEIGHT,\n                            X,\n                            Y\n                        ])) {\n                        this.bounds(new Rect(shapeOptions.x, shapeOptions.y, shapeOptions.width, shapeOptions.height));\n                        boundsChange = true;\n                    }\n                    if (options.connectors) {\n                        shapeOptions.connectors = options.connectors;\n                        this._updateConnectors();\n                    }\n                    shapeOptions = deepExtend(shapeOptions, options);\n                    if (options.rotation || boundsChange) {\n                        this._rotate();\n                    }\n                    if (shapeOptions.content) {\n                        this.content(shapeOptions.content);\n                    }\n                }\n            },\n            _updateConnectors: function () {\n                var connections = this.connections();\n                this.connectors = [];\n                this._createConnectors();\n                var connection;\n                var source;\n                var target;\n                for (var idx = 0; idx < connections.length; idx++) {\n                    connection = connections[idx];\n                    source = connection.source();\n                    target = connection.target();\n                    if (source.shape && source.shape === this) {\n                        connection.source(this.getConnector(source.options.name) || null);\n                    } else if (target.shape && target.shape === this) {\n                        connection.target(this.getConnector(target.options.name) || null);\n                    }\n                    connection.updateModel();\n                }\n            },\n            _diffNumericOptions: diagram.diffNumericOptions,\n            _visualOptions: function (options) {\n                return {\n                    data: options.path,\n                    source: options.source,\n                    hover: options.hover,\n                    fill: options.fill,\n                    stroke: options.stroke\n                };\n            },\n            _triggerBoundsChange: function () {\n                if (this.diagram) {\n                    this.diagram.trigger(ITEMBOUNDSCHANGE, {\n                        item: this,\n                        bounds: this._bounds.clone()\n                    });\n                }\n            },\n            _transformPoint: function (point) {\n                var rotate = this.rotate(), bounds = this.bounds(), tl = bounds.topLeft();\n                if (rotate.angle) {\n                    point.rotate(rotate.center().plus(tl), 360 - rotate.angle);\n                }\n                return point;\n            },\n            _transformedBounds: function () {\n                var bounds = this.bounds(), tl = bounds.topLeft(), br = bounds.bottomRight();\n                return Rect.fromPoints(this.diagram.modelToView(tl), this.diagram.modelToView(br));\n            },\n            _rotatedBounds: function () {\n                var bounds = this.bounds().rotatedBounds(this.rotate().angle), tl = bounds.topLeft(), br = bounds.bottomRight();\n                return Rect.fromPoints(tl, br);\n            },\n            _rotate: function () {\n                var rotation = this.options.rotation;\n                if (rotation && rotation.angle) {\n                    this.rotate(rotation.angle);\n                }\n                this._rotationOffset = new Point();\n            },\n            _hover: function (value) {\n                var options = this.options, hover = options.hover, stroke = options.stroke, fill = options.fill;\n                if (value && isDefined(hover.stroke)) {\n                    stroke = deepExtend({}, stroke, hover.stroke);\n                }\n                if (value && isDefined(hover.fill)) {\n                    fill = hover.fill;\n                }\n                this.shapeVisual.redraw({\n                    stroke: stroke,\n                    fill: fill\n                });\n                if (options.editable && options.editable.connect) {\n                    this.diagram._showConnectors(this, value);\n                }\n            },\n            _hitTest: function (value) {\n                if (this.visible()) {\n                    var bounds = this.bounds(), rotatedPoint, angle = this.rotate().angle;\n                    if (value.isEmpty && !value.isEmpty()) {\n                        return Intersect.rects(value, bounds, angle ? angle : 0);\n                    } else {\n                        rotatedPoint = value.clone().rotate(bounds.center(), angle);\n                        if (bounds.contains(rotatedPoint)) {\n                            return this;\n                        }\n                    }\n                }\n            },\n            toJSON: function () {\n                return { shapeId: this.options.id };\n            },\n            createShapeVisual: function () {\n                var options = this.options;\n                var visualOptions = this._visualOptions(options);\n                var visualTemplate = options.visual;\n                var type = (options.type + '').toLocaleLowerCase();\n                var shapeVisual;\n                visualOptions.width = options.width;\n                visualOptions.height = options.height;\n                if (isFunction(visualTemplate)) {\n                    shapeVisual = visualTemplate.call(this, options);\n                } else if (visualOptions.data) {\n                    shapeVisual = new Path(visualOptions);\n                    translateToOrigin(shapeVisual);\n                } else if (type == 'rectangle') {\n                    shapeVisual = new Rectangle(visualOptions);\n                } else if (type == 'circle') {\n                    shapeVisual = new Circle(visualOptions);\n                } else if (type == 'text') {\n                    shapeVisual = new TextBlock(visualOptions);\n                } else if (type == 'image') {\n                    shapeVisual = new Image(visualOptions);\n                } else {\n                    shapeVisual = new Path(visualOptions);\n                }\n                this.shapeVisual = shapeVisual;\n                this.visual.append(this.shapeVisual);\n            }\n        });\n        var Connection = DiagramElement.extend({\n            init: function (from, to, options) {\n                var that = this;\n                DiagramElement.fn.init.call(that, options);\n                this.updateOptionsFromModel();\n                this._initRouter();\n                that.path = new diagram.Polyline(that.options);\n                that.path.fill(TRANSPARENT);\n                that.visual.append(that.path);\n                that._sourcePoint = that._targetPoint = new Point();\n                that._setSource(from);\n                that._setTarget(to);\n                that.content(that.options.content);\n                that.definers = [];\n                if (defined(options) && options.points) {\n                    that.points(options.points);\n                }\n            },\n            options: {\n                hover: { stroke: {} },\n                startCap: NONE,\n                endCap: NONE,\n                points: [],\n                selectable: true,\n                fromConnector: AUTO,\n                toConnector: AUTO\n            },\n            _setOptionsFromModel: function (model) {\n                this.updateOptionsFromModel(model || this.dataItem);\n            },\n            updateOptionsFromModel: function (model) {\n                if (this.diagram && this.diagram._isEditable) {\n                    var dataMap = this.diagram._dataMap;\n                    var options = filterConnectionDataItem(model || this.dataItem);\n                    if (model) {\n                        if (defined(options.from)) {\n                            var from = dataMap[options.from];\n                            if (from && defined(options.fromConnector)) {\n                                from = from.getConnector(options.fromConnector);\n                            }\n                            this.source(from);\n                        } else if (defined(options.fromX) && defined(options.fromY)) {\n                            this.source(new Point(options.fromX, options.fromY));\n                        }\n                        if (defined(options.to)) {\n                            var to = dataMap[options.to];\n                            if (to && defined(options.toConnector)) {\n                                to = to.getConnector(options.toConnector);\n                            }\n                            this.target(to);\n                        } else if (defined(options.toX) && defined(options.toY)) {\n                            this.target(new Point(options.toX, options.toY));\n                        }\n                        if (defined(options.type) && this.type() !== options.type) {\n                            this.points([]);\n                            this.type(options.type);\n                        }\n                        this.dataItem = model;\n                        this._template();\n                        this.redraw(this.options);\n                    } else {\n                        this.options = deepExtend({}, options, this.options);\n                    }\n                }\n            },\n            updateModel: function (syncChanges) {\n                if (this.diagram && this.diagram._isEditable) {\n                    if (this.diagram.connectionsDataSource) {\n                        var model = this.diagram.connectionsDataSource.getByUid(this.dataItem.uid);\n                        if (model) {\n                            this.diagram._suspendModelRefresh();\n                            if (defined(this.options.fromX) && this.options.fromX !== null) {\n                                clearField('from', model);\n                                clearField('fromConnector', model);\n                                model.set('fromX', this.options.fromX);\n                                model.set('fromY', this.options.fromY);\n                            } else {\n                                model.set('from', this.options.from);\n                                if (defined(model.fromConnector)) {\n                                    model.set('fromConnector', this.sourceConnector ? this.sourceConnector.options.name : null);\n                                }\n                                clearField('fromX', model);\n                                clearField('fromY', model);\n                            }\n                            if (defined(this.options.toX) && this.options.toX !== null) {\n                                clearField('to', model);\n                                clearField('toConnector', model);\n                                model.set('toX', this.options.toX);\n                                model.set('toY', this.options.toY);\n                            } else {\n                                model.set('to', this.options.to);\n                                if (defined(model.toConnector)) {\n                                    model.set('toConnector', this.targetConnector ? this.targetConnector.options.name : null);\n                                }\n                                clearField('toX', model);\n                                clearField('toY', model);\n                            }\n                            if (defined(this.options.type) && defined(model.type)) {\n                                model.set('type', this.options.type);\n                            }\n                            this.dataItem = model;\n                            this.diagram._resumeModelRefresh();\n                            if (syncChanges) {\n                                this.diagram._syncConnectionChanges();\n                            }\n                        }\n                    }\n                }\n            },\n            sourcePoint: function () {\n                return this._resolvedSourceConnector ? this._resolvedSourceConnector.position() : this._sourcePoint;\n            },\n            _setSource: function (source) {\n                var shapeSource = source instanceof Shape;\n                var defaultConnector = this.options.fromConnector || AUTO;\n                var dataItem;\n                if (shapeSource && !source.getConnector(defaultConnector)) {\n                    return;\n                }\n                if (source !== undefined) {\n                    this.from = source;\n                }\n                this._removeFromSourceConnector();\n                if (source === null) {\n                    if (this.sourceConnector) {\n                        this._sourcePoint = (this._resolvedSourceConnector || this.sourceConnector).position();\n                        this._clearSourceConnector();\n                        this._setFromOptions(null, this._sourcePoint);\n                    }\n                } else if (source instanceof Connector) {\n                    dataItem = source.shape.dataItem;\n                    if (dataItem) {\n                        this._setFromOptions(dataItem.id);\n                    }\n                    this.sourceConnector = source;\n                    this.sourceConnector.connections.push(this);\n                } else if (source instanceof Point) {\n                    this._setFromOptions(null, source);\n                    this._sourcePoint = source;\n                    if (this.sourceConnector) {\n                        this._clearSourceConnector();\n                    }\n                } else if (shapeSource) {\n                    dataItem = source.dataItem;\n                    if (dataItem) {\n                        this._setFromOptions(dataItem.id);\n                    }\n                    this.sourceConnector = source.getConnector(defaultConnector);\n                    this.sourceConnector.connections.push(this);\n                }\n            },\n            source: function (source, undoable) {\n                if (isDefined(source)) {\n                    if (undoable && this.diagram) {\n                        this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, source));\n                    }\n                    this._setSource(source);\n                    this.refresh();\n                }\n                return this.sourceConnector ? this.sourceConnector : this._sourcePoint;\n            },\n            _setFromOptions: function (from, fromPoint) {\n                this.options.from = from;\n                if (fromPoint) {\n                    this.options.fromX = fromPoint.x;\n                    this.options.fromY = fromPoint.y;\n                } else {\n                    this.options.fromX = null;\n                    this.options.fromY = null;\n                }\n            },\n            sourceDefiner: function (value) {\n                if (value) {\n                    if (value instanceof diagram.PathDefiner) {\n                        value.left = null;\n                        this._sourceDefiner = value;\n                        this.source(value.point);\n                    } else {\n                        throw 'The sourceDefiner needs to be a PathDefiner.';\n                    }\n                } else {\n                    if (!this._sourceDefiner) {\n                        this._sourceDefiner = new diagram.PathDefiner(this.sourcePoint(), null, null);\n                    }\n                    return this._sourceDefiner;\n                }\n            },\n            targetPoint: function () {\n                return this._resolvedTargetConnector ? this._resolvedTargetConnector.position() : this._targetPoint;\n            },\n            _setTarget: function (target) {\n                var shapeTarget = target instanceof Shape;\n                var defaultConnector = this.options.toConnector || AUTO;\n                var dataItem;\n                if (shapeTarget && !target.getConnector(defaultConnector)) {\n                    return;\n                }\n                if (target !== undefined) {\n                    this.to = target;\n                }\n                this._removeFromTargetConnector();\n                if (target === null) {\n                    if (this.targetConnector) {\n                        this._targetPoint = (this._resolvedTargetConnector || this.targetConnector).position();\n                        this._clearTargetConnector();\n                        this._setToOptions(null, this._targetPoint);\n                    }\n                } else if (target instanceof Connector) {\n                    dataItem = target.shape.dataItem;\n                    if (dataItem) {\n                        this._setToOptions(dataItem.id);\n                    }\n                    this.targetConnector = target;\n                    this.targetConnector.connections.push(this);\n                } else if (target instanceof Point) {\n                    this._setToOptions(null, target);\n                    this._targetPoint = target;\n                    if (this.targetConnector) {\n                        this._clearTargetConnector();\n                    }\n                } else if (shapeTarget) {\n                    dataItem = target.dataItem;\n                    if (dataItem) {\n                        this._setToOptions(dataItem.id);\n                    }\n                    this.targetConnector = target.getConnector(defaultConnector);\n                    this.targetConnector.connections.push(this);\n                }\n            },\n            target: function (target, undoable) {\n                if (isDefined(target)) {\n                    if (undoable && this.diagram) {\n                        this.diagram.undoRedoService.addCompositeItem(new diagram.ConnectionEditUnit(this, undefined, target));\n                    }\n                    this._setTarget(target);\n                    this.refresh();\n                }\n                return this.targetConnector ? this.targetConnector : this._targetPoint;\n            },\n            _setToOptions: function (to, toPoint) {\n                this.options.to = to;\n                if (toPoint) {\n                    this.options.toX = toPoint.x;\n                    this.options.toY = toPoint.y;\n                } else {\n                    this.options.toX = null;\n                    this.options.toY = null;\n                }\n            },\n            targetDefiner: function (value) {\n                if (value) {\n                    if (value instanceof diagram.PathDefiner) {\n                        value.right = null;\n                        this._targetDefiner = value;\n                        this.target(value.point);\n                    } else {\n                        throw 'The sourceDefiner needs to be a PathDefiner.';\n                    }\n                } else {\n                    if (!this._targetDefiner) {\n                        this._targetDefiner = new diagram.PathDefiner(this.targetPoint(), null, null);\n                    }\n                    return this._targetDefiner;\n                }\n            },\n            _updateConnectors: function () {\n                this._updateConnector(this.source(), 'source');\n                this._updateConnector(this.target(), 'target');\n            },\n            _updateConnector: function (instance, name) {\n                var that = this;\n                var diagram = that.diagram;\n                if (instance instanceof Connector && !diagram.getShapeById(instance.shape.id)) {\n                    var dataItem = instance.shape.dataItem;\n                    var connectorName = instance.options.name;\n                    var setNewTarget = function () {\n                        var shape = diagram._dataMap[dataItem.id];\n                        instance = shape.getConnector(connectorName);\n                        that[name](instance, false);\n                        that.updateModel();\n                    };\n                    if (diagram._dataMap[dataItem.id]) {\n                        setNewTarget();\n                    } else {\n                        var inactiveItem = diagram._inactiveShapeItems.getByUid(dataItem.uid);\n                        if (inactiveItem) {\n                            diagram._deferredConnectionUpdates.push(inactiveItem.onActivate(setNewTarget));\n                        }\n                    }\n                } else {\n                    that[name](instance, false);\n                }\n            },\n            content: function (content) {\n                var result = this._content(content);\n                if (defined(content)) {\n                    this._alignContent();\n                }\n                return result;\n            },\n            _createContentVisual: function (options) {\n                var visual;\n                if (isFunction(options.visual)) {\n                    visual = options.visual.call(this, options);\n                } else if (options.text) {\n                    visual = new TextBlock(options);\n                }\n                if (visual) {\n                    this._contentVisual = visual;\n                    visual._includeInBBox = false;\n                    this.visual.append(visual);\n                }\n                return visual;\n            },\n            _updateContentVisual: function (options) {\n                if (isFunction(options.visual)) {\n                    this.visual.remove(this._contentVisual);\n                    this._createContentVisual(options);\n                } else {\n                    this._contentVisual.redraw(options);\n                }\n            },\n            _alignContent: function () {\n                if (this._contentVisual) {\n                    var offset = CONNECTION_CONTENT_OFFSET;\n                    var points = this.allPoints();\n                    var endIdx = math.floor(points.length / 2);\n                    var startIdx = endIdx - 1;\n                    while (startIdx > 0 && points[startIdx].equals(points[endIdx])) {\n                        startIdx--;\n                        endIdx++;\n                    }\n                    var endPoint = points[endIdx];\n                    var startPoint = points[startIdx];\n                    var boundingBox = this._contentVisual._measure();\n                    var width = boundingBox.width;\n                    var height = boundingBox.height;\n                    var alignToPath = points.length % 2 === 0;\n                    var distance = startPoint.distanceTo(endPoint);\n                    if (alignToPath && points.length > 2 && distance > 0 && (startPoint.y === endPoint.y && distance < width || startPoint.x === endPoint.x && distance < height)) {\n                        alignToPath = false;\n                        offset = 0;\n                    }\n                    var point;\n                    if (alignToPath) {\n                        var angle = draw.util.deg(math.atan2(endPoint.y - startPoint.y, endPoint.x - startPoint.x));\n                        point = new Point((endPoint.x - startPoint.x) / 2 + startPoint.x, (endPoint.y - startPoint.y) / 2 + startPoint.y);\n                        if (math.abs(angle) === 90) {\n                            point.x += offset;\n                            point.y -= height / 2;\n                        } else if (angle % 180 === 0) {\n                            point.x -= width / 2;\n                            point.y -= height + offset;\n                        } else if (angle < -90 || 0 < angle && angle < 90) {\n                            point.y -= height;\n                        } else if (angle < 0 || angle > 90) {\n                            point.x -= width;\n                            point.y -= height;\n                        }\n                    } else {\n                        var midIdx = math.floor(points.length / 2);\n                        point = points[midIdx].clone();\n                        startPoint = points[midIdx - 1];\n                        endPoint = points[midIdx + 1];\n                        var offsetX = startPoint.x <= point.x && endPoint.x <= point.x ? offset : -boundingBox.width - offset;\n                        var offsetY = startPoint.y <= point.y && endPoint.y <= point.y ? offset : -boundingBox.height - offset;\n                        point.x += offsetX;\n                        point.y += offsetY;\n                    }\n                    this._contentVisual.position(point);\n                }\n            },\n            select: function (value) {\n                var diagram = this.diagram, selected, deselected;\n                if (this._canSelect()) {\n                    if (this.isSelected !== value) {\n                        this.isSelected = value;\n                        selected = [];\n                        deselected = [];\n                        if (this.isSelected) {\n                            this.adorner = new ConnectionEditAdorner(this, this.options.selection);\n                            diagram._adorn(this.adorner, true);\n                            diagram._selectedItems.push(this);\n                            selected.push(this);\n                        } else {\n                            if (this.adorner) {\n                                diagram._adorn(this.adorner, false);\n                                Utils.remove(diagram._selectedItems, this);\n                                this.adorner = undefined;\n                                deselected.push(this);\n                            }\n                        }\n                        if (this.adorner) {\n                            this.adorner.refresh();\n                        }\n                        if (!diagram._internalSelection) {\n                            diagram._selectionChanged(selected, deselected);\n                        }\n                        return true;\n                    }\n                }\n            },\n            bounds: function (value) {\n                if (value && !isString(value)) {\n                    this._bounds = value;\n                } else {\n                    return this._bounds;\n                }\n            },\n            type: function (value) {\n                var options = this.options;\n                if (value) {\n                    if (value !== options.type) {\n                        options.type = value;\n                        this._initRouter();\n                        this.refresh();\n                    }\n                } else {\n                    return options.type;\n                }\n            },\n            _initRouter: function () {\n                var type = (this.options.type || '').toLowerCase();\n                if (type == CASCADING) {\n                    this._router = new CascadingRouter(this);\n                } else {\n                    this._router = new PolylineRouter(this);\n                }\n            },\n            points: function (value) {\n                if (value) {\n                    this.definers = [];\n                    for (var i = 0; i < value.length; i++) {\n                        var definition = value[i];\n                        if (definition instanceof diagram.Point) {\n                            this.definers.push(new diagram.PathDefiner(definition));\n                        } else if (definition.hasOwnProperty('x') && definition.hasOwnProperty('y')) {\n                            this.definers.push(new diagram.PathDefiner(new Point(definition.x, definition.y)));\n                        } else {\n                            throw 'A Connection point needs to be a Point or an object with x and y properties.';\n                        }\n                    }\n                } else {\n                    var pts = [];\n                    if (isDefined(this.definers)) {\n                        for (var k = 0; k < this.definers.length; k++) {\n                            pts.push(this.definers[k].point);\n                        }\n                    }\n                    return pts;\n                }\n            },\n            allPoints: function () {\n                var pts = [this.sourcePoint()];\n                if (this.definers) {\n                    for (var k = 0; k < this.definers.length; k++) {\n                        pts.push(this.definers[k].point);\n                    }\n                }\n                pts.push(this.targetPoint());\n                return pts;\n            },\n            refresh: function () {\n                this._resolveConnectors();\n                this._refreshPath();\n                this._alignContent();\n                if (this.adorner) {\n                    this.adorner.refresh();\n                }\n            },\n            _resolveConnectors: function () {\n                var connection = this, sourcePoint, targetPoint, sourceConnectors, targetConnectors, source = connection.source(), target = connection.target();\n                if (source instanceof Point) {\n                    sourcePoint = source;\n                } else if (source instanceof Connector) {\n                    if (isAutoConnector(source)) {\n                        sourceConnectors = source.shape.connectors;\n                    } else {\n                        sourceConnectors = [source];\n                    }\n                }\n                if (target instanceof Point) {\n                    targetPoint = target;\n                } else if (target instanceof Connector) {\n                    if (isAutoConnector(target)) {\n                        targetConnectors = target.shape.connectors;\n                    } else {\n                        targetConnectors = [target];\n                    }\n                }\n                if (sourcePoint) {\n                    if (targetConnectors) {\n                        connection._resolvedTargetConnector = closestConnector(sourcePoint, targetConnectors);\n                    }\n                } else if (sourceConnectors) {\n                    if (targetPoint) {\n                        connection._resolvedSourceConnector = closestConnector(targetPoint, sourceConnectors);\n                    } else if (targetConnectors) {\n                        this._resolveAutoConnectors(sourceConnectors, targetConnectors);\n                    }\n                }\n            },\n            _resolveAutoConnectors: function (sourceConnectors, targetConnectors) {\n                var minNonConflict = MAXINT;\n                var minDist = MAXINT;\n                var minNonConflictSource, minNonConflictTarget;\n                var sourcePoint, targetPoint;\n                var minSource, minTarget;\n                var sourceConnector, targetConnector;\n                var sourceIdx, targetIdx;\n                var dist;\n                for (sourceIdx = 0; sourceIdx < sourceConnectors.length; sourceIdx++) {\n                    sourceConnector = sourceConnectors[sourceIdx];\n                    if (!isAutoConnector(sourceConnector)) {\n                        sourcePoint = sourceConnector.position();\n                        for (targetIdx = 0; targetIdx < targetConnectors.length; targetIdx++) {\n                            targetConnector = targetConnectors[targetIdx];\n                            if (!isAutoConnector(targetConnector)) {\n                                targetPoint = targetConnector.position();\n                                dist = math.round(sourcePoint.distanceTo(targetPoint));\n                                if (dist < minNonConflict && this.diagram && this._testRoutePoints(sourcePoint, targetPoint, sourceConnector, targetConnector)) {\n                                    minNonConflict = dist;\n                                    minNonConflictSource = sourceConnector;\n                                    minNonConflictTarget = targetConnector;\n                                }\n                                if (dist < minDist) {\n                                    minSource = sourceConnector;\n                                    minTarget = targetConnector;\n                                    minDist = dist;\n                                }\n                            }\n                        }\n                    }\n                }\n                if (minNonConflictSource) {\n                    minSource = minNonConflictSource;\n                    minTarget = minNonConflictTarget;\n                }\n                this._resolvedSourceConnector = minSource;\n                this._resolvedTargetConnector = minTarget;\n            },\n            _testRoutePoints: function (sourcePoint, targetPoint, sourceConnector, targetConnector) {\n                var router = this._router;\n                var passRoute = true;\n                if (router instanceof CascadingRouter) {\n                    var points = router.routePoints(sourcePoint, targetPoint, sourceConnector, targetConnector), start, end, rect, exclude;\n                    exclude = this._getRouteExclude(sourcePoint, targetPoint, sourceConnector.shape, targetConnector.shape);\n                    points.unshift(sourcePoint);\n                    points.push(targetPoint);\n                    for (var idx = 1; idx < points.length; idx++) {\n                        start = points[idx - 1];\n                        end = points[idx];\n                        rect = new Rect(math.min(start.x, end.x), math.min(start.y, end.y), math.abs(start.x - end.x), math.abs(start.y - end.y));\n                        if (rect.width > 0) {\n                            rect.x++;\n                            rect.width -= 2;\n                        }\n                        if (rect.height > 0) {\n                            rect.y++;\n                            rect.height -= 2;\n                        }\n                        if (!rect.isEmpty() && this.diagram._shapesQuadTree.hitTestRect(rect, exclude)) {\n                            passRoute = false;\n                            break;\n                        }\n                    }\n                }\n                return passRoute;\n            },\n            _getRouteExclude: function (sourcePoint, targetPoint, sourceShape, targetShape) {\n                var exclude = [];\n                if (this._isPointInsideShape(sourcePoint, sourceShape)) {\n                    exclude.push(sourceShape);\n                }\n                if (this._isPointInsideShape(targetPoint, targetShape)) {\n                    exclude.push(targetShape);\n                }\n                return exclude;\n            },\n            _isPointInsideShape: function (point, shape) {\n                var bounds = shape.bounds(), rotatedPoint, angle = shape.rotate().angle, pointX, pointY, boundsX = bounds.x, boundsY = bounds.y;\n                rotatedPoint = point.clone().rotate(bounds.center(), angle);\n                pointX = rotatedPoint.x;\n                pointY = rotatedPoint.y;\n                return pointX > boundsX && pointX < boundsX + bounds.width && pointY > boundsY && pointY < boundsY + bounds.height;\n            },\n            redraw: function (options) {\n                if (options) {\n                    this.options = deepExtend({}, this.options, options);\n                    var points = this.options.points;\n                    if (defined(points) && points.length > 0) {\n                        this.points(points);\n                        this._refreshPath();\n                    }\n                    if (options && options.content || options.text) {\n                        this.content(options.content);\n                    }\n                    this.path.redraw({\n                        fill: options.fill,\n                        stroke: options.stroke,\n                        startCap: options.startCap,\n                        endCap: options.endCap\n                    });\n                }\n            },\n            clone: function () {\n                var json = this.serialize();\n                if (this.diagram && this.diagram._isEditable && defined(this.dataItem)) {\n                    json.options.dataItem = cloneDataItem(this.dataItem);\n                }\n                return new Connection(this.from, this.to, json.options);\n            },\n            serialize: function () {\n                var from = this.from.toJSON ? this.from.toJSON : this.from.toString(), to = this.to.toJSON ? this.to.toJSON : this.to.toString();\n                var json = deepExtend({}, {\n                    options: this.options,\n                    from: from,\n                    to: to\n                });\n                if (defined(this.dataItem)) {\n                    json.dataItem = this.dataItem.toString();\n                }\n                json.options.points = this.points();\n                return json;\n            },\n            _hitTest: function (value) {\n                if (this.visible()) {\n                    var p = new Point(value.x, value.y), from = this.sourcePoint(), to = this.targetPoint();\n                    if (value.isEmpty && !value.isEmpty() && value.contains(from) && value.contains(to)) {\n                        return this;\n                    }\n                    if (this._router.hitTest(p)) {\n                        return this;\n                    }\n                }\n            },\n            _hover: function (value) {\n                var color = (this.options.stroke || {}).color;\n                if (value && isDefined(this.options.hover.stroke.color)) {\n                    color = this.options.hover.stroke.color;\n                }\n                this.path.redraw({ stroke: { color: color } });\n            },\n            _refreshPath: function () {\n                if (!defined(this.path)) {\n                    return;\n                }\n                this._drawPath();\n                this.bounds(this._router.getBounds());\n            },\n            _drawPath: function () {\n                if (this._router) {\n                    this._router.route();\n                }\n                var source = this.sourcePoint();\n                var target = this.targetPoint();\n                var points = this.points();\n                this.path.redraw({ points: [source].concat(points, [target]) });\n            },\n            _clearSourceConnector: function () {\n                this.sourceConnector = undefined;\n                this._resolvedSourceConnector = undefined;\n            },\n            _clearTargetConnector: function () {\n                this.targetConnector = undefined;\n                this._resolvedTargetConnector = undefined;\n            },\n            _removeFromSourceConnector: function () {\n                if (this.sourceConnector) {\n                    Utils.remove(this.sourceConnector.connections, this);\n                }\n            },\n            _removeFromTargetConnector: function () {\n                if (this.targetConnector) {\n                    Utils.remove(this.targetConnector.connections, this);\n                }\n            },\n            toJSON: function () {\n                var connection = this;\n                var from, to, point;\n                if (connection.from && connection.from.toJSON) {\n                    from = connection.from.toJSON();\n                } else {\n                    point = connection._sourcePoint;\n                    from = {\n                        x: point.x,\n                        y: point.y\n                    };\n                }\n                if (connection.to && connection.to.toJSON) {\n                    to = connection.to.toJSON();\n                } else {\n                    point = connection._targetPoint;\n                    to = {\n                        x: point.x,\n                        y: point.y\n                    };\n                }\n                return {\n                    from: from,\n                    to: to\n                };\n            }\n        });\n        var Diagram = Widget.extend({\n            init: function (element, userOptions) {\n                var that = this;\n                kendo.destroy(element);\n                Widget.fn.init.call(that, element, userOptions);\n                that._initTheme();\n                that._initElements();\n                that._extendLayoutOptions(that.options);\n                that._initDefaults(userOptions);\n                that._interactionDefaults();\n                that._initCanvas();\n                that.mainLayer = new Group({ id: 'main-layer' });\n                that.canvas.append(that.mainLayer);\n                that._shapesQuadTree = new ShapesQuadTree(that);\n                that._pan = new Point();\n                that._adorners = [];\n                that.adornerLayer = new Group({ id: 'adorner-layer' });\n                that.canvas.append(that.adornerLayer);\n                that._createHandlers();\n                that._initialize();\n                that._resizingAdorner = new ResizingAdorner(that, { editable: that.options.editable });\n                that._connectorsAdorner = new ConnectorsAdorner(that);\n                that._adorn(that._resizingAdorner, true);\n                that._adorn(that._connectorsAdorner, true);\n                that.selector = new Selector(that);\n                that._clipboard = [];\n                that.pauseMouseHandlers = false;\n                that._fetchFreshData();\n                that._createGlobalToolBar();\n                that._createOptionElements();\n                that.zoom(that.options.zoom);\n                that.canvas.draw();\n            },\n            options: {\n                name: 'Diagram',\n                theme: 'default',\n                layout: '',\n                zoomRate: 0.1,\n                zoom: 1,\n                zoomMin: 0,\n                zoomMax: 2,\n                dataSource: {},\n                draggable: true,\n                template: '',\n                autoBind: true,\n                editable: {\n                    rotate: {},\n                    resize: {},\n                    text: true,\n                    tools: [],\n                    drag: {\n                        snap: {\n                            size: 10,\n                            angle: 10\n                        }\n                    },\n                    remove: true\n                },\n                pannable: {},\n                selectable: { key: 'none' },\n                tooltip: {\n                    enabled: true,\n                    format: '{0}'\n                },\n                copy: {\n                    enabled: true,\n                    offsetX: 20,\n                    offsetY: 20\n                },\n                shapeDefaults: diagram.shapeDefaults({ undoable: true }),\n                connectionDefaults: {\n                    editable: { tools: [] },\n                    type: CASCADING\n                },\n                shapes: [],\n                connections: []\n            },\n            events: [\n                ZOOM_END,\n                ZOOM_START,\n                PAN,\n                SELECT,\n                ITEMROTATE,\n                ITEMBOUNDSCHANGE,\n                CHANGE,\n                CLICK,\n                MOUSE_ENTER,\n                MOUSE_LEAVE,\n                'toolBarClick',\n                'save',\n                'cancel',\n                'edit',\n                'remove',\n                'add',\n                'dataBound',\n                DRAG_START,\n                DRAG,\n                DRAG_END\n            ],\n            items: function () {\n                return $();\n            },\n            _createGlobalToolBar: function () {\n                var editable = this.options.editable;\n                if (editable) {\n                    var tools = editable.tools;\n                    if (this._isEditable && tools !== false && (!tools || tools.length === 0)) {\n                        tools = [\n                            'createShape',\n                            'undo',\n                            'redo',\n                            'rotateClockwise',\n                            'rotateAnticlockwise'\n                        ];\n                    }\n                    if (tools && tools.length) {\n                        this.toolBar = new DiagramToolBar(this, {\n                            tools: tools || {},\n                            click: proxy(this._toolBarClick, this),\n                            modal: false\n                        });\n                        this.toolBar.element.css({ textAlign: 'left' });\n                        this.element.prepend(this.toolBar.element);\n                        this._resize();\n                    }\n                }\n            },\n            createShape: function () {\n                if (this.editor && this.editor.end() || !this.editor) {\n                    var dataSource = this.dataSource;\n                    var view = dataSource.view() || [];\n                    var index = view.length;\n                    var model = createModel(dataSource, {});\n                    var shape = this._createShape(model, {});\n                    if (!this.trigger('add', { shape: shape })) {\n                        dataSource.insert(index, model);\n                        var inactiveItem = this._inactiveShapeItems.getByUid(model.uid);\n                        inactiveItem.element = shape;\n                        this.edit(shape);\n                    }\n                }\n            },\n            _createShape: function (dataItem, options) {\n                options = deepExtend({}, this.options.shapeDefaults, options);\n                options.dataItem = dataItem;\n                var shape = new Shape(options, this);\n                return shape;\n            },\n            createConnection: function () {\n                if (this.editor && this.editor.end() || !this.editor) {\n                    var connectionsDataSource = this.connectionsDataSource;\n                    var view = connectionsDataSource.view() || [];\n                    var index = view.length;\n                    var model = createModel(connectionsDataSource, {});\n                    var connection = this._createConnection(model);\n                    if (!this.trigger('add', { connection: connection })) {\n                        this._connectionsDataMap[model.uid] = connection;\n                        connectionsDataSource.insert(index, model);\n                        this.addConnection(connection, false);\n                        this.edit(connection);\n                    }\n                }\n            },\n            _createConnection: function (dataItem, source, target) {\n                var options = deepExtend({}, this.options.connectionDefaults);\n                options.dataItem = dataItem;\n                var connection = new Connection(source || new Point(), target || new Point(), options);\n                return connection;\n            },\n            editModel: function (dataItem, editorType) {\n                this.cancelEdit();\n                var editors, template;\n                var editable = this.options.editable;\n                if (editorType == 'shape') {\n                    editors = editable.shapeEditors;\n                    template = editable.shapeTemplate;\n                } else if (editorType == 'connection') {\n                    var connectionSelectorHandler = proxy(connectionSelector, this);\n                    editors = deepExtend({}, {\n                        from: connectionSelectorHandler,\n                        to: connectionSelectorHandler\n                    }, editable.connectionEditors);\n                    template = editable.connectionTemplate;\n                } else {\n                    return;\n                }\n                this.editor = new PopupEditor(this.element, {\n                    update: proxy(this._update, this),\n                    cancel: proxy(this._cancel, this),\n                    model: dataItem,\n                    type: editorType,\n                    target: this,\n                    editors: editors,\n                    template: template\n                });\n                this.trigger('edit', this._editArgs());\n            },\n            edit: function (item) {\n                if (item.dataItem) {\n                    var editorType = item instanceof Shape ? 'shape' : 'connection';\n                    this.editModel(item.dataItem, editorType);\n                }\n            },\n            cancelEdit: function () {\n                if (this.editor) {\n                    this._getEditDataSource().cancelChanges(this.editor.model);\n                    this._destroyEditor();\n                }\n            },\n            saveEdit: function () {\n                if (this.editor && this.editor.end() && !this.trigger('save', this._editArgs())) {\n                    this._getEditDataSource().sync();\n                }\n            },\n            _update: function () {\n                if (this.editor && this.editor.end() && !this.trigger('save', this._editArgs())) {\n                    this._getEditDataSource().sync();\n                    this._destroyEditor();\n                }\n            },\n            _cancel: function () {\n                if (this.editor && !this.trigger('cancel', this._editArgs())) {\n                    var model = this.editor.model;\n                    this._getEditDataSource().cancelChanges(model);\n                    var element = this._connectionsDataMap[model.uid] || this._dataMap[model.id];\n                    if (element) {\n                        element._setOptionsFromModel(model);\n                    }\n                    this._destroyEditor();\n                }\n            },\n            _getEditDataSource: function () {\n                return this.editor.options.type === 'shape' ? this.dataSource : this.connectionsDataSource;\n            },\n            _editArgs: function () {\n                var result = { container: this.editor.wrapper };\n                result[this.editor.options.type] = this.editor.model;\n                return result;\n            },\n            _destroyEditor: function () {\n                if (this.editor) {\n                    this.editor.close();\n                    this.editor = null;\n                }\n            },\n            _initElements: function () {\n                this.wrapper = this.element.empty().css('position', 'relative').attr('tabindex', 0).addClass('k-widget k-diagram');\n                this.scrollable = $('<div />').appendTo(this.element);\n            },\n            _initDefaults: function (userOptions) {\n                var options = this.options;\n                var editable = options.editable;\n                var shapeDefaults = options.shapeDefaults;\n                var connectionDefaults = options.connectionDefaults;\n                var userShapeDefaults = (userOptions || {}).shapeDefaults;\n                if (editable === false) {\n                    shapeDefaults.editable = false;\n                    connectionDefaults.editable = false;\n                } else {\n                    copyDefaultOptions(editable, shapeDefaults.editable, [\n                        'drag',\n                        'remove',\n                        'connect'\n                    ]);\n                    copyDefaultOptions(editable, connectionDefaults.editable, [\n                        'drag',\n                        'remove'\n                    ]);\n                }\n                if (userShapeDefaults && userShapeDefaults.connectors) {\n                    options.shapeDefaults.connectors = userShapeDefaults.connectors;\n                }\n            },\n            _interactionDefaults: function () {\n                var options = this.options;\n                var selectable = options.selectable;\n                var pannable = options.pannable;\n                var mobile = kendo.support.mobileOS;\n                if (selectable && !defined(selectable.multiple)) {\n                    options.selectable = deepExtend({ multiple: mobile ? false : true }, options.selectable);\n                }\n                if (pannable && !defined(pannable.key)) {\n                    options.pannable = deepExtend({ key: mobile ? 'none' : 'ctrl' }, options.pannable);\n                }\n            },\n            _initCanvas: function () {\n                var canvasContainer = $('<div class=\\'k-layer\\'></div>').appendTo(this.scrollable)[0];\n                var viewPort = this.viewport();\n                this.canvas = new Canvas(canvasContainer, {\n                    width: viewPort.width || DEFAULT_CANVAS_WIDTH,\n                    height: viewPort.height || DEFAULT_CANVAS_HEIGHT\n                });\n            },\n            _createHandlers: function () {\n                var that = this;\n                var element = that.element;\n                element.on(MOUSEWHEEL_NS, proxy(that._wheel, that)).on('keydown' + NS, proxy(that._keydown, that));\n                that._userEvents = new kendo.UserEvents(this.scrollable, {\n                    multiTouch: true,\n                    fastTap: true,\n                    tap: proxy(that._tap, that),\n                    start: proxy(that._dragStart, that),\n                    move: proxy(that._drag, that),\n                    end: proxy(that._dragEnd, that),\n                    gesturestart: proxy(that._gestureStart, that),\n                    gesturechange: proxy(that._gestureChange, that),\n                    gestureend: proxy(that._gestureEnd, that),\n                    doubleTap: proxy(that._doubleTap, that),\n                    supportDoubleTap: true\n                });\n                that.toolService = new ToolService(that);\n                this.scrollable.on('mouseover' + NS, proxy(that._mouseover, that)).on('mouseout' + NS, proxy(that._mouseout, that)).on('mousemove' + NS, proxy(that._mouseMove, that)).on('mousedown' + NS, proxy(that._mouseDown, that)).on('mouseup' + NS, proxy(that._mouseUp, that));\n                this._syncHandler = proxy(that._syncChanges, that);\n                that._resizeHandler = proxy(that.resize, that, false);\n                kendo.onResize(that._resizeHandler);\n                this.bind(ZOOM_START, proxy(that._destroyToolBar, that));\n                this.bind(PAN, proxy(that._destroyToolBar, that));\n            },\n            _dragStart: function (e) {\n                this._pauseMouseHandlers = true;\n                var point = this._eventPositions(e, true);\n                var event = e.event;\n                if (this.toolService.start(point, this._meta(event))) {\n                    this._destroyToolBar();\n                    event.preventDefault();\n                }\n            },\n            _drag: function (e) {\n                var p = this._eventPositions(e);\n                var event = e.event;\n                if (this.toolService.move(p, this._meta(event))) {\n                    event.preventDefault();\n                }\n            },\n            _dragEnd: function (e) {\n                this._pauseMouseHandlers = false;\n                var p = this._eventPositions(e);\n                var event = e.event;\n                if (this.toolService.end(p, this._meta(event))) {\n                    this._createToolBar();\n                    event.preventDefault();\n                }\n            },\n            _mouseMove: function (e) {\n                if (!this._pauseMouseHandlers) {\n                    var p = this._eventPositions(e);\n                    this.toolService._updateHoveredItem(p);\n                    this.toolService._updateCursor(p);\n                }\n            },\n            _mouseDown: function () {\n                this._pauseMouseHandlers = true;\n            },\n            _mouseUp: function () {\n                this._pauseMouseHandlers = false;\n            },\n            _tap: function (e) {\n                var toolService = this.toolService;\n                var selectable = this.options.selectable;\n                var point = this._eventPositions(e);\n                var focused = this.focus();\n                toolService._updateHoveredItem(point);\n                if (toolService.hoveredItem) {\n                    var item = toolService.hoveredItem;\n                    this.trigger('click', {\n                        item: item,\n                        point: point\n                    });\n                    if (selectable && item.options.selectable !== false) {\n                        var multiple = selectable.multiple !== false;\n                        var ctrlPressed = kendo.support.mobileOS || this._meta(e.event).ctrlKey;\n                        if (item.isSelected) {\n                            if (ctrlPressed) {\n                                this._destroyToolBar();\n                                item.select(false);\n                            } else {\n                                this._createToolBar(focused);\n                            }\n                        } else {\n                            this._destroyToolBar();\n                            this.select(item, { addToSelection: multiple && ctrlPressed });\n                            this._createToolBar(focused);\n                        }\n                    }\n                } else if (selectable) {\n                    this._destroyToolBar();\n                    this.deselect();\n                }\n            },\n            _keydown: function (e) {\n                if (this.toolService.keyDown(e.keyCode, this._meta(e))) {\n                    e.preventDefault();\n                }\n            },\n            _wheel: function (e) {\n                var delta = mwDelta(e), p = this._eventPositions(e), meta = deepExtend(this._meta(e), { delta: delta });\n                if (this.toolService.wheel(p, meta)) {\n                    e.preventDefault();\n                }\n            },\n            _meta: function (e) {\n                return {\n                    ctrlKey: e.ctrlKey,\n                    metaKey: e.metaKey,\n                    altKey: e.altKey,\n                    shiftKey: e.shiftKey,\n                    type: e.type\n                };\n            },\n            _eventPositions: function (e, start) {\n                var point;\n                if (e.touch) {\n                    var field = start ? 'startLocation' : 'location';\n                    point = new Point(e.x[field], e.y[field]);\n                } else {\n                    var event = e.originalEvent;\n                    point = new Point(event.pageX, event.pageY);\n                }\n                return this.documentToModel(point);\n            },\n            _gestureStart: function (e) {\n                this._destroyToolBar();\n                this.scroller.disable();\n                var initialCenter = this.documentToModel(new Point(e.center.x, e.center.y));\n                var eventArgs = {\n                    point: initialCenter,\n                    zoom: this.zoom()\n                };\n                if (this.trigger(ZOOM_START, eventArgs)) {\n                    return;\n                }\n                this._gesture = e;\n                this._initialCenter = initialCenter;\n            },\n            _gestureChange: function (e) {\n                var previousGesture = this._gesture;\n                var initialCenter = this._initialCenter;\n                var center = this.documentToView(new Point(e.center.x, e.center.y));\n                var scaleDelta = e.distance / previousGesture.distance;\n                var zoom = this._zoom;\n                var updateZoom = false;\n                if (math.abs(scaleDelta - 1) >= MOBILE_ZOOM_RATE) {\n                    this._zoom = zoom = this._getValidZoom(zoom * scaleDelta);\n                    this.options.zoom = zoom;\n                    this._gesture = e;\n                    updateZoom = true;\n                }\n                var zoomedPoint = initialCenter.times(zoom);\n                var pan = center.minus(zoomedPoint);\n                if (updateZoom || this._pan.distanceTo(pan) >= MOBILE_PAN_DISTANCE) {\n                    this._panTransform(pan);\n                    this._updateAdorners();\n                }\n                e.preventDefault();\n            },\n            _doubleTap: function (e) {\n                var diagram = this;\n                var pointPosition = this._eventPositions(e);\n                var options = diagram.options;\n                var zoomRate = options.zoomRate;\n                var zoom = diagram.zoom() + zoomRate;\n                var meta = this._meta(e);\n                var zoomOptions = {\n                    point: pointPosition,\n                    meta: meta,\n                    zoom: zoom\n                };\n                if (diagram.trigger(ZOOM_START, zoomOptions)) {\n                    return;\n                }\n                zoom = kendo.dataviz.round(Math.max(options.zoomMin, Math.min(options.zoomMax, zoom)), 2);\n                zoomOptions.zoom = zoom;\n                diagram.zoom(zoom, zoomOptions);\n                diagram.trigger(ZOOM_END, zoomOptions);\n            },\n            _gestureEnd: function () {\n                if (this.options.pannable !== false) {\n                    this.scroller.enable();\n                }\n                this.trigger(ZOOM_END, {\n                    point: this._initialCenter,\n                    zoom: this.zoom()\n                });\n            },\n            _resize: function () {\n                var viewport = this.viewport();\n                if (this.canvas) {\n                    this.canvas.size(viewport);\n                }\n                if (this.scrollable && this.toolBar) {\n                    this.scrollable.height(viewport.height);\n                }\n            },\n            _mouseover: function (e) {\n                var node = e.target._kendoNode;\n                if (node && node.srcElement._hover) {\n                    node.srcElement._hover(true, node.srcElement);\n                }\n            },\n            _mouseout: function (e) {\n                var node = e.target._kendoNode;\n                if (node && node.srcElement._hover) {\n                    node.srcElement._hover(false, node.srcElement);\n                }\n            },\n            _initTheme: function () {\n                var that = this;\n                var themeName = ((that.options || {}).theme || '').toLowerCase();\n                var themes = dataviz.ui.themes || {};\n                var themeOptions;\n                if (dataviz.SASS_THEMES.indexOf(themeName) != -1) {\n                    themeOptions = dataviz.autoTheme().diagram;\n                } else {\n                    themeOptions = (themes[themeName] || {}).diagram;\n                }\n                that.options = deepExtend({}, themeOptions, that.options);\n                if (that.options.editable === true) {\n                    deepExtend(that.options, { editable: (themeOptions || {}).editable });\n                }\n            },\n            _createOptionElements: function () {\n                var options = this.options;\n                var shapesLength = options.shapes.length;\n                if (shapesLength) {\n                    this._createShapes();\n                }\n                if (options.connections.length) {\n                    this._createConnections();\n                }\n                if (shapesLength && options.layout) {\n                    this.layout(options.layout);\n                }\n            },\n            _createShapes: function () {\n                var that = this, options = that.options, shapes = options.shapes, shape, i;\n                for (i = 0; i < shapes.length; i++) {\n                    shape = shapes[i];\n                    that.addShape(shape);\n                }\n            },\n            _createConnections: function () {\n                var diagram = this, options = diagram.options, defaults = options.connectionDefaults, connections = options.connections, conn, source, target, i;\n                for (i = 0; i < connections.length; i++) {\n                    conn = connections[i];\n                    source = diagram._findConnectionTarget(conn.from);\n                    target = diagram._findConnectionTarget(conn.to);\n                    diagram.connect(source, target, deepExtend({}, defaults, conn));\n                }\n            },\n            _findConnectionTarget: function (options) {\n                options = options || {};\n                var diagram = this;\n                var shapeId = isString(options) ? options : options.shapeId || options.id;\n                var target;\n                if (shapeId) {\n                    target = diagram.getShapeById(shapeId);\n                    if (options.connector) {\n                        target = target.getConnector(options.connector);\n                    }\n                } else {\n                    target = new Point(options.x || 0, options.y || 0);\n                }\n                return target;\n            },\n            destroy: function () {\n                var that = this;\n                Widget.fn.destroy.call(that);\n                if (this._userEvents) {\n                    this._userEvents.destroy();\n                }\n                kendo.unbindResize(that._resizeHandler);\n                that.clear();\n                that.element.off(NS);\n                that.scroller.wrapper.off(NS);\n                that.canvas.destroy(true);\n                that.canvas = undefined;\n                that._destroyEditor();\n                that.destroyScroller();\n                that._destroyGlobalToolBar();\n                that._destroyToolBar();\n            },\n            destroyScroller: function () {\n                var scroller = this.scroller;\n                if (!scroller) {\n                    return;\n                }\n                scroller.destroy();\n                scroller.element.remove();\n                this.scroller = null;\n            },\n            save: function () {\n                var json = {\n                    shapes: [],\n                    connections: []\n                };\n                var i, connection, shape;\n                for (i = 0; i < this.shapes.length; i++) {\n                    shape = this.shapes[i];\n                    if (shape.options.serializable) {\n                        json.shapes.push(shape.options);\n                    }\n                }\n                for (i = 0; i < this.connections.length; i++) {\n                    connection = this.connections[i];\n                    json.connections.push(deepExtend({}, connection.options, connection.toJSON()));\n                }\n                return json;\n            },\n            focus: function () {\n                if (!this.element.is(kendo._activeElement())) {\n                    var element = this.element, scrollContainer = element[0], containers = [], offsets = [], documentElement = document.documentElement, i;\n                    do {\n                        scrollContainer = scrollContainer.parentNode;\n                        if (scrollContainer.scrollHeight > scrollContainer.clientHeight) {\n                            containers.push(scrollContainer);\n                            offsets.push(scrollContainer.scrollTop);\n                        }\n                    } while (scrollContainer != documentElement);\n                    element.focus();\n                    for (i = 0; i < containers.length; i++) {\n                        containers[i].scrollTop = offsets[i];\n                    }\n                    return true;\n                }\n            },\n            load: function (options) {\n                this.clear();\n                this.setOptions(options);\n                this._createShapes();\n                this._createConnections();\n            },\n            setOptions: function (options) {\n                deepExtend(this.options, options);\n            },\n            clear: function () {\n                var that = this;\n                that.select(false);\n                that.mainLayer.clear();\n                that._shapesQuadTree.clear();\n                that._initialize();\n            },\n            connect: function (source, target, options) {\n                var connection;\n                if (this.connectionsDataSource && this._isEditable) {\n                    var dataItem = this.connectionsDataSource.add({});\n                    connection = this._connectionsDataMap[dataItem.uid];\n                    connection.source(source);\n                    connection.target(target);\n                    connection.redraw(options);\n                    connection.updateModel();\n                } else {\n                    connection = new Connection(source, target, deepExtend({}, this.options.connectionDefaults, options));\n                    this.addConnection(connection);\n                }\n                return connection;\n            },\n            connected: function (source, target) {\n                for (var i = 0; i < this.connections.length; i++) {\n                    var c = this.connections[i];\n                    if (c.from == source && c.to == target) {\n                        return true;\n                    }\n                }\n                return false;\n            },\n            addConnection: function (connection, undoable) {\n                if (undoable !== false) {\n                    this.undoRedoService.add(new diagram.AddConnectionUnit(connection, this), false);\n                }\n                connection.diagram = this;\n                connection._setOptionsFromModel();\n                connection.refresh();\n                this.mainLayer.append(connection.visual);\n                this.connections.push(connection);\n                this.trigger(CHANGE, {\n                    added: [connection],\n                    removed: []\n                });\n                return connection;\n            },\n            _addConnection: function (connection, undoable) {\n                var connectionsDataSource = this.connectionsDataSource;\n                var dataItem;\n                if (connectionsDataSource && this._isEditable) {\n                    dataItem = createModel(connectionsDataSource, cloneDataItem(connection.dataItem));\n                    connection.dataItem = dataItem;\n                    connection.updateModel();\n                    if (!this.trigger('add', { connection: connection })) {\n                        this._connectionsDataMap[dataItem.uid] = connection;\n                        connectionsDataSource.add(dataItem);\n                        this.addConnection(connection, undoable);\n                        connection._updateConnectors();\n                        return connection;\n                    }\n                } else if (!this.trigger('add', { connection: connection })) {\n                    this.addConnection(connection, undoable);\n                    connection._updateConnectors();\n                    return connection;\n                }\n            },\n            addShape: function (item, undoable) {\n                var shape, shapeDefaults = this.options.shapeDefaults;\n                if (item instanceof Shape) {\n                    shape = item;\n                } else if (!(item instanceof kendo.Class)) {\n                    shapeDefaults = deepExtend({}, shapeDefaults, item || {});\n                    shape = new Shape(shapeDefaults, this);\n                } else {\n                    return;\n                }\n                if (undoable !== false) {\n                    this.undoRedoService.add(new diagram.AddShapeUnit(shape, this), false);\n                }\n                this.shapes.push(shape);\n                if (shape.diagram !== this) {\n                    this._shapesQuadTree.insert(shape);\n                    shape.diagram = this;\n                }\n                this.mainLayer.append(shape.visual);\n                this.trigger(CHANGE, {\n                    added: [shape],\n                    removed: []\n                });\n                return shape;\n            },\n            _addShape: function (shape, undoable) {\n                var that = this;\n                var dataSource = that.dataSource;\n                var dataItem;\n                if (dataSource && this._isEditable) {\n                    dataItem = createModel(dataSource, cloneDataItem(shape.dataItem));\n                    shape.dataItem = dataItem;\n                    shape.updateModel();\n                    if (!this.trigger('add', { shape: shape })) {\n                        this.dataSource.add(dataItem);\n                        var inactiveItem = this._inactiveShapeItems.getByUid(dataItem.uid);\n                        inactiveItem.element = shape;\n                        inactiveItem.undoable = undoable;\n                        return shape;\n                    }\n                } else if (!this.trigger('add', { shape: shape })) {\n                    return this.addShape(shape, undoable);\n                }\n            },\n            remove: function (items, undoable) {\n                items = isArray(items) ? items.slice(0) : [items];\n                var elements = splitDiagramElements(items);\n                var shapes = elements.shapes;\n                var connections = elements.connections;\n                var i;\n                if (!defined(undoable)) {\n                    undoable = true;\n                }\n                if (undoable) {\n                    this.undoRedoService.begin();\n                }\n                this._suspendModelRefresh();\n                for (i = shapes.length - 1; i >= 0; i--) {\n                    this._removeItem(shapes[i], undoable, connections);\n                }\n                for (i = connections.length - 1; i >= 0; i--) {\n                    this._removeItem(connections[i], undoable);\n                }\n                this._resumeModelRefresh();\n                if (undoable) {\n                    this.undoRedoService.commit(false);\n                }\n                this.trigger(CHANGE, {\n                    added: [],\n                    removed: items\n                });\n            },\n            _removeShapeDataItem: function (item) {\n                if (this._isEditable) {\n                    this.dataSource.remove(item.dataItem);\n                    delete this._dataMap[item.dataItem.id];\n                }\n            },\n            _removeConnectionDataItem: function (item) {\n                if (this._isEditable) {\n                    this.connectionsDataSource.remove(item.dataItem);\n                    delete this._connectionsDataMap[item.dataItem.uid];\n                }\n            },\n            _triggerRemove: function (items) {\n                var toRemove = [];\n                var item, args, editable;\n                for (var idx = 0; idx < items.length; idx++) {\n                    item = items[idx];\n                    editable = item.options.editable;\n                    if (item instanceof Shape) {\n                        args = { shape: item };\n                    } else {\n                        args = { connection: item };\n                    }\n                    if (editable && editable.remove !== false && !this.trigger('remove', args)) {\n                        toRemove.push(item);\n                    }\n                }\n                return toRemove;\n            },\n            undo: function () {\n                this.undoRedoService.undo();\n            },\n            redo: function () {\n                this.undoRedoService.redo();\n            },\n            select: function (item, options) {\n                if (isDefined(item)) {\n                    options = deepExtend({ addToSelection: false }, options);\n                    var addToSelection = options.addToSelection, items = [], selected = [], i, element;\n                    if (!addToSelection) {\n                        this.deselect();\n                    }\n                    this._internalSelection = true;\n                    if (item instanceof Array) {\n                        items = item;\n                    } else if (item instanceof DiagramElement) {\n                        items = [item];\n                    }\n                    for (i = 0; i < items.length; i++) {\n                        element = items[i];\n                        if (element.select(true)) {\n                            selected.push(element);\n                        }\n                    }\n                    this._selectionChanged(selected, []);\n                    this._internalSelection = false;\n                } else {\n                    return this._selectedItems;\n                }\n            },\n            selectAll: function () {\n                this.select(this.shapes.concat(this.connections));\n            },\n            selectArea: function (rect) {\n                var i, items, item;\n                this._internalSelection = true;\n                var selected = [];\n                if (rect instanceof Rect) {\n                    items = this.shapes.concat(this.connections);\n                    for (i = 0; i < items.length; i++) {\n                        item = items[i];\n                        if ((!rect || item._hitTest(rect)) && item.options.enable) {\n                            if (item.select(true)) {\n                                selected.push(item);\n                            }\n                        }\n                    }\n                }\n                this._selectionChanged(selected, []);\n                this._internalSelection = false;\n            },\n            deselect: function (item) {\n                this._internalSelection = true;\n                var deselected = [], items = [], element, i;\n                if (item instanceof Array) {\n                    items = item;\n                } else if (item instanceof DiagramElement) {\n                    items.push(item);\n                } else if (!isDefined(item)) {\n                    items = this._selectedItems.slice(0);\n                }\n                for (i = 0; i < items.length; i++) {\n                    element = items[i];\n                    if (element.select(false)) {\n                        deselected.push(element);\n                    }\n                }\n                this._selectionChanged([], deselected);\n                this._internalSelection = false;\n            },\n            toFront: function (items, undoable) {\n                if (!items) {\n                    items = this._selectedItems.slice();\n                }\n                var result = this._getDiagramItems(items), indices;\n                if (!defined(undoable) || undoable) {\n                    indices = indicesOfItems(this.mainLayer, result.visuals);\n                    var unit = new ToFrontUnit(this, items, indices);\n                    this.undoRedoService.add(unit);\n                } else {\n                    this.mainLayer.toFront(result.visuals);\n                    this._fixOrdering(result, true);\n                }\n            },\n            toBack: function (items, undoable) {\n                if (!items) {\n                    items = this._selectedItems.slice();\n                }\n                var result = this._getDiagramItems(items), indices;\n                if (!defined(undoable) || undoable) {\n                    indices = indicesOfItems(this.mainLayer, result.visuals);\n                    var unit = new ToBackUnit(this, items, indices);\n                    this.undoRedoService.add(unit);\n                } else {\n                    this.mainLayer.toBack(result.visuals);\n                    this._fixOrdering(result, false);\n                }\n            },\n            bringIntoView: function (item, options) {\n                var viewport = this.viewport();\n                var aligner = new diagram.RectAlign(viewport);\n                var current, rect, original, newPan;\n                if (viewport.width === 0 || viewport.height === 0) {\n                    return;\n                }\n                options = deepExtend({\n                    animate: false,\n                    align: 'center middle'\n                }, options);\n                if (options.align == 'none') {\n                    options.align = 'center middle';\n                }\n                if (item instanceof DiagramElement) {\n                    rect = item.bounds(TRANSFORMED);\n                } else if (isArray(item)) {\n                    rect = this.boundingBox(item);\n                } else if (item instanceof Rect) {\n                    rect = item.clone();\n                }\n                original = rect.clone();\n                rect.zoom(this._zoom);\n                if (rect.width > viewport.width || rect.height > viewport.height) {\n                    this._zoom = this._getValidZoom(math.min(viewport.width / original.width, viewport.height / original.height));\n                    rect = original.clone().zoom(this._zoom);\n                }\n                this._zoomMainLayer();\n                current = rect.clone();\n                aligner.align(rect, options.align);\n                newPan = rect.topLeft().minus(current.topLeft());\n                this.pan(newPan.times(-1), options.animate);\n            },\n            alignShapes: function (direction) {\n                if (isUndefined(direction)) {\n                    direction = 'Left';\n                }\n                var items = this.select(), val, item, i;\n                if (items.length === 0) {\n                    return;\n                }\n                switch (direction.toLowerCase()) {\n                case 'left':\n                case 'top':\n                    val = MAX_VALUE;\n                    break;\n                case 'right':\n                case 'bottom':\n                    val = MIN_VALUE;\n                    break;\n                }\n                for (i = 0; i < items.length; i++) {\n                    item = items[i];\n                    if (item instanceof Shape) {\n                        switch (direction.toLowerCase()) {\n                        case 'left':\n                            val = math.min(val, item.options.x);\n                            break;\n                        case 'top':\n                            val = math.min(val, item.options.y);\n                            break;\n                        case 'right':\n                            val = math.max(val, item.options.x);\n                            break;\n                        case 'bottom':\n                            val = math.max(val, item.options.y);\n                            break;\n                        }\n                    }\n                }\n                var undoStates = [];\n                var shapes = [];\n                for (i = 0; i < items.length; i++) {\n                    item = items[i];\n                    if (item instanceof Shape) {\n                        shapes.push(item);\n                        undoStates.push(item.bounds());\n                        switch (direction.toLowerCase()) {\n                        case 'left':\n                        case 'right':\n                            item.position(new Point(val, item.options.y));\n                            break;\n                        case 'top':\n                        case 'bottom':\n                            item.position(new Point(item.options.x, val));\n                            break;\n                        }\n                    }\n                }\n                var unit = new diagram.TransformUnit(shapes, undoStates);\n                this.undoRedoService.add(unit, false);\n            },\n            zoom: function (zoom, options) {\n                if (zoom) {\n                    var staticPoint = options ? options.point : new diagram.Point(0, 0);\n                    zoom = this._zoom = this._getValidZoom(zoom);\n                    if (!isUndefined(staticPoint)) {\n                        staticPoint = new diagram.Point(math.round(staticPoint.x), math.round(staticPoint.y));\n                        var zoomedPoint = staticPoint.times(zoom);\n                        var viewportVector = this.modelToView(staticPoint);\n                        var raw = viewportVector.minus(zoomedPoint);\n                        this._storePan(new diagram.Point(math.round(raw.x), math.round(raw.y)));\n                    }\n                    if (options) {\n                        options.zoom = zoom;\n                    }\n                    this._panTransform();\n                    this.canvas.surface.hideTooltip();\n                    this._updateAdorners();\n                }\n                return this._zoom;\n            },\n            _getPan: function (pan) {\n                var canvas = this.canvas;\n                if (!canvas.translate) {\n                    pan = pan.plus(this._pan);\n                }\n                return pan;\n            },\n            pan: function (pan, animate) {\n                if (pan instanceof Point) {\n                    var that = this;\n                    var scroller = that.scroller;\n                    pan = that._getPan(pan);\n                    pan = pan.times(-1);\n                    if (animate) {\n                        scroller.animatedScrollTo(pan.x, pan.y, function () {\n                            that._updateAdorners();\n                        });\n                    } else {\n                        scroller.scrollTo(pan.x, pan.y);\n                        that._updateAdorners();\n                    }\n                } else {\n                    return this._pan.times(-1);\n                }\n            },\n            viewport: function () {\n                var element = this.element;\n                var width = element.width();\n                var height = element.height();\n                if (this.toolBar) {\n                    height -= outerHeight(this.toolBar.element);\n                }\n                return new Rect(0, 0, width, height);\n            },\n            copy: function () {\n                if (this.options.copy.enabled) {\n                    this._clipboard = [];\n                    this._copyOffset = 1;\n                    for (var i = 0; i < this._selectedItems.length; i++) {\n                        var item = this._selectedItems[i];\n                        this._clipboard.push(item);\n                    }\n                }\n            },\n            cut: function () {\n                if (this.options.copy.enabled) {\n                    this._clipboard = [];\n                    this._copyOffset = 0;\n                    for (var i = 0; i < this._selectedItems.length; i++) {\n                        var item = this._selectedItems[i];\n                        this._clipboard.push(item);\n                    }\n                    this.remove(this._clipboard, true);\n                }\n            },\n            paste: function () {\n                if (this._clipboard.length > 0) {\n                    var item, copied, i;\n                    var mapping = {};\n                    var elements = splitDiagramElements(this._clipboard);\n                    var connections = elements.connections;\n                    var shapes = elements.shapes;\n                    var offset = {\n                        x: this._copyOffset * this.options.copy.offsetX,\n                        y: this._copyOffset * this.options.copy.offsetY\n                    };\n                    this.deselect();\n                    for (i = 0; i < shapes.length; i++) {\n                        item = shapes[i];\n                        copied = item.clone();\n                        mapping[item.id] = copied;\n                        copied.position(new Point(item.options.x + offset.x, item.options.y + offset.y));\n                        copied.diagram = this;\n                        copied = this._addShape(copied);\n                        if (copied) {\n                            copied.select();\n                        }\n                    }\n                    for (i = 0; i < connections.length; i++) {\n                        item = connections[i];\n                        copied = this._addConnection(item.clone());\n                        if (copied) {\n                            this._updateCopiedConnection(copied, item, 'source', mapping, offset);\n                            this._updateCopiedConnection(copied, item, 'target', mapping, offset);\n                            copied.select(true);\n                            copied.updateModel();\n                        }\n                    }\n                    this._syncChanges();\n                    this._copyOffset += 1;\n                }\n            },\n            _updateCopiedConnection: function (connection, sourceConnection, connectorName, mapping, offset) {\n                var onActivate, inactiveItem, targetShape;\n                var target = sourceConnection[connectorName]();\n                var diagram = this;\n                if (target instanceof Connector && mapping[target.shape.id]) {\n                    targetShape = mapping[target.shape.id];\n                    if (diagram.getShapeById(targetShape.id)) {\n                        connection[connectorName](targetShape.getConnector(target.options.name));\n                    } else {\n                        inactiveItem = diagram._inactiveShapeItems.getByUid(targetShape.dataItem.uid);\n                        if (inactiveItem) {\n                            onActivate = function (item) {\n                                targetShape = diagram._dataMap[item.id];\n                                connection[connectorName](targetShape.getConnector(target.options.name));\n                                connection.updateModel();\n                            };\n                            diagram._deferredConnectionUpdates.push(inactiveItem.onActivate(onActivate));\n                        }\n                    }\n                } else {\n                    connection[connectorName](new Point(sourceConnection[connectorName + 'Point']().x + offset.x, sourceConnection[connectorName + 'Point']().y + offset.y));\n                }\n            },\n            boundingBox: function (items, origin) {\n                var rect = Rect.empty(), temp, di = isDefined(items) ? this._getDiagramItems(items) : { shapes: this.shapes };\n                if (di.shapes.length > 0) {\n                    var item = di.shapes[0];\n                    rect = item.bounds(ROTATED);\n                    for (var i = 1; i < di.shapes.length; i++) {\n                        item = di.shapes[i];\n                        temp = item.bounds(ROTATED);\n                        if (origin === true) {\n                            temp.x -= item._rotationOffset.x;\n                            temp.y -= item._rotationOffset.y;\n                        }\n                        rect = rect.union(temp);\n                    }\n                }\n                return rect;\n            },\n            _containerOffset: function () {\n                var containerOffset = this.element.offset();\n                if (this.toolBar) {\n                    containerOffset.top += outerHeight(this.toolBar.element);\n                }\n                return containerOffset;\n            },\n            documentToView: function (point) {\n                var containerOffset = this._containerOffset();\n                return new Point(point.x - containerOffset.left, point.y - containerOffset.top);\n            },\n            viewToDocument: function (point) {\n                var containerOffset = this._containerOffset();\n                return new Point(point.x + containerOffset.left, point.y + containerOffset.top);\n            },\n            viewToModel: function (point) {\n                return this._transformWithMatrix(point, this._matrixInvert);\n            },\n            modelToView: function (point) {\n                return this._transformWithMatrix(point, this._matrix);\n            },\n            modelToLayer: function (point) {\n                return this._transformWithMatrix(point, this._layerMatrix);\n            },\n            layerToModel: function (point) {\n                return this._transformWithMatrix(point, this._layerMatrixInvert);\n            },\n            documentToModel: function (point) {\n                var viewPoint = this.documentToView(point);\n                if (!this.canvas.translate) {\n                    viewPoint.x = viewPoint.x + this.scroller.scrollLeft;\n                    viewPoint.y = viewPoint.y + this.scroller.scrollTop;\n                }\n                return this.viewToModel(viewPoint);\n            },\n            modelToDocument: function (point) {\n                return this.viewToDocument(this.modelToView(point));\n            },\n            _transformWithMatrix: function (point, matrix) {\n                var result = point;\n                if (point instanceof Point) {\n                    if (matrix) {\n                        result = matrix.apply(point);\n                    }\n                } else {\n                    var tl = this._transformWithMatrix(point.topLeft(), matrix), br = this._transformWithMatrix(point.bottomRight(), matrix);\n                    result = Rect.fromPoints(tl, br);\n                }\n                return result;\n            },\n            setDataSource: function (dataSource) {\n                this.options.dataSource = dataSource;\n                this._dataSource();\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            },\n            setConnectionsDataSource: function (dataSource) {\n                this.options.connectionsDataSource = dataSource;\n                this._connectionDataSource();\n                if (this.options.autoBind) {\n                    this.connectionsDataSource.fetch();\n                }\n            },\n            layout: function (options) {\n                this._layouting = true;\n                var type;\n                if (isUndefined(options)) {\n                    options = this.options.layout;\n                }\n                if (isUndefined(options) || isUndefined(options.type)) {\n                    type = 'Tree';\n                } else {\n                    type = options.type;\n                }\n                var l;\n                switch (type.toLowerCase()) {\n                case 'tree':\n                    l = new diagram.TreeLayout(this);\n                    break;\n                case 'layered':\n                    l = new diagram.LayeredLayout(this);\n                    break;\n                case 'forcedirected':\n                case 'force':\n                case 'spring':\n                case 'springembedder':\n                    l = new diagram.SpringLayout(this);\n                    break;\n                default:\n                    throw 'Layout algorithm \\'' + type + '\\' is not supported.';\n                }\n                var initialState = new diagram.LayoutState(this);\n                var finalState = l.layout(options);\n                if (finalState) {\n                    var unit = new diagram.LayoutUndoUnit(initialState, finalState, options ? options.animate : null);\n                    this.undoRedoService.add(unit);\n                }\n                this._layouting = false;\n                this._redrawConnections();\n            },\n            getShapeById: function (id) {\n                var found;\n                found = Utils.first(this.shapes, function (s) {\n                    return s.visual.id === id;\n                });\n                if (found) {\n                    return found;\n                }\n                found = Utils.first(this.connections, function (c) {\n                    return c.visual.id === id;\n                });\n                return found;\n            },\n            getShapeByModelId: function (id) {\n                var shape;\n                if (this._isEditable) {\n                    shape = this._dataMap[id];\n                } else {\n                    shape = Utils.first(this.shapes, function (shape) {\n                        return (shape.dataItem || {}).id === id;\n                    });\n                }\n                return shape;\n            },\n            getShapeByModelUid: function (uid) {\n                var shape;\n                if (this._isEditable) {\n                    shape = Utils.first(this.shapes, function (shape) {\n                        return (shape.dataItem || {}).uid === uid;\n                    });\n                } else {\n                    shape = this._dataMap[uid];\n                }\n                return shape;\n            },\n            getConnectionByModelId: function (id) {\n                var connection;\n                if (this.connectionsDataSource) {\n                    connection = Utils.first(this.connections, function (connection) {\n                        return (connection.dataItem || {}).id === id;\n                    });\n                }\n                return connection;\n            },\n            getConnectionByModelUid: function (uid) {\n                var connection;\n                if (this.connectionsDataSource) {\n                    connection = this._connectionsDataMap[uid];\n                }\n                return connection;\n            },\n            _extendLayoutOptions: function (options) {\n                if (options.layout) {\n                    options.layout = deepExtend({}, diagram.LayoutBase.fn.defaultOptions || {}, options.layout);\n                }\n            },\n            _selectionChanged: function (selected, deselected) {\n                if (selected.length || deselected.length) {\n                    this.trigger(SELECT, {\n                        selected: selected,\n                        deselected: deselected\n                    });\n                }\n            },\n            _getValidZoom: function (zoom) {\n                return math.min(math.max(zoom, this.options.zoomMin), this.options.zoomMax);\n            },\n            _panTransform: function (pos) {\n                var diagram = this, pan = pos || diagram._pan;\n                if (diagram.canvas.translate) {\n                    diagram.scroller.scrollTo(pan.x, pan.y);\n                    diagram._zoomMainLayer();\n                } else {\n                    diagram._storePan(pan);\n                    diagram._transformMainLayer();\n                }\n            },\n            _finishPan: function () {\n                this.trigger(PAN, {\n                    total: this._pan,\n                    delta: Number.NaN\n                });\n            },\n            _storePan: function (pan) {\n                this._pan = pan;\n                this._storeViewMatrix();\n            },\n            _zoomMainLayer: function () {\n                var zoom = this._zoom;\n                var transform = new CompositeTransform(0, 0, zoom, zoom);\n                transform.render(this.mainLayer);\n                this._storeLayerMatrix(transform);\n                this._storeViewMatrix();\n            },\n            _transformMainLayer: function () {\n                var pan = this._pan, zoom = this._zoom;\n                var transform = new CompositeTransform(pan.x, pan.y, zoom, zoom);\n                transform.render(this.mainLayer);\n                this._storeLayerMatrix(transform);\n                this._storeViewMatrix();\n            },\n            _storeLayerMatrix: function (canvasTransform) {\n                this._layerMatrix = canvasTransform.toMatrix();\n                this._layerMatrixInvert = canvasTransform.invert().toMatrix();\n            },\n            _storeViewMatrix: function () {\n                var pan = this._pan, zoom = this._zoom;\n                var transform = new CompositeTransform(pan.x, pan.y, zoom, zoom);\n                this._matrix = transform.toMatrix();\n                this._matrixInvert = transform.invert().toMatrix();\n            },\n            _toIndex: function (items, indices) {\n                var result = this._getDiagramItems(items);\n                this.mainLayer.toIndex(result.visuals, indices);\n                this._fixOrdering(result, false);\n            },\n            _fixOrdering: function (result, toFront) {\n                var shapePos = toFront ? this.shapes.length - 1 : 0, conPos = toFront ? this.connections.length - 1 : 0, i, item;\n                for (i = 0; i < result.shapes.length; i++) {\n                    item = result.shapes[i];\n                    Utils.remove(this.shapes, item);\n                    Utils.insert(this.shapes, item, shapePos);\n                }\n                for (i = 0; i < result.cons.length; i++) {\n                    item = result.cons[i];\n                    Utils.remove(this.connections, item);\n                    Utils.insert(this.connections, item, conPos);\n                }\n            },\n            _getDiagramItems: function (items) {\n                var i, result = {}, args = items;\n                result.visuals = [];\n                result.shapes = [];\n                result.cons = [];\n                if (!items) {\n                    args = this._selectedItems.slice();\n                } else if (!isArray(items)) {\n                    args = [items];\n                }\n                for (i = 0; i < args.length; i++) {\n                    var item = args[i];\n                    if (item instanceof Shape) {\n                        result.shapes.push(item);\n                        result.visuals.push(item.visual);\n                    } else if (item instanceof Connection) {\n                        result.cons.push(item);\n                        result.visuals.push(item.visual);\n                    }\n                }\n                return result;\n            },\n            _removeItem: function (item, undoable, removedConnections) {\n                item.select(false);\n                if (item instanceof Shape) {\n                    this._removeShapeDataItem(item);\n                    this._removeShape(item, undoable, removedConnections);\n                } else if (item instanceof Connection) {\n                    this._removeConnectionDataItem(item);\n                    this._removeConnection(item, undoable);\n                }\n                this.mainLayer.remove(item.visual);\n            },\n            _removeShape: function (shape, undoable, removedConnections) {\n                var i, connection, connector, sources = [], targets = [];\n                this.toolService._removeHover();\n                if (undoable) {\n                    this.undoRedoService.addCompositeItem(new DeleteShapeUnit(shape));\n                }\n                Utils.remove(this.shapes, shape);\n                this._shapesQuadTree.remove(shape);\n                for (i = 0; i < shape.connectors.length; i++) {\n                    connector = shape.connectors[i];\n                    for (var j = 0; j < connector.connections.length; j++) {\n                        connection = connector.connections[j];\n                        if (!removedConnections || !dataviz.inArray(connection, removedConnections)) {\n                            if (connection.sourceConnector == connector) {\n                                sources.push(connection);\n                            } else if (connection.targetConnector == connector) {\n                                targets.push(connection);\n                            }\n                        }\n                    }\n                }\n                for (i = 0; i < sources.length; i++) {\n                    sources[i].source(null, undoable);\n                    sources[i].updateModel();\n                }\n                for (i = 0; i < targets.length; i++) {\n                    targets[i].target(null, undoable);\n                    targets[i].updateModel();\n                }\n            },\n            _removeConnection: function (connection, undoable) {\n                if (connection.sourceConnector) {\n                    Utils.remove(connection.sourceConnector.connections, connection);\n                }\n                if (connection.targetConnector) {\n                    Utils.remove(connection.targetConnector.connections, connection);\n                }\n                if (undoable) {\n                    this.undoRedoService.addCompositeItem(new DeleteConnectionUnit(connection));\n                }\n                Utils.remove(this.connections, connection);\n            },\n            _removeDataItems: function (items, recursive) {\n                var item, children, shape, idx;\n                items = isArray(items) ? items : [items];\n                while (items.length) {\n                    item = items.shift();\n                    shape = this._dataMap[item.uid];\n                    if (shape) {\n                        this._removeShapeConnections(shape);\n                        this._removeItem(shape, false);\n                        delete this._dataMap[item.uid];\n                        if (recursive && item.hasChildren && item.loaded()) {\n                            children = item.children.data();\n                            for (idx = 0; idx < children.length; idx++) {\n                                items.push(children[idx]);\n                            }\n                        }\n                    }\n                }\n            },\n            _removeShapeConnections: function (shape) {\n                var connections = shape.connections();\n                var idx;\n                if (connections) {\n                    for (idx = 0; idx < connections.length; idx++) {\n                        this._removeItem(connections[idx], false);\n                    }\n                }\n            },\n            _addDataItem: function (dataItem, undoable) {\n                if (!defined(dataItem)) {\n                    return;\n                }\n                var shape = this._dataMap[dataItem.id];\n                if (shape) {\n                    return shape;\n                }\n                var options = deepExtend({}, this.options.shapeDefaults);\n                options.dataItem = dataItem;\n                shape = new Shape(options, this);\n                this.addShape(shape, undoable !== false);\n                this._dataMap[dataItem.id] = shape;\n                return shape;\n            },\n            _addDataItemByUid: function (dataItem) {\n                if (!defined(dataItem)) {\n                    return;\n                }\n                var shape = this._dataMap[dataItem.uid];\n                if (shape) {\n                    return shape;\n                }\n                var options = deepExtend({}, this.options.shapeDefaults);\n                options.dataItem = dataItem;\n                shape = new Shape(options, this);\n                this.addShape(shape);\n                this._dataMap[dataItem.uid] = shape;\n                return shape;\n            },\n            _addDataItems: function (items, parent) {\n                var item, idx, shape, parentShape, connection;\n                for (idx = 0; idx < items.length; idx++) {\n                    item = items[idx];\n                    shape = this._addDataItemByUid(item);\n                    parentShape = this._addDataItemByUid(parent);\n                    if (parentShape && !this.connected(parentShape, shape)) {\n                        connection = this.connect(parentShape, shape);\n                    }\n                }\n            },\n            _refreshSource: function (e) {\n                var that = this, node = e.node, action = e.action, items = e.items, options = that.options, idx, dataBound;\n                if (e.field) {\n                    for (idx = 0; idx < items.length; idx++) {\n                        if (this._dataMap[items[idx].uid]) {\n                            this._dataMap[items[idx].uid].redrawVisual();\n                        }\n                    }\n                    return;\n                }\n                if (action == 'remove') {\n                    this._removeDataItems(e.items, true);\n                } else {\n                    if ((!action || action === 'itemloaded') && !this._bindingRoots) {\n                        this._bindingRoots = true;\n                        dataBound = true;\n                    }\n                    if (!action && !node) {\n                        that.clear();\n                    }\n                    this._addDataItems(items, node);\n                    for (idx = 0; idx < items.length; idx++) {\n                        items[idx].load();\n                    }\n                }\n                if (options.layout && (dataBound || action == 'remove' || action == 'add')) {\n                    that.layout(options.layout);\n                }\n                if (dataBound) {\n                    this.trigger('dataBound');\n                    this._bindingRoots = false;\n                }\n            },\n            _addItem: function (item) {\n                if (item instanceof Shape) {\n                    this.addShape(item);\n                } else if (item instanceof Connection) {\n                    this.addConnection(item);\n                }\n            },\n            _createToolBar: function (preventClosing) {\n                var diagram = this.toolService.diagram;\n                if (!this.singleToolBar && diagram.select().length === 1) {\n                    var element = diagram.select()[0];\n                    if (element && element.options.editable !== false) {\n                        var editable = element.options.editable;\n                        var tools = editable.tools;\n                        if (this._isEditable && tools.length === 0) {\n                            if (element instanceof Shape) {\n                                tools = [\n                                    'edit',\n                                    'rotateClockwise',\n                                    'rotateAnticlockwise'\n                                ];\n                            } else if (element instanceof Connection) {\n                                tools = ['edit'];\n                            }\n                            if (editable && editable.remove !== false) {\n                                tools.push('delete');\n                            }\n                        }\n                        if (tools && tools.length) {\n                            var padding = 20;\n                            var point;\n                            this.singleToolBar = new DiagramToolBar(diagram, {\n                                tools: tools,\n                                click: proxy(this._toolBarClick, this),\n                                modal: true,\n                                popupZIndex: parseInt(diagram.element.closest('.k-window').css('zIndex'), 10) + 10\n                            });\n                            var popupWidth = outerWidth(this.singleToolBar._popup.element);\n                            var popupHeight = outerHeight(this.singleToolBar._popup.element);\n                            if (element instanceof Shape) {\n                                var shapeBounds = this.modelToView(element.bounds(ROTATED));\n                                point = new Point(shapeBounds.x, shapeBounds.y).minus(new Point((popupWidth - shapeBounds.width) / 2, popupHeight + padding));\n                            } else if (element instanceof Connection) {\n                                var connectionBounds = this.modelToView(element.bounds());\n                                point = new Point(connectionBounds.x, connectionBounds.y).minus(new Point((popupWidth - connectionBounds.width - 20) / 2, popupHeight + padding));\n                            }\n                            if (point) {\n                                if (!this.canvas.translate) {\n                                    point = point.minus(new Point(this.scroller.scrollLeft, this.scroller.scrollTop));\n                                }\n                                point = this.viewToDocument(point);\n                                point = new Point(math.max(point.x, 0), math.max(point.y, 0));\n                                this.singleToolBar.showAt(point);\n                                if (preventClosing) {\n                                    this.singleToolBar._popup.one('close', preventDefault);\n                                }\n                            } else {\n                                this._destroyToolBar();\n                            }\n                        }\n                    }\n                }\n            },\n            _toolBarClick: function (e) {\n                this.trigger('toolBarClick', e);\n                this._destroyToolBar();\n            },\n            _normalizePointZoom: function (point) {\n                return point.times(1 / this.zoom());\n            },\n            _initialize: function () {\n                this.shapes = [];\n                this._selectedItems = [];\n                this.connections = [];\n                this._dataMap = {};\n                this._connectionsDataMap = {};\n                this._inactiveShapeItems = new InactiveItemsCollection();\n                this._deferredConnectionUpdates = [];\n                this.undoRedoService = new UndoRedoService({\n                    undone: this._syncHandler,\n                    redone: this._syncHandler\n                });\n                this.id = diagram.randomId();\n            },\n            _fetchFreshData: function () {\n                var that = this;\n                that._dataSource();\n                if (that._isEditable) {\n                    that._connectionDataSource();\n                }\n                if (that.options.autoBind) {\n                    if (that._isEditable) {\n                        this._loadingShapes = true;\n                        this._loadingConnections = true;\n                        that.dataSource.fetch();\n                        that.connectionsDataSource.fetch();\n                    } else {\n                        that.dataSource.fetch();\n                    }\n                }\n            },\n            _dataSource: function () {\n                if (defined(this.options.connectionsDataSource)) {\n                    this._isEditable = true;\n                    var dsOptions = this.options.dataSource || {};\n                    var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n                    if (this.dataSource && this._shapesRefreshHandler) {\n                        this.dataSource.unbind('change', this._shapesRefreshHandler).unbind('requestStart', this._shapesRequestStartHandler).unbind('error', this._shapesErrorHandler);\n                    } else {\n                        this._shapesRefreshHandler = proxy(this._refreshShapes, this);\n                        this._shapesRequestStartHandler = proxy(this._shapesRequestStart, this);\n                        this._shapesErrorHandler = proxy(this._error, this);\n                    }\n                    this.dataSource = kendo.data.DataSource.create(ds).bind('change', this._shapesRefreshHandler).bind('requestStart', this._shapesRequestStartHandler).bind('error', this._shapesErrorHandler);\n                } else {\n                    this._treeDataSource();\n                    this._isEditable = false;\n                }\n            },\n            _connectionDataSource: function () {\n                var dsOptions = this.options.connectionsDataSource;\n                if (dsOptions) {\n                    var ds = isArray(dsOptions) ? { data: dsOptions } : dsOptions;\n                    if (this.connectionsDataSource && this._connectionsRefreshHandler) {\n                        this.connectionsDataSource.unbind('change', this._connectionsRefreshHandler).unbind('requestStart', this._connectionsRequestStartHandler).unbind('error', this._connectionsErrorHandler);\n                    } else {\n                        this._connectionsRefreshHandler = proxy(this._refreshConnections, this);\n                        this._connectionsRequestStartHandler = proxy(this._connectionsRequestStart, this);\n                        this._connectionsErrorHandler = proxy(this._connectionsError, this);\n                    }\n                    this.connectionsDataSource = kendo.data.DataSource.create(ds).bind('change', this._connectionsRefreshHandler).bind('requestStart', this._connectionsRequestStartHandler).bind('error', this._connectionsErrorHandler);\n                }\n            },\n            _shapesRequestStart: function (e) {\n                if (e.type == 'read') {\n                    this._loadingShapes = true;\n                }\n            },\n            _connectionsRequestStart: function (e) {\n                if (e.type == 'read') {\n                    this._loadingConnections = true;\n                }\n            },\n            _error: function () {\n                this._loadingShapes = false;\n            },\n            _connectionsError: function () {\n                this._loadingConnections = false;\n            },\n            _refreshShapes: function (e) {\n                if (e.action === 'remove') {\n                    if (this._shouldRefresh()) {\n                        this._removeShapes(e.items);\n                    }\n                } else if (e.action === 'itemchange') {\n                    if (this._shouldRefresh()) {\n                        this._updateShapes(e.items, e.field);\n                    }\n                } else if (e.action === 'add') {\n                    this._inactiveShapeItems.add(e.items);\n                } else if (e.action === 'sync') {\n                    this._syncShapes(e.items);\n                } else {\n                    this.refresh();\n                }\n            },\n            _shouldRefresh: function () {\n                return !this._suspended;\n            },\n            _suspendModelRefresh: function () {\n                this._suspended = (this._suspended || 0) + 1;\n            },\n            _resumeModelRefresh: function () {\n                this._suspended = math.max((this._suspended || 0) - 1, 0);\n            },\n            refresh: function () {\n                this._loadingShapes = false;\n                if (!this._loadingConnections) {\n                    this._rebindShapesAndConnections();\n                }\n            },\n            _rebindShapesAndConnections: function () {\n                this.clear();\n                this._addShapes(this.dataSource.view());\n                if (this.connectionsDataSource) {\n                    this._addConnections(this.connectionsDataSource.view(), false);\n                }\n                if (this.options.layout) {\n                    this.layout(this.options.layout);\n                } else {\n                    this._redrawConnections();\n                }\n                this.trigger('dataBound');\n            },\n            refreshConnections: function () {\n                this._loadingConnections = false;\n                if (!this._loadingShapes) {\n                    this._rebindShapesAndConnections();\n                }\n            },\n            _redrawConnections: function () {\n                var connections = this.connections;\n                for (var idx = 0; idx < connections.length; idx++) {\n                    connections[idx].refresh();\n                }\n            },\n            _removeShapes: function (items) {\n                var dataMap = this._dataMap;\n                var item, i;\n                for (i = 0; i < items.length; i++) {\n                    item = items[i];\n                    if (dataMap[item.id]) {\n                        this.remove(dataMap[item.id], false);\n                        dataMap[item.id] = null;\n                    }\n                }\n            },\n            _syncShapes: function () {\n                var diagram = this;\n                var inactiveItems = diagram._inactiveShapeItems;\n                inactiveItems.forEach(function (inactiveItem) {\n                    var dataItem = inactiveItem.dataItem;\n                    var shape = inactiveItem.element;\n                    if (!dataItem.isNew()) {\n                        if (shape) {\n                            shape._setOptionsFromModel();\n                            diagram.addShape(shape, inactiveItem.undoable);\n                            diagram._dataMap[dataItem.id] = shape;\n                        } else {\n                            diagram._addDataItem(dataItem);\n                        }\n                        inactiveItem.activate();\n                        inactiveItems.remove(dataItem);\n                    }\n                });\n            },\n            _updateShapes: function (items, field) {\n                for (var i = 0; i < items.length; i++) {\n                    var dataItem = items[i];\n                    var shape = this._dataMap[dataItem.id];\n                    if (shape) {\n                        shape.updateOptionsFromModel(dataItem, field);\n                    }\n                }\n            },\n            _addShapes: function (dataItems) {\n                for (var i = 0; i < dataItems.length; i++) {\n                    this._addDataItem(dataItems[i], false);\n                }\n            },\n            _refreshConnections: function (e) {\n                if (e.action === 'remove') {\n                    if (this._shouldRefresh()) {\n                        this._removeConnections(e.items);\n                    }\n                } else if (e.action === 'add') {\n                    this._addConnections(e.items);\n                } else if (e.action === 'sync') {\n                } else if (e.action === 'itemchange') {\n                    if (this._shouldRefresh()) {\n                        this._updateConnections(e.items);\n                    }\n                } else {\n                    this.refreshConnections();\n                }\n            },\n            _removeConnections: function (items) {\n                for (var i = 0; i < items.length; i++) {\n                    this.remove(this._connectionsDataMap[items[i].uid], false);\n                    this._connectionsDataMap[items[i].uid] = null;\n                }\n            },\n            _updateConnections: function (items) {\n                for (var i = 0; i < items.length; i++) {\n                    var dataItem = items[i];\n                    var connection = this._connectionsDataMap[dataItem.uid];\n                    connection.updateOptionsFromModel(dataItem);\n                }\n            },\n            _addConnections: function (connections, undoable) {\n                var length = connections.length;\n                for (var i = 0; i < length; i++) {\n                    var dataItem = connections[i];\n                    this._addConnectionDataItem(dataItem, undoable);\n                }\n            },\n            _addConnectionDataItem: function (dataItem, undoable) {\n                if (!this._connectionsDataMap[dataItem.uid]) {\n                    var from = this._validateConnector(dataItem.from);\n                    if (!defined(from) || from === null) {\n                        from = new Point(dataItem.fromX, dataItem.fromY);\n                    }\n                    var to = this._validateConnector(dataItem.to);\n                    if (!defined(to) || to === null) {\n                        to = new Point(dataItem.toX, dataItem.toY);\n                    }\n                    if (defined(from) && defined(to)) {\n                        var options = deepExtend({}, this.options.connectionDefaults);\n                        options.dataItem = dataItem;\n                        var connection = new Connection(from, to, options);\n                        this._connectionsDataMap[dataItem.uid] = connection;\n                        this.addConnection(connection, undoable);\n                    }\n                }\n            },\n            _validateConnector: function (value) {\n                var connector;\n                if (defined(value) && value !== null) {\n                    connector = this._dataMap[value];\n                }\n                return connector;\n            },\n            _treeDataSource: function () {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                dataSource = isArray(dataSource) ? { data: dataSource } : dataSource;\n                if (dataSource instanceof kendo.data.DataSource && !(dataSource instanceof kendo.data.HierarchicalDataSource)) {\n                    throw new Error('Incorrect DataSource type. If a single dataSource instance is set to the diagram then it should be a HierarchicalDataSource. You should set only the options instead of an instance or a HierarchicalDataSource instance or supply connectionsDataSource as well.');\n                }\n                if (!dataSource.fields) {\n                    dataSource.fields = [\n                        { field: 'text' },\n                        { field: 'url' },\n                        { field: 'spriteCssClass' },\n                        { field: 'imageUrl' }\n                    ];\n                }\n                if (that.dataSource && that._refreshHandler) {\n                    that._unbindDataSource();\n                }\n                that._refreshHandler = proxy(that._refreshSource, that);\n                that._errorHandler = proxy(that._error, that);\n                that.dataSource = HierarchicalDataSource.create(dataSource).bind(CHANGE, that._refreshHandler).bind(ERROR, that._errorHandler);\n            },\n            _unbindDataSource: function () {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._refreshHandler).unbind(ERROR, that._errorHandler);\n            },\n            _adorn: function (adorner, isActive) {\n                if (isActive !== undefined && adorner) {\n                    if (isActive) {\n                        this._adorners.push(adorner);\n                        this.adornerLayer.append(adorner.visual);\n                    } else {\n                        Utils.remove(this._adorners, adorner);\n                        this.adornerLayer.remove(adorner.visual);\n                    }\n                }\n            },\n            _showConnectors: function (shape, value) {\n                if (value) {\n                    this._connectorsAdorner.show(shape);\n                } else {\n                    this._connectorsAdorner.destroy();\n                }\n            },\n            _updateAdorners: function () {\n                var adorners = this._adorners;\n                for (var i = 0; i < adorners.length; i++) {\n                    var adorner = adorners[i];\n                    if (adorner.refreshBounds) {\n                        adorner.refreshBounds();\n                    }\n                    adorner.refresh();\n                }\n            },\n            _refresh: function () {\n                for (var i = 0; i < this.connections.length; i++) {\n                    this.connections[i].refresh();\n                }\n            },\n            _destroyToolBar: function () {\n                if (this.singleToolBar) {\n                    this.singleToolBar.hide();\n                    this.singleToolBar.destroy();\n                    this.singleToolBar = null;\n                }\n            },\n            _destroyGlobalToolBar: function () {\n                if (this.toolBar) {\n                    this.toolBar.hide();\n                    this.toolBar.destroy();\n                    this.toolBar = null;\n                }\n            },\n            exportDOMVisual: function () {\n                var viewBox = this.canvas._viewBox;\n                var scrollOffset = geom.transform().translate(-viewBox.x, -viewBox.y);\n                var viewRect = new geom.Rect([\n                    0,\n                    0\n                ], [\n                    viewBox.width,\n                    viewBox.height\n                ]);\n                var clipPath = draw.Path.fromRect(viewRect);\n                var wrap = new draw.Group({ transform: scrollOffset });\n                var clipWrap = new draw.Group({ clip: clipPath });\n                var root = this.canvas.drawingElement.children[0];\n                clipWrap.append(wrap);\n                wrap.children.push(root);\n                return clipWrap;\n            },\n            exportVisual: function () {\n                var scale = geom.transform().scale(1 / this._zoom);\n                var wrap = new draw.Group({ transform: scale });\n                var root = this.mainLayer.drawingElement;\n                wrap.children.push(root);\n                return wrap;\n            },\n            _syncChanges: function () {\n                this._syncShapeChanges();\n                this._syncConnectionChanges();\n            },\n            _syncShapeChanges: function () {\n                if (this.dataSource && this._isEditable) {\n                    this.dataSource.sync();\n                }\n            },\n            _syncConnectionChanges: function () {\n                var that = this;\n                if (that.connectionsDataSource && that._isEditable) {\n                    $.when.apply($, that._deferredConnectionUpdates).then(function () {\n                        that.connectionsDataSource.sync();\n                    });\n                    that.deferredConnectionUpdates = [];\n                }\n            }\n        });\n        dataviz.ExportMixin.extend(Diagram.fn, true);\n        if (kendo.PDFMixin) {\n            kendo.PDFMixin.extend(Diagram.fn);\n        }\n        function filterShapeDataItem(dataItem) {\n            var result = {};\n            dataItem = dataItem || {};\n            if (defined(dataItem.text) && dataItem.text !== null) {\n                result.text = dataItem.text;\n            }\n            if (defined(dataItem.x) && dataItem.x !== null) {\n                result.x = dataItem.x;\n            }\n            if (defined(dataItem.y) && dataItem.y !== null) {\n                result.y = dataItem.y;\n            }\n            if (defined(dataItem.width) && dataItem.width !== null) {\n                result.width = dataItem.width;\n            }\n            if (defined(dataItem.height) && dataItem.height !== null) {\n                result.height = dataItem.height;\n            }\n            if (defined(dataItem.type) && dataItem.type !== null) {\n                result.type = dataItem.type;\n            }\n            return result;\n        }\n        function filterConnectionDataItem(dataItem) {\n            var result = {};\n            dataItem = dataItem || {};\n            if (defined(dataItem.text) && dataItem.text !== null) {\n                result.content = dataItem.text;\n            }\n            if (defined(dataItem.type) && dataItem.type !== null) {\n                result.type = dataItem.type;\n            }\n            if (defined(dataItem.from) && dataItem.from !== null) {\n                result.from = dataItem.from;\n            }\n            if (defined(dataItem.fromConnector) && dataItem.fromConnector !== null) {\n                result.fromConnector = dataItem.fromConnector;\n            }\n            if (defined(dataItem.fromX) && dataItem.fromX !== null) {\n                result.fromX = dataItem.fromX;\n            }\n            if (defined(dataItem.fromY) && dataItem.fromY !== null) {\n                result.fromY = dataItem.fromY;\n            }\n            if (defined(dataItem.to) && dataItem.to !== null) {\n                result.to = dataItem.to;\n            }\n            if (defined(dataItem.toConnector) && dataItem.toConnector !== null) {\n                result.toConnector = dataItem.toConnector;\n            }\n            if (defined(dataItem.toX) && dataItem.toX !== null) {\n                result.toX = dataItem.toX;\n            }\n            if (defined(dataItem.toY) && dataItem.toY !== null) {\n                result.toY = dataItem.toY;\n            }\n            return result;\n        }\n        var DiagramToolBar = kendo.Observable.extend({\n            init: function (diagram, options) {\n                kendo.Observable.fn.init.call(this);\n                this.diagram = diagram;\n                this.options = deepExtend({}, this.options, options);\n                this._tools = [];\n                this.createToolBar();\n                this.createTools();\n                this.appendTools();\n                if (this.options.modal) {\n                    this.createPopup();\n                }\n                this.bind(this.events, options);\n            },\n            events: ['click'],\n            createPopup: function () {\n                this.container = $('<div/>').append(this.element);\n                this._popup = this.container.kendoPopup({}).getKendoPopup();\n            },\n            appendTools: function () {\n                for (var i = 0; i < this._tools.length; i++) {\n                    var tool = this._tools[i];\n                    if (tool.buttons && tool.buttons.length || !defined(tool.buttons)) {\n                        this._toolBar.add(tool);\n                    }\n                }\n            },\n            createToolBar: function () {\n                this.element = $('<div/>');\n                this._toolBar = this.element.kendoToolBar({\n                    click: proxy(this.click, this),\n                    resizable: false\n                }).getKendoToolBar();\n                this.element.css('border', 'none');\n            },\n            createTools: function () {\n                for (var i = 0; i < this.options.tools.length; i++) {\n                    this.createTool(this.options.tools[i]);\n                }\n            },\n            createTool: function (tool) {\n                if (!isPlainObject(tool)) {\n                    tool = { name: tool };\n                }\n                var toolName = tool.name + 'Tool';\n                if (this[toolName]) {\n                    this[toolName](tool);\n                } else {\n                    this._tools.push(deepExtend({}, tool, { attributes: this._setAttributes({ action: tool.name }) }));\n                }\n            },\n            showAt: function (point) {\n                var popupZIndex = parseInt(this.options.popupZIndex, 10);\n                if (this._popup) {\n                    this._popup.open(point.x, point.y);\n                    if (popupZIndex) {\n                        this._popup.wrapper.css('zIndex', popupZIndex);\n                    }\n                }\n            },\n            hide: function () {\n                if (this._popup) {\n                    this._popup.close();\n                }\n            },\n            newGroup: function () {\n                return {\n                    type: 'buttonGroup',\n                    buttons: []\n                };\n            },\n            editTool: function () {\n                this._tools.push({\n                    icon: 'edit',\n                    showText: 'overflow',\n                    type: 'button',\n                    text: 'Edit',\n                    attributes: this._setAttributes({ action: 'edit' })\n                });\n            },\n            deleteTool: function () {\n                this._tools.push({\n                    icon: 'close',\n                    showText: 'overflow',\n                    type: 'button',\n                    text: 'Delete',\n                    attributes: this._setAttributes({ action: 'delete' })\n                });\n            },\n            rotateAnticlockwiseTool: function (options) {\n                this._appendGroup('rotate');\n                this._rotateGroup.buttons.push({\n                    icon: 'rotate-left',\n                    showText: 'overflow',\n                    text: 'RotateAnticlockwise',\n                    group: 'rotate',\n                    attributes: this._setAttributes({\n                        action: 'rotateAnticlockwise',\n                        step: options.step\n                    })\n                });\n            },\n            rotateClockwiseTool: function (options) {\n                this._appendGroup('rotate');\n                this._rotateGroup.buttons.push({\n                    icon: 'rotate-right',\n                    attributes: this._setAttributes({\n                        action: 'rotateClockwise',\n                        step: options.step\n                    }),\n                    showText: 'overflow',\n                    text: 'RotateClockwise',\n                    group: 'rotate'\n                });\n            },\n            createShapeTool: function () {\n                this._appendGroup('create');\n                this._createGroup.buttons.push({\n                    icon: 'shape',\n                    showText: 'overflow',\n                    text: 'CreateShape',\n                    group: 'create',\n                    attributes: this._setAttributes({ action: 'createShape' })\n                });\n            },\n            createConnectionTool: function () {\n                this._appendGroup('create');\n                this._createGroup.buttons.push({\n                    icon: 'connector',\n                    showText: 'overflow',\n                    text: 'CreateConnection',\n                    group: 'create',\n                    attributes: this._setAttributes({ action: 'createConnection' })\n                });\n            },\n            undoTool: function () {\n                this._appendGroup('history');\n                this._historyGroup.buttons.push({\n                    icon: 'undo',\n                    showText: 'overflow',\n                    text: 'Undo',\n                    group: 'history',\n                    attributes: this._setAttributes({ action: 'undo' })\n                });\n            },\n            redoTool: function () {\n                this._appendGroup('history');\n                this._historyGroup.buttons.push({\n                    icon: 'redo',\n                    showText: 'overflow',\n                    text: 'Redo',\n                    group: 'history',\n                    attributes: this._setAttributes({ action: 'redo' })\n                });\n            },\n            _appendGroup: function (name) {\n                var prop = '_' + name + 'Group';\n                if (!this[prop]) {\n                    this[prop] = this.newGroup();\n                    this._tools.push(this[prop]);\n                }\n            },\n            _setAttributes: function (attributes) {\n                var attr = {};\n                if (attributes.action) {\n                    attr[kendo.attr('action')] = attributes.action;\n                }\n                if (attributes.step) {\n                    attr[kendo.attr('step')] = attributes.step;\n                }\n                return attr;\n            },\n            _getAttributes: function (element) {\n                var attr = {};\n                var action = element.attr(kendo.attr('action'));\n                if (action) {\n                    attr.action = action;\n                }\n                var step = element.attr(kendo.attr('step'));\n                if (step) {\n                    attr.step = step;\n                }\n                return attr;\n            },\n            click: function (e) {\n                var attributes = this._getAttributes($(e.target));\n                var action = attributes.action;\n                if (action && this[action]) {\n                    this[action](attributes);\n                }\n                this.trigger('click', this.eventData(action, e.target));\n            },\n            eventData: function (action, target) {\n                var elements = this.selectedElements(), length = elements.length, shapes = [], connections = [], element;\n                for (var idx = 0; idx < length; idx++) {\n                    element = elements[idx];\n                    if (element instanceof Shape) {\n                        shapes.push(element);\n                    } else {\n                        connections.push(element);\n                    }\n                }\n                return {\n                    shapes: shapes,\n                    connections: connections,\n                    action: action,\n                    target: target\n                };\n            },\n            'delete': function () {\n                var diagram = this.diagram;\n                var toRemove = diagram._triggerRemove(this.selectedElements());\n                if (toRemove.length) {\n                    this.diagram.remove(toRemove, true);\n                    this.diagram._syncChanges();\n                }\n            },\n            edit: function () {\n                var selectedElemens = this.selectedElements();\n                if (selectedElemens.length === 1) {\n                    this.diagram.edit(selectedElemens[0]);\n                }\n            },\n            rotateClockwise: function (options) {\n                var angle = parseFloat(options.step || 90);\n                this._rotate(angle);\n            },\n            rotateAnticlockwise: function (options) {\n                var angle = parseFloat(options.step || 90);\n                this._rotate(-angle);\n            },\n            _rotate: function (angle) {\n                var adorner = this.diagram._resizingAdorner;\n                adorner.angle(adorner.angle() + angle);\n                adorner.rotate();\n            },\n            selectedElements: function () {\n                return this.diagram.select();\n            },\n            createShape: function () {\n                this.diagram.createShape();\n            },\n            createConnection: function () {\n                this.diagram.createConnection();\n            },\n            undo: function () {\n                this.diagram.undo();\n            },\n            redo: function () {\n                this.diagram.redo();\n            },\n            destroy: function () {\n                this.diagram = null;\n                this.element = null;\n                this.options = null;\n                if (this._toolBar) {\n                    this._toolBar.destroy();\n                }\n                if (this._popup) {\n                    this._popup.destroy();\n                }\n            }\n        });\n        var Editor = kendo.Observable.extend({\n            init: function (element, options) {\n                kendo.Observable.fn.init.call(this);\n                this.options = extend(true, {}, this.options, options);\n                this.element = element;\n                this.model = this.options.model;\n                this.fields = this._getFields();\n                this._initContainer();\n                this.createEditable();\n            },\n            options: { editors: {} },\n            _initContainer: function () {\n                this.wrapper = this.element;\n            },\n            createEditable: function () {\n                var options = this.options;\n                this.editable = new kendo.ui.Editable(this.wrapper, {\n                    fields: this.fields,\n                    target: options.target,\n                    clearContainer: false,\n                    model: this.model\n                });\n            },\n            _isEditable: function (field) {\n                return this.model.editable && this.model.editable(field);\n            },\n            _getFields: function () {\n                var fields = [];\n                var modelFields = this.model.fields;\n                for (var field in modelFields) {\n                    var result = {};\n                    if (this._isEditable(field)) {\n                        var editor = this.options.editors[field];\n                        if (editor) {\n                            result.editor = editor;\n                        }\n                        result.field = field;\n                        fields.push(result);\n                    }\n                }\n                return fields;\n            },\n            end: function () {\n                return this.editable.end();\n            },\n            destroy: function () {\n                this.editable.destroy();\n                this.editable.element.find('[' + kendo.attr('container-for') + ']').empty();\n                this.model = this.wrapper = this.element = this.columns = this.editable = null;\n            }\n        });\n        var PopupEditor = Editor.extend({\n            init: function (element, options) {\n                Editor.fn.init.call(this, element, options);\n                this.bind(this.events, this.options);\n                this.open();\n            },\n            events: [\n                'update',\n                'cancel'\n            ],\n            options: {\n                window: {\n                    modal: true,\n                    resizable: false,\n                    draggable: true,\n                    title: 'Edit',\n                    visible: false\n                }\n            },\n            _initContainer: function () {\n                var that = this;\n                this.wrapper = $('<div class=\"k-popup-edit-form\"/>').attr(kendo.attr('uid'), this.model.uid);\n                var formContent = '';\n                if (this.options.template) {\n                    formContent += this._renderTemplate();\n                    this.fields = [];\n                } else {\n                    formContent += this._renderFields();\n                }\n                formContent += this._renderButtons();\n                this.wrapper.append($('<div class=\"k-edit-form-container\"/>').append(formContent));\n                this.window = new kendo.ui.Window(this.wrapper.appendTo(this.element), this.options.window);\n                this.window.bind('close', function (e) {\n                    if (e.userTriggered) {\n                        e.sender.element.focus();\n                        that._cancelClick(e);\n                    }\n                });\n                this._attachButtonEvents();\n            },\n            _renderTemplate: function () {\n                var template = this.options.template;\n                if (typeof template === 'string') {\n                    template = window.unescape(template);\n                }\n                template = kendo.template(template)(this.model);\n                return template;\n            },\n            _renderFields: function () {\n                var form = '';\n                for (var i = 0; i < this.fields.length; i++) {\n                    var field = this.fields[i];\n                    form += '<div class=\"k-edit-label\"><label for=\"' + field.field + '\">' + (field.field || '') + '</label></div>';\n                    if (this._isEditable(field.field)) {\n                        form += '<div ' + kendo.attr('container-for') + '=\"' + field.field + '\" class=\"k-edit-field\"></div>';\n                    }\n                }\n                return form;\n            },\n            _renderButtons: function () {\n                var form = '<div class=\"k-edit-buttons k-state-default\">';\n                form += this._createButton('update');\n                form += this._createButton('cancel');\n                form += '</div>';\n                return form;\n            },\n            _createButton: function (name) {\n                return kendo.template(BUTTON_TEMPLATE)(defaultButtons[name]);\n            },\n            _attachButtonEvents: function () {\n                this._cancelClickHandler = proxy(this._cancelClick, this);\n                this.window.element.on(CLICK + NS, 'a.k-diagram-cancel', this._cancelClickHandler);\n                this._updateClickHandler = proxy(this._updateClick, this);\n                this.window.element.on(CLICK + NS, 'a.k-diagram-update', this._updateClickHandler);\n            },\n            _updateClick: function (e) {\n                e.preventDefault();\n                this.trigger('update');\n            },\n            _cancelClick: function (e) {\n                e.preventDefault();\n                this.trigger('cancel');\n            },\n            open: function () {\n                this.window.center().open();\n            },\n            close: function () {\n                this.window.bind('deactivate', proxy(this.destroy, this)).close();\n            },\n            destroy: function () {\n                this.window.close().destroy();\n                this.window.element.off(CLICK + NS, 'a.k-diagram-cancel', this._cancelClickHandler);\n                this.window.element.off(CLICK + NS, 'a.k-diagram-update', this._updateClickHandler);\n                this._cancelClickHandler = null;\n                this._editUpdateClickHandler = null;\n                this.window = null;\n                Editor.fn.destroy.call(this);\n            }\n        });\n        function connectionSelector(container, options) {\n            var model = this.dataSource.reader.model;\n            if (model) {\n                var textField = model.fn.fields.text ? 'text' : model.idField;\n                $('<input name=\\'' + options.field + '\\' />').appendTo(container).kendoDropDownList({\n                    dataValueField: model.idField,\n                    dataTextField: textField,\n                    dataSource: this.dataSource.data().toJSON(),\n                    optionLabel: ' ',\n                    valuePrimitive: true\n                });\n            }\n        }\n        function InactiveItem(dataItem) {\n            this.dataItem = dataItem;\n            this.callbacks = [];\n        }\n        InactiveItem.fn = InactiveItem.prototype = {\n            onActivate: function (callback) {\n                var deffered = $.Deferred();\n                this.callbacks.push({\n                    callback: callback,\n                    deferred: deffered\n                });\n                return deffered;\n            },\n            activate: function () {\n                var callbacks = this.callbacks;\n                var item;\n                for (var idx = 0; idx < callbacks.length; idx++) {\n                    item = this.callbacks[idx];\n                    item.callback(this.dataItem);\n                    item.deferred.resolve();\n                }\n                this.callbacks = [];\n            }\n        };\n        function InactiveItemsCollection() {\n            this.items = {};\n        }\n        InactiveItemsCollection.fn = InactiveItemsCollection.prototype = {\n            add: function (items) {\n                for (var idx = 0; idx < items.length; idx++) {\n                    this.items[items[idx].uid] = new InactiveItem(items[idx]);\n                }\n            },\n            forEach: function (callback) {\n                for (var uid in this.items) {\n                    callback(this.items[uid]);\n                }\n            },\n            getByUid: function (uid) {\n                return this.items[uid];\n            },\n            remove: function (item) {\n                delete this.items[item.uid];\n            }\n        };\n        var QuadRoot = Class.extend({\n            init: function () {\n                this.shapes = [];\n            },\n            _add: function (shape, bounds) {\n                this.shapes.push({\n                    bounds: bounds,\n                    shape: shape\n                });\n                shape._quadNode = this;\n            },\n            insert: function (shape, bounds) {\n                this._add(shape, bounds);\n            },\n            remove: function (shape) {\n                var shapes = this.shapes;\n                var length = shapes.length;\n                for (var idx = 0; idx < length; idx++) {\n                    if (shapes[idx].shape === shape) {\n                        shapes.splice(idx, 1);\n                        break;\n                    }\n                }\n            },\n            hitTestRect: function (rect, exclude) {\n                var shapes = this.shapes;\n                var length = shapes.length;\n                for (var i = 0; i < length; i++) {\n                    if (this._testRect(shapes[i].shape, rect) && !dataviz.inArray(shapes[i].shape, exclude)) {\n                        return true;\n                    }\n                }\n            },\n            _testRect: function (shape, rect) {\n                var angle = shape.rotate().angle;\n                var bounds = shape.bounds();\n                var hit;\n                if (!angle) {\n                    hit = bounds.overlaps(rect);\n                } else {\n                    hit = Intersect.rects(rect, bounds, -angle);\n                }\n                return hit;\n            }\n        });\n        var QuadNode = QuadRoot.extend({\n            init: function (rect) {\n                QuadRoot.fn.init.call(this);\n                this.children = [];\n                this.rect = rect;\n            },\n            inBounds: function (rect) {\n                var nodeRect = this.rect;\n                var nodeBottomRight = nodeRect.bottomRight();\n                var bottomRight = rect.bottomRight();\n                var inBounds = nodeRect.x <= rect.x && nodeRect.y <= rect.y && bottomRight.x <= nodeBottomRight.x && bottomRight.y <= nodeBottomRight.y;\n                return inBounds;\n            },\n            overlapsBounds: function (rect) {\n                return this.rect.overlaps(rect);\n            },\n            insert: function (shape, bounds) {\n                var inserted = false;\n                var children = this.children;\n                var length = children.length;\n                if (this.inBounds(bounds)) {\n                    if (!length && this.shapes.length < 4) {\n                        this._add(shape, bounds);\n                    } else {\n                        if (!length) {\n                            this._initChildren();\n                        }\n                        for (var idx = 0; idx < children.length; idx++) {\n                            if (children[idx].insert(shape, bounds)) {\n                                inserted = true;\n                                break;\n                            }\n                        }\n                        if (!inserted) {\n                            this._add(shape, bounds);\n                        }\n                    }\n                    inserted = true;\n                }\n                return inserted;\n            },\n            _initChildren: function () {\n                var rect = this.rect, children = this.children, shapes = this.shapes, center = rect.center(), halfWidth = rect.width / 2, halfHeight = rect.height / 2, childIdx, shapeIdx;\n                children.push(new QuadNode(new Rect(rect.x, rect.y, halfWidth, halfHeight)), new QuadNode(new Rect(center.x, rect.y, halfWidth, halfHeight)), new QuadNode(new Rect(rect.x, center.y, halfWidth, halfHeight)), new QuadNode(new Rect(center.x, center.y, halfWidth, halfHeight)));\n                for (shapeIdx = shapes.length - 1; shapeIdx >= 0; shapeIdx--) {\n                    for (childIdx = 0; childIdx < children.length; childIdx++) {\n                        if (children[childIdx].insert(shapes[shapeIdx].shape, shapes[shapeIdx].bounds)) {\n                            shapes.splice(shapeIdx, 1);\n                            break;\n                        }\n                    }\n                }\n            },\n            hitTestRect: function (rect, exclude) {\n                var idx;\n                var children = this.children;\n                var length = children.length;\n                var hit = false;\n                if (this.overlapsBounds(rect)) {\n                    if (QuadRoot.fn.hitTestRect.call(this, rect, exclude)) {\n                        hit = true;\n                    } else {\n                        for (idx = 0; idx < length; idx++) {\n                            if (children[idx].hitTestRect(rect, exclude)) {\n                                hit = true;\n                                break;\n                            }\n                        }\n                    }\n                }\n                return hit;\n            }\n        });\n        var ShapesQuadTree = Class.extend({\n            ROOT_SIZE: 1000,\n            init: function (diagram) {\n                var boundsChangeHandler = proxy(this._boundsChange, this);\n                diagram.bind(ITEMBOUNDSCHANGE, boundsChangeHandler);\n                diagram.bind(ITEMROTATE, boundsChangeHandler);\n                this.initRoots();\n            },\n            initRoots: function () {\n                this.rootMap = {};\n                this.root = new QuadRoot();\n            },\n            clear: function () {\n                this.initRoots();\n            },\n            _boundsChange: function (e) {\n                if (e.item._quadNode) {\n                    e.item._quadNode.remove(e.item);\n                }\n                this.insert(e.item);\n            },\n            insert: function (shape) {\n                var bounds = shape.bounds(ROTATED);\n                var rootSize = this.ROOT_SIZE;\n                var sectors = this.getSectors(bounds);\n                var x = sectors[0][0];\n                var y = sectors[1][0];\n                if (this.inRoot(sectors)) {\n                    this.root.insert(shape, bounds);\n                } else {\n                    if (!this.rootMap[x]) {\n                        this.rootMap[x] = {};\n                    }\n                    if (!this.rootMap[x][y]) {\n                        this.rootMap[x][y] = new QuadNode(new Rect(x * rootSize, y * rootSize, rootSize, rootSize));\n                    }\n                    this.rootMap[x][y].insert(shape, bounds);\n                }\n            },\n            remove: function (shape) {\n                if (shape._quadNode) {\n                    shape._quadNode.remove(shape);\n                }\n            },\n            inRoot: function (sectors) {\n                return sectors[0].length > 1 || sectors[1].length > 1;\n            },\n            getSectors: function (rect) {\n                var rootSize = this.ROOT_SIZE;\n                var bottomRight = rect.bottomRight();\n                var bottomX = math.floor(bottomRight.x / rootSize);\n                var bottomY = math.floor(bottomRight.y / rootSize);\n                var sectors = [\n                    [],\n                    []\n                ];\n                for (var x = math.floor(rect.x / rootSize); x <= bottomX; x++) {\n                    sectors[0].push(x);\n                }\n                for (var y = math.floor(rect.y / rootSize); y <= bottomY; y++) {\n                    sectors[1].push(y);\n                }\n                return sectors;\n            },\n            hitTestRect: function (rect, exclude) {\n                var sectors = this.getSectors(rect);\n                var xIdx, yIdx, x, y;\n                var root;\n                if (this.root.hitTestRect(rect, exclude)) {\n                    return true;\n                }\n                for (xIdx = 0; xIdx < sectors[0].length; xIdx++) {\n                    x = sectors[0][xIdx];\n                    for (yIdx = 0; yIdx < sectors[1].length; yIdx++) {\n                        y = sectors[1][yIdx];\n                        root = (this.rootMap[x] || {})[y];\n                        if (root && root.hitTestRect(rect, exclude)) {\n                            return true;\n                        }\n                    }\n                }\n                return false;\n            }\n        });\n        function cloneDataItem(dataItem) {\n            var result = dataItem;\n            if (dataItem instanceof kendo.data.Model) {\n                result = dataItem.toJSON();\n                result[dataItem.idField] = dataItem._defaultId;\n            }\n            return result;\n        }\n        function splitDiagramElements(elements) {\n            var connections = [];\n            var shapes = [];\n            var element, idx;\n            for (idx = 0; idx < elements.length; idx++) {\n                element = elements[idx];\n                if (element instanceof Shape) {\n                    shapes.push(element);\n                } else {\n                    connections.push(element);\n                }\n            }\n            return {\n                shapes: shapes,\n                connections: connections\n            };\n        }\n        function createModel(dataSource, model) {\n            if (dataSource.reader.model) {\n                return new dataSource.reader.model(model);\n            }\n            return new kendo.data.ObservableObject(model);\n        }\n        function clearField(field, model) {\n            if (defined(model[field])) {\n                model.set(field, null);\n            }\n        }\n        function copyDefaultOptions(mainOptions, elementOptions, fields) {\n            var field;\n            for (var idx = 0; idx < fields.length; idx++) {\n                field = fields[idx];\n                if (elementOptions && !defined(elementOptions[field])) {\n                    elementOptions[field] = mainOptions[field];\n                }\n            }\n        }\n        function translateToOrigin(visual) {\n            var bbox = visual.drawingContainer().clippedBBox(null);\n            if (bbox.origin.x !== 0 || bbox.origin.y !== 0) {\n                visual.position(-bbox.origin.x, -bbox.origin.y);\n            }\n        }\n        function preventDefault(e) {\n            e.preventDefault();\n        }\n        dataviz.ui.plugin(Diagram);\n        deepExtend(diagram, {\n            Shape: Shape,\n            Connection: Connection,\n            Connector: Connector,\n            DiagramToolBar: DiagramToolBar,\n            QuadNode: QuadNode,\n            QuadRoot: QuadRoot,\n            ShapesQuadTree: ShapesQuadTree,\n            PopupEditor: PopupEditor\n        });\n    }(window.kendo.jQuery));\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.diagram', [\n        'kendo.data',\n        'kendo.draganddrop',\n        'kendo.userevents',\n        'kendo.mobile.scroller',\n        'kendo.drawing',\n        'dataviz/diagram/utils',\n        'dataviz/diagram/math',\n        'dataviz/diagram/svg',\n        'dataviz/diagram/services',\n        'dataviz/diagram/layout',\n        'dataviz/diagram/dom'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.diagram',\n        name: 'Diagram',\n        category: 'dataviz',\n        description: 'The Kendo DataViz Diagram ',\n        depends: [\n            'data',\n            'userevents',\n            'mobile.scroller',\n            'draganddrop',\n            'drawing',\n            'dataviz.core',\n            'dataviz.themes',\n            'toolbar'\n        ],\n        features: [\n            {\n                id: 'dataviz.diagram-pdf-export',\n                name: 'PDF export',\n                description: 'Export Diagram as PDF',\n                depends: ['pdf']\n            },\n            {\n                id: 'dataviz.diagram-editing',\n                name: 'Editing',\n                description: 'Support for model editing',\n                depends: [\n                    'editable',\n                    'window',\n                    'dropdownlist'\n                ]\n            }\n        ]\n    };\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz.treemap', [\n        'kendo.data',\n        'kendo.userevents',\n        'kendo.dataviz.themes'\n    ], f);\n}(function () {\n    var __meta__ = {\n        id: 'dataviz.treeMap',\n        name: 'TreeMap',\n        category: 'dataviz',\n        description: 'The Kendo DataViz TreeMap',\n        depends: [\n            'data',\n            'userevents',\n            'dataviz.themes'\n        ]\n    };\n    (function ($, undefined) {\n        var math = Math, proxy = $.proxy, isArray = $.isArray, kendo = window.kendo, outerHeight = kendo._outerHeight, outerWidth = kendo._outerWidth, Class = kendo.Class, Widget = kendo.ui.Widget, template = kendo.template, deepExtend = kendo.deepExtend, HierarchicalDataSource = kendo.data.HierarchicalDataSource, getter = kendo.getter, dataviz = kendo.dataviz;\n        var NS = '.kendoTreeMap', CHANGE = 'change', DATA_BOUND = 'dataBound', ITEM_CREATED = 'itemCreated', MAX_VALUE = Number.MAX_VALUE, MOUSEOVER_NS = 'mouseover' + NS, MOUSELEAVE_NS = 'mouseleave' + NS, UNDEFINED = 'undefined';\n        var TreeMap = Widget.extend({\n            init: function (element, options) {\n                kendo.destroy(element);\n                $(element).empty();\n                Widget.fn.init.call(this, element, options);\n                this.wrapper = this.element;\n                this._initTheme(this.options);\n                this.element.addClass('k-widget k-treemap');\n                this._setLayout();\n                this._originalOptions = deepExtend({}, this.options);\n                this._initDataSource();\n                this._attachEvents();\n                kendo.notify(this, dataviz.ui);\n            },\n            options: {\n                name: 'TreeMap',\n                theme: 'default',\n                autoBind: true,\n                textField: 'text',\n                valueField: 'value',\n                colorField: 'color'\n            },\n            events: [\n                DATA_BOUND,\n                ITEM_CREATED\n            ],\n            _initTheme: function (options) {\n                var that = this, themes = dataviz.ui.themes || {}, themeName = ((options || {}).theme || '').toLowerCase(), themeOptions = (themes[themeName] || {}).treeMap;\n                that.options = deepExtend({}, themeOptions, options);\n            },\n            _attachEvents: function () {\n                this.element.on(MOUSEOVER_NS, proxy(this._mouseover, this)).on(MOUSELEAVE_NS, proxy(this._mouseleave, this));\n                this._resizeHandler = proxy(this.resize, this, false);\n                kendo.onResize(this._resizeHandler);\n            },\n            _setLayout: function () {\n                if (this.options.type === 'horizontal') {\n                    this._layout = new SliceAndDice(false);\n                    this._view = new SliceAndDiceView(this, this.options);\n                } else if (this.options.type === 'vertical') {\n                    this._layout = new SliceAndDice(true);\n                    this._view = new SliceAndDiceView(this, this.options);\n                } else {\n                    this._layout = new Squarified();\n                    this._view = new SquarifiedView(this, this.options);\n                }\n            },\n            _initDataSource: function () {\n                var that = this, options = that.options, dataSource = options.dataSource;\n                that._dataChangeHandler = proxy(that._onDataChange, that);\n                that.dataSource = HierarchicalDataSource.create(dataSource).bind(CHANGE, that._dataChangeHandler);\n                if (dataSource) {\n                    if (that.options.autoBind) {\n                        that.dataSource.fetch();\n                    }\n                }\n            },\n            setDataSource: function (dataSource) {\n                var that = this;\n                that.dataSource.unbind(CHANGE, that._dataChangeHandler);\n                that.dataSource = dataSource.bind(CHANGE, that._dataChangeHandler);\n                if (dataSource) {\n                    if (that.options.autoBind) {\n                        that.dataSource.fetch();\n                    }\n                }\n            },\n            _onDataChange: function (e) {\n                var node = e.node;\n                var items = e.items;\n                var options = this.options;\n                var item, i;\n                if (!node) {\n                    this._cleanItems();\n                    this.element.empty();\n                    item = this._wrapItem(items[0]);\n                    this._layout.createRoot(item, outerWidth(this.element), outerHeight(this.element), this.options.type === 'vertical');\n                    this._view.createRoot(item);\n                    this._root = item;\n                    this._colorIdx = 0;\n                } else {\n                    if (items.length) {\n                        var root = this._getByUid(node.uid);\n                        root.children = [];\n                        items = new kendo.data.Query(items)._sortForGrouping(options.valueField, 'desc');\n                        for (i = 0; i < items.length; i++) {\n                            item = items[i];\n                            root.children.push(this._wrapItem(item));\n                        }\n                        var htmlSize = this._view.htmlSize(root);\n                        this._layout.compute(root.children, root.coord, htmlSize);\n                        this._setColors(root.children);\n                        this._view.render(root);\n                    }\n                }\n                for (i = 0; i < items.length; i++) {\n                    items[i].load();\n                }\n                if (node) {\n                    this.trigger(DATA_BOUND, { node: node });\n                }\n            },\n            _cleanItems: function () {\n                var that = this;\n                that.angular('cleanup', function () {\n                    return { elements: that.element.find('.k-leaf div,.k-treemap-title,.k-treemap-title-vertical') };\n                });\n            },\n            _setColors: function (items) {\n                var colors = this.options.colors;\n                var colorIdx = this._colorIdx;\n                var color = colors[colorIdx % colors.length];\n                var colorRange, item;\n                if (isArray(color)) {\n                    colorRange = colorsByLength(color[0], color[1], items.length);\n                }\n                var leafNodes = false;\n                for (var i = 0; i < items.length; i++) {\n                    item = items[i];\n                    if (!defined(item.color)) {\n                        if (colorRange) {\n                            item.color = colorRange[i];\n                        } else {\n                            item.color = color;\n                        }\n                    }\n                    if (!item.dataItem.hasChildren) {\n                        leafNodes = true;\n                    }\n                }\n                if (leafNodes) {\n                    this._colorIdx++;\n                }\n            },\n            _contentSize: function (root) {\n                this.view.renderHeight(root);\n            },\n            _wrapItem: function (item) {\n                var wrap = {};\n                if (defined(this.options.valueField)) {\n                    wrap.value = getField(this.options.valueField, item);\n                }\n                if (defined(this.options.colorField)) {\n                    wrap.color = getField(this.options.colorField, item);\n                }\n                if (defined(this.options.textField)) {\n                    wrap.text = getField(this.options.textField, item);\n                }\n                wrap.level = item.level();\n                wrap.dataItem = item;\n                return wrap;\n            },\n            _getByUid: function (uid) {\n                var items = [this._root];\n                var item;\n                while (items.length) {\n                    item = items.pop();\n                    if (item.dataItem.uid === uid) {\n                        return item;\n                    }\n                    if (item.children) {\n                        items = items.concat(item.children);\n                    }\n                }\n            },\n            dataItem: function (node) {\n                var uid = $(node).attr(kendo.attr('uid')), dataSource = this.dataSource;\n                return dataSource && dataSource.getByUid(uid);\n            },\n            findByUid: function (uid) {\n                return this.element.find('.k-treemap-tile[' + kendo.attr('uid') + '=\\'' + uid + '\\']');\n            },\n            _mouseover: function (e) {\n                var target = $(e.target);\n                if (target.hasClass('k-leaf')) {\n                    this._removeActiveState();\n                    target.removeClass('k-state-hover').addClass('k-state-hover');\n                }\n            },\n            _removeActiveState: function () {\n                this.element.find('.k-state-hover').removeClass('k-state-hover');\n            },\n            _mouseleave: function () {\n                this._removeActiveState();\n            },\n            destroy: function () {\n                Widget.fn.destroy.call(this);\n                this.element.off(NS);\n                if (this.dataSource) {\n                    this.dataSource.unbind(CHANGE, this._dataChangeHandler);\n                }\n                this._root = null;\n                kendo.unbindResize(this._resizeHandler);\n                kendo.destroy(this.element);\n            },\n            items: function () {\n                return $();\n            },\n            getSize: function () {\n                return kendo.dimensions(this.element);\n            },\n            _resize: function () {\n                var root = this._root;\n                if (root) {\n                    var element = this.element;\n                    var rootElement = element.children();\n                    root.coord.width = outerWidth(element);\n                    root.coord.height = outerHeight(element);\n                    rootElement.css({\n                        width: root.coord.width,\n                        height: root.coord.height\n                    });\n                    this._resizeItems(root, rootElement);\n                }\n            },\n            _resizeItems: function (root, element) {\n                if (root.children && root.children.length) {\n                    var elements = element.children('.k-treemap-wrap').children();\n                    var child, childElement;\n                    this._layout.compute(root.children, root.coord, { text: this._view.titleSize(root, element) });\n                    for (var idx = 0; idx < root.children.length; idx++) {\n                        child = root.children[idx];\n                        childElement = elements.filter('[' + kendo.attr('uid') + '=\\'' + child.dataItem.uid + '\\']');\n                        this._view.setItemSize(child, childElement);\n                        this._resizeItems(child, childElement);\n                    }\n                }\n            },\n            setOptions: function (options) {\n                var dataSource = options.dataSource;\n                options.dataSource = undefined;\n                this._originalOptions = deepExtend(this._originalOptions, options);\n                this.options = deepExtend({}, this._originalOptions);\n                this._setLayout();\n                this._initTheme(this.options);\n                Widget.fn._setEvents.call(this, options);\n                if (dataSource) {\n                    this.setDataSource(HierarchicalDataSource.create(dataSource));\n                }\n                if (this.options.autoBind) {\n                    this.dataSource.fetch();\n                }\n            }\n        });\n        var Squarified = Class.extend({\n            createRoot: function (root, width, height) {\n                root.coord = {\n                    width: width,\n                    height: height,\n                    top: 0,\n                    left: 0\n                };\n            },\n            leaf: function (tree) {\n                return !tree.children;\n            },\n            layoutChildren: function (items, coord) {\n                var parentArea = coord.width * coord.height;\n                var totalArea = 0, itemsArea = [], i;\n                for (i = 0; i < items.length; i++) {\n                    itemsArea[i] = parseFloat(items[i].value);\n                    totalArea += itemsArea[i];\n                }\n                for (i = 0; i < itemsArea.length; i++) {\n                    items[i].area = parentArea * itemsArea[i] / totalArea;\n                }\n                var minimumSideValue = this.layoutHorizontal() ? coord.height : coord.width;\n                var firstElement = [items[0]];\n                var tail = items.slice(1);\n                this.squarify(tail, firstElement, minimumSideValue, coord);\n            },\n            squarify: function (tail, initElement, width, coord) {\n                this.computeDim(tail, initElement, width, coord);\n            },\n            computeDim: function (tail, initElement, width, coord) {\n                if (tail.length + initElement.length == 1) {\n                    var element = tail.length == 1 ? tail : initElement;\n                    this.layoutLast(element, width, coord);\n                    return;\n                }\n                if (tail.length >= 2 && initElement.length === 0) {\n                    initElement = [tail[0]];\n                    tail = tail.slice(1);\n                }\n                if (tail.length === 0) {\n                    if (initElement.length > 0) {\n                        this.layoutRow(initElement, width, coord);\n                    }\n                    return;\n                }\n                var firstElement = tail[0];\n                if (this.worstAspectRatio(initElement, width) >= this.worstAspectRatio([firstElement].concat(initElement), width)) {\n                    this.computeDim(tail.slice(1), initElement.concat([firstElement]), width, coord);\n                } else {\n                    var newCoords = this.layoutRow(initElement, width, coord);\n                    this.computeDim(tail, [], newCoords.dim, newCoords);\n                }\n            },\n            layoutLast: function (items, w, coord) {\n                items[0].coord = coord;\n            },\n            layoutRow: function (items, width, coord) {\n                if (this.layoutHorizontal()) {\n                    return this.layoutV(items, width, coord);\n                } else {\n                    return this.layoutH(items, width, coord);\n                }\n            },\n            orientation: 'h',\n            layoutVertical: function () {\n                return this.orientation === 'v';\n            },\n            layoutHorizontal: function () {\n                return this.orientation === 'h';\n            },\n            layoutChange: function () {\n                this.orientation = this.layoutVertical() ? 'h' : 'v';\n            },\n            worstAspectRatio: function (items, width) {\n                if (!items || items.length === 0) {\n                    return MAX_VALUE;\n                }\n                var areaSum = 0, maxArea = 0, minArea = MAX_VALUE;\n                for (var i = 0; i < items.length; i++) {\n                    var area = items[i].area;\n                    areaSum += area;\n                    minArea = minArea < area ? minArea : area;\n                    maxArea = maxArea > area ? maxArea : area;\n                }\n                return math.max(width * width * maxArea / (areaSum * areaSum), areaSum * areaSum / (width * width * minArea));\n            },\n            compute: function (children, rootCoord, htmlSize) {\n                if (!(rootCoord.width >= rootCoord.height && this.layoutHorizontal())) {\n                    this.layoutChange();\n                }\n                if (children && children.length > 0) {\n                    var newRootCoord = {\n                        width: rootCoord.width,\n                        height: rootCoord.height - htmlSize.text,\n                        top: 0,\n                        left: 0\n                    };\n                    this.layoutChildren(children, newRootCoord);\n                }\n            },\n            layoutV: function (items, width, coord) {\n                var totalArea = this._totalArea(items), top = 0;\n                width = round(totalArea / width);\n                for (var i = 0; i < items.length; i++) {\n                    var height = round(items[i].area / width);\n                    items[i].coord = {\n                        height: height,\n                        width: width,\n                        top: coord.top + top,\n                        left: coord.left\n                    };\n                    top += height;\n                }\n                var ans = {\n                    height: coord.height,\n                    width: coord.width - width,\n                    top: coord.top,\n                    left: coord.left + width\n                };\n                ans.dim = math.min(ans.width, ans.height);\n                if (ans.dim != ans.height) {\n                    this.layoutChange();\n                }\n                return ans;\n            },\n            layoutH: function (items, width, coord) {\n                var totalArea = this._totalArea(items);\n                var height = round(totalArea / width), top = coord.top, left = 0;\n                for (var i = 0; i < items.length; i++) {\n                    items[i].coord = {\n                        height: height,\n                        width: round(items[i].area / height),\n                        top: top,\n                        left: coord.left + left\n                    };\n                    left += items[i].coord.width;\n                }\n                var ans = {\n                    height: coord.height - height,\n                    width: coord.width,\n                    top: coord.top + height,\n                    left: coord.left\n                };\n                ans.dim = math.min(ans.width, ans.height);\n                if (ans.dim != ans.width) {\n                    this.layoutChange();\n                }\n                return ans;\n            },\n            _totalArea: function (items) {\n                var total = 0;\n                for (var i = 0; i < items.length; i++) {\n                    total += items[i].area;\n                }\n                return total;\n            }\n        });\n        var SquarifiedView = Class.extend({\n            init: function (treeMap, options) {\n                this.options = deepExtend({}, this.options, options);\n                this.treeMap = treeMap;\n                this.element = $(treeMap.element);\n                this.offset = 0;\n            },\n            titleSize: function (item, element) {\n                var text = element.children('.k-treemap-title');\n                return text.height() || 0;\n            },\n            htmlSize: function (root) {\n                var rootElement = this._getByUid(root.dataItem.uid);\n                var htmlSize = { text: 0 };\n                if (root.children) {\n                    this._clean(rootElement);\n                    var text = this._getText(root);\n                    if (text) {\n                        var title = this._createTitle(root);\n                        rootElement.append(title);\n                        this._compile(title, root.dataItem);\n                        htmlSize.text = title.height();\n                    }\n                    rootElement.append(this._createWrap());\n                    this.offset = (outerWidth(rootElement) - rootElement.innerWidth()) / 2;\n                }\n                return htmlSize;\n            },\n            _compile: function (element, dataItem) {\n                this.treeMap.angular('compile', function () {\n                    return {\n                        elements: element,\n                        data: [{ dataItem: dataItem }]\n                    };\n                });\n            },\n            _getByUid: function (uid) {\n                return this.element.find('.k-treemap-tile[' + kendo.attr('uid') + '=\\'' + uid + '\\']');\n            },\n            render: function (root) {\n                var rootElement = this._getByUid(root.dataItem.uid);\n                var children = root.children;\n                if (children) {\n                    var rootWrap = rootElement.find('.k-treemap-wrap');\n                    for (var i = 0; i < children.length; i++) {\n                        var leaf = children[i];\n                        var htmlElement = this._createLeaf(leaf);\n                        rootWrap.append(htmlElement);\n                        this._compile(htmlElement.children(), leaf.dataItem);\n                        this.treeMap.trigger(ITEM_CREATED, { element: htmlElement });\n                    }\n                }\n            },\n            createRoot: function (root) {\n                var htmlElement = this._createLeaf(root);\n                this.element.append(htmlElement);\n                this._compile(htmlElement.children(), root.dataItem);\n                this.treeMap.trigger(ITEM_CREATED, { element: htmlElement });\n            },\n            _clean: function (root) {\n                this.treeMap.angular('cleanup', function () {\n                    return { elements: root.children(':not(.k-treemap-wrap)') };\n                });\n                root.css('background-color', '');\n                root.removeClass('k-leaf');\n                root.removeClass('k-inverse');\n                root.empty();\n            },\n            _createLeaf: function (item) {\n                return this._createTile(item).css('background-color', item.color).addClass('k-leaf').toggleClass('k-inverse', this._tileColorBrightness(item) > 180).toggle(item.value !== 0).append($('<div></div>').html(this._getText(item)));\n            },\n            _createTile: function (item) {\n                var tile = $('<div class=\\'k-treemap-tile\\'></div>');\n                this.setItemSize(item, tile);\n                if (defined(item.dataItem) && defined(item.dataItem.uid)) {\n                    tile.attr(kendo.attr('uid'), item.dataItem.uid);\n                }\n                return tile;\n            },\n            _itemCoordinates: function (item) {\n                var coordinates = {\n                    width: item.coord.width,\n                    height: item.coord.height,\n                    left: item.coord.left,\n                    top: item.coord.top\n                };\n                if (coordinates.left && this.offset) {\n                    coordinates.width += this.offset * 2;\n                } else {\n                    coordinates.width += this.offset;\n                }\n                if (coordinates.top) {\n                    coordinates.height += this.offset * 2;\n                } else {\n                    coordinates.height += this.offset;\n                }\n                return coordinates;\n            },\n            setItemSize: function (item, element) {\n                var coordinates = this._itemCoordinates(item);\n                element.css({\n                    width: coordinates.width,\n                    height: coordinates.height,\n                    left: coordinates.left,\n                    top: coordinates.top\n                });\n            },\n            _getText: function (item) {\n                var text = item.text;\n                if (this.options.template) {\n                    text = this._renderTemplate(item);\n                }\n                return text;\n            },\n            _renderTemplate: function (item) {\n                var titleTemplate = template(this.options.template);\n                return titleTemplate({\n                    dataItem: item.dataItem,\n                    text: item.text\n                });\n            },\n            _createTitle: function (item) {\n                return $('<div class=\\'k-treemap-title\\'></div>').append($('<div></div>').html(this._getText(item)));\n            },\n            _createWrap: function () {\n                return $('<div class=\\'k-treemap-wrap\\'></div>');\n            },\n            _tileColorBrightness: function (item) {\n                return colorBrightness(item.color);\n            }\n        });\n        var SliceAndDice = Class.extend({\n            createRoot: function (root, width, height, vertical) {\n                root.coord = {\n                    width: width,\n                    height: height,\n                    top: 0,\n                    left: 0\n                };\n                root.vertical = vertical;\n            },\n            init: function (vertical) {\n                this.vertical = vertical;\n                this.quotient = vertical ? 1 : 0;\n            },\n            compute: function (children, rootCoord, htmlSize) {\n                if (children.length > 0) {\n                    var width = rootCoord.width;\n                    var height = rootCoord.height;\n                    if (this.vertical) {\n                        height -= htmlSize.text;\n                    } else {\n                        width -= htmlSize.text;\n                    }\n                    var newRootCoord = {\n                        width: width,\n                        height: height,\n                        top: 0,\n                        left: 0\n                    };\n                    this.layoutChildren(children, newRootCoord);\n                }\n            },\n            layoutChildren: function (items, coord) {\n                var parentArea = coord.width * coord.height;\n                var totalArea = 0;\n                var itemsArea = [];\n                var i;\n                for (i = 0; i < items.length; i++) {\n                    var item = items[i];\n                    itemsArea[i] = parseFloat(items[i].value);\n                    totalArea += itemsArea[i];\n                    item.vertical = this.vertical;\n                }\n                for (i = 0; i < itemsArea.length; i++) {\n                    items[i].area = parentArea * itemsArea[i] / totalArea;\n                }\n                this.sliceAndDice(items, coord);\n            },\n            sliceAndDice: function (items, coord) {\n                var totalArea = this._totalArea(items);\n                if (items[0].level % 2 === this.quotient) {\n                    this.layoutHorizontal(items, coord, totalArea);\n                } else {\n                    this.layoutVertical(items, coord, totalArea);\n                }\n            },\n            layoutHorizontal: function (items, coord, totalArea) {\n                var left = 0;\n                for (var i = 0; i < items.length; i++) {\n                    var item = items[i];\n                    var width = item.area / (totalArea / coord.width);\n                    item.coord = {\n                        height: coord.height,\n                        width: width,\n                        top: coord.top,\n                        left: coord.left + left\n                    };\n                    left += width;\n                }\n            },\n            layoutVertical: function (items, coord, totalArea) {\n                var top = 0;\n                for (var i = 0; i < items.length; i++) {\n                    var item = items[i];\n                    var height = item.area / (totalArea / coord.height);\n                    item.coord = {\n                        height: height,\n                        width: coord.width,\n                        top: coord.top + top,\n                        left: coord.left\n                    };\n                    top += height;\n                }\n            },\n            _totalArea: function (items) {\n                var total = 0;\n                for (var i = 0; i < items.length; i++) {\n                    total += items[i].area;\n                }\n                return total;\n            }\n        });\n        var SliceAndDiceView = SquarifiedView.extend({\n            htmlSize: function (root) {\n                var rootElement = this._getByUid(root.dataItem.uid);\n                var htmlSize = {\n                    text: 0,\n                    offset: 0\n                };\n                if (root.children) {\n                    this._clean(rootElement);\n                    var text = this._getText(root);\n                    if (text) {\n                        var title = this._createTitle(root);\n                        rootElement.append(title);\n                        this._compile(title, root.dataItem);\n                        if (root.vertical) {\n                            htmlSize.text = title.height();\n                        } else {\n                            htmlSize.text = title.width();\n                        }\n                    }\n                    rootElement.append(this._createWrap());\n                    this.offset = (outerWidth(rootElement) - rootElement.innerWidth()) / 2;\n                }\n                return htmlSize;\n            },\n            titleSize: function (item, element) {\n                var size;\n                if (item.vertical) {\n                    size = element.children('.k-treemap-title').height();\n                } else {\n                    size = element.children('.k-treemap-title-vertical').width();\n                }\n                return size || 0;\n            },\n            _createTitle: function (item) {\n                var title;\n                if (item.vertical) {\n                    title = $('<div class=\\'k-treemap-title\\'></div>');\n                } else {\n                    title = $('<div class=\\'k-treemap-title-vertical\\'></div>');\n                }\n                return title.append($('<div></div>').html(this._getText(item)));\n            }\n        });\n        function getField(field, row) {\n            if (row === null) {\n                return row;\n            }\n            var get = getter(field, true);\n            return get(row);\n        }\n        function defined(value) {\n            return typeof value !== UNDEFINED;\n        }\n        function colorsByLength(min, max, length) {\n            var minRGBtoDecimal = rgbToDecimal(min);\n            var maxRGBtoDecimal = rgbToDecimal(max);\n            var isDarker = colorBrightness(min) - colorBrightness(max) < 0;\n            var colors = [];\n            colors.push(min);\n            for (var i = 0; i < length; i++) {\n                var rgbColor = {\n                    r: colorByIndex(minRGBtoDecimal.r, maxRGBtoDecimal.r, i, length, isDarker),\n                    g: colorByIndex(minRGBtoDecimal.g, maxRGBtoDecimal.g, i, length, isDarker),\n                    b: colorByIndex(minRGBtoDecimal.b, maxRGBtoDecimal.b, i, length, isDarker)\n                };\n                colors.push(buildColorFromRGB(rgbColor));\n            }\n            colors.push(max);\n            return colors;\n        }\n        function colorByIndex(min, max, index, length, isDarker) {\n            var minColor = math.min(math.abs(min), math.abs(max));\n            var maxColor = math.max(math.abs(min), math.abs(max));\n            var step = (maxColor - minColor) / (length + 1);\n            var currentStep = step * (index + 1);\n            var color;\n            if (isDarker) {\n                color = minColor + currentStep;\n            } else {\n                color = maxColor - currentStep;\n            }\n            return color;\n        }\n        function buildColorFromRGB(color) {\n            return '#' + decimalToRgb(color.r) + decimalToRgb(color.g) + decimalToRgb(color.b);\n        }\n        function rgbToDecimal(color) {\n            color = color.replace('#', '');\n            var rgbColor = colorToRGB(color);\n            return {\n                r: rgbToHex(rgbColor.r),\n                g: rgbToHex(rgbColor.g),\n                b: rgbToHex(rgbColor.b)\n            };\n        }\n        function decimalToRgb(number) {\n            var result = math.round(number).toString(16).toUpperCase();\n            if (result.length === 1) {\n                result = '0' + result;\n            }\n            return result;\n        }\n        function colorToRGB(color) {\n            var colorLength = color.length;\n            var rgbColor = {};\n            if (colorLength === 3) {\n                rgbColor.r = color[0];\n                rgbColor.g = color[1];\n                rgbColor.b = color[2];\n            } else {\n                rgbColor.r = color.substring(0, 2);\n                rgbColor.g = color.substring(2, 4);\n                rgbColor.b = color.substring(4, 6);\n            }\n            return rgbColor;\n        }\n        function rgbToHex(rgb) {\n            return parseInt(rgb.toString(16), 16);\n        }\n        function colorBrightness(color) {\n            var brightness = 0;\n            if (color) {\n                color = rgbToDecimal(color);\n                brightness = math.sqrt(0.241 * color.r * color.r + 0.691 * color.g * color.g + 0.068 * color.b * color.b);\n            }\n            return brightness;\n        }\n        function round(value) {\n            var power = math.pow(10, 4);\n            return math.round(value * power) / power;\n        }\n        dataviz.ui.plugin(TreeMap);\n    }(window.kendo.jQuery));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.angular', ['kendo.core'], f);\n}(function () {\n    var __meta__ = {\n        id: 'angular',\n        name: 'AngularJS Directives',\n        category: 'framework',\n        description: 'Adds Kendo UI for AngularJS directives',\n        depends: ['core'],\n        defer: true\n    };\n    (function ($, angular, undefined) {\n        'use strict';\n        if (!angular || !angular.injector) {\n            return;\n        }\n        var module = angular.module('kendo.directives', []), $injector = angular.injector(['ng']), $parse = $injector.get('$parse'), $timeout = $injector.get('$timeout'), $defaultCompile, $log = $injector.get('$log');\n        function withoutTimeout(f) {\n            var save = $timeout;\n            try {\n                $timeout = function (f) {\n                    return f();\n                };\n                return f();\n            } finally {\n                $timeout = save;\n            }\n        }\n        var OPTIONS_NOW;\n        var createDataSource = function () {\n            var types = {\n                TreeList: 'TreeListDataSource',\n                TreeView: 'HierarchicalDataSource',\n                Scheduler: 'SchedulerDataSource',\n                PivotGrid: 'PivotDataSource',\n                PivotConfigurator: 'PivotDataSource',\n                PanelBar: 'HierarchicalDataSource',\n                Menu: '$PLAIN',\n                ContextMenu: '$PLAIN'\n            };\n            var toDataSource = function (dataSource, type) {\n                if (type == '$PLAIN') {\n                    return dataSource;\n                }\n                return kendo.data[type].create(dataSource);\n            };\n            return function (scope, element, role, source) {\n                var type = types[role] || 'DataSource';\n                var current = scope.$eval(source);\n                var ds = toDataSource(current, type);\n                scope.$watch(source, function (mew) {\n                    var widget = kendoWidgetInstance(element);\n                    if (widget && typeof widget.setDataSource == 'function') {\n                        if (mew !== current && mew !== widget.dataSource) {\n                            var ds = toDataSource(mew, type);\n                            widget.setDataSource(ds);\n                            current = mew;\n                        }\n                    }\n                });\n                return ds;\n            };\n        }();\n        var ignoredAttributes = {\n            kDataSource: true,\n            kOptions: true,\n            kRebind: true,\n            kNgModel: true,\n            kNgDelay: true\n        };\n        var ignoredOwnProperties = {\n            name: true,\n            title: true,\n            style: true\n        };\n        function createWidget(scope, element, attrs, widget, origAttr, controllers) {\n            if (!(element instanceof jQuery)) {\n                throw new Error('The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.');\n            }\n            var kNgDelay = attrs.kNgDelay, delayValue = scope.$eval(kNgDelay);\n            controllers = controllers || [];\n            var ngModel = controllers[0], ngForm = controllers[1];\n            var ctor = $(element)[widget];\n            if (!ctor) {\n                window.console.error('Could not find: ' + widget);\n                return null;\n            }\n            var parsed = parseOptions(scope, element, attrs, widget, ctor);\n            var options = parsed.options;\n            if (parsed.unresolved.length) {\n                var promises = [];\n                for (var i = 0, len = parsed.unresolved.length; i < len; i++) {\n                    var unresolved = parsed.unresolved[i];\n                    var promise = $.Deferred(function (d) {\n                        var unwatch = scope.$watch(unresolved.path, function (newValue) {\n                            if (newValue !== undefined) {\n                                unwatch();\n                                d.resolve();\n                            }\n                        });\n                    }).promise();\n                    promises.push(promise);\n                }\n                $.when.apply(null, promises).then(createIt);\n                return;\n            }\n            if (kNgDelay && !delayValue) {\n                var root = scope.$root || scope;\n                var register = function () {\n                    var unregister = scope.$watch(kNgDelay, function (newValue) {\n                        if (newValue !== undefined) {\n                            unregister();\n                            element.removeAttr(attrs.$attr.kNgDelay);\n                            kNgDelay = null;\n                            $timeout(createIt);\n                        }\n                    });\n                };\n                if (/^\\$(digest|apply)$/.test(root.$$phase)) {\n                    register();\n                } else {\n                    scope.$apply(register);\n                }\n                return;\n            } else {\n                return createIt();\n            }\n            function createIt() {\n                var originalElement;\n                if (attrs.kRebind) {\n                    originalElement = $($(element)[0].cloneNode(true));\n                }\n                options = parseOptions(scope, element, attrs, widget, ctor).options;\n                if (element.is('select')) {\n                    (function (options) {\n                        if (options.length > 0) {\n                            var first = $(options[0]);\n                            if (!/\\S/.test(first.text()) && /^\\?/.test(first.val())) {\n                                first.remove();\n                            }\n                            for (var i = 0; i < options.length; i++) {\n                                $(options[i]).off('$destroy');\n                            }\n                        }\n                    }(element[0].options));\n                }\n                var object = ctor.call(element, OPTIONS_NOW = options).data(widget);\n                exposeWidget(object, scope, attrs, widget, origAttr);\n                scope.$emit('kendoWidgetCreated', object);\n                var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);\n                if (attrs.kRebind) {\n                    setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);\n                }\n                if (attrs.kNgDisabled) {\n                    var kNgDisabled = attrs.kNgDisabled;\n                    var isDisabled = scope.$eval(kNgDisabled);\n                    if (isDisabled) {\n                        object.enable(!isDisabled);\n                    }\n                    bindToKNgDisabled(object, scope, element, kNgDisabled);\n                }\n                if (attrs.kNgReadonly) {\n                    var kNgReadonly = attrs.kNgReadonly;\n                    var isReadonly = scope.$eval(kNgReadonly);\n                    if (isReadonly) {\n                        object.readonly(isReadonly);\n                    }\n                    bindToKNgReadonly(object, scope, element, kNgReadonly);\n                }\n                if (attrs.kNgModel) {\n                    bindToKNgModel(object, scope, attrs.kNgModel);\n                }\n                if (ngModel) {\n                    bindToNgModel(object, scope, element, ngModel, ngForm);\n                }\n                if (object) {\n                    propagateClassToWidgetWrapper(object, element);\n                }\n                return object;\n            }\n        }\n        function parseOptions(scope, element, attrs, widget, ctor) {\n            var role = widget.replace(/^kendo/, '');\n            var unresolved = [];\n            var optionsPath = attrs.kOptions || attrs.options;\n            var optionsValue = scope.$eval(optionsPath);\n            if (optionsPath && optionsValue === undefined) {\n                unresolved.push({\n                    option: 'options',\n                    path: optionsPath\n                });\n            }\n            var options = angular.extend({}, attrs.defaultOptions, optionsValue);\n            function addOption(name, value) {\n                var scopeValue = angular.copy(scope.$eval(value));\n                if (scopeValue === undefined) {\n                    unresolved.push({\n                        option: name,\n                        path: value\n                    });\n                } else {\n                    options[name] = scopeValue;\n                }\n            }\n            var widgetOptions = ctor.widget.prototype.options;\n            var widgetEvents = ctor.widget.prototype.events;\n            $.each(attrs, function (name, value) {\n                if (name === 'source' || name === 'kDataSource' || name === 'kScopeField' || name === 'scopeField') {\n                    return;\n                }\n                var dataName = 'data' + name.charAt(0).toUpperCase() + name.slice(1);\n                if (name.indexOf('on') === 0) {\n                    var eventKey = name.replace(/^on./, function (prefix) {\n                        return prefix.charAt(2).toLowerCase();\n                    });\n                    if (widgetEvents.indexOf(eventKey) > -1) {\n                        options[eventKey] = value;\n                    }\n                }\n                if (widgetOptions.hasOwnProperty(dataName)) {\n                    addOption(dataName, value);\n                } else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {\n                    addOption(name, value);\n                } else if (!ignoredAttributes[name]) {\n                    var match = name.match(/^k(On)?([A-Z].*)/);\n                    if (match) {\n                        var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);\n                        if (match[1] && name != 'kOnLabel') {\n                            options[optionName] = value;\n                        } else {\n                            if (name == 'kOnLabel') {\n                                optionName = 'onLabel';\n                            }\n                            addOption(optionName, value);\n                        }\n                    }\n                }\n            });\n            var dataSource = attrs.kDataSource || attrs.source;\n            if (dataSource) {\n                options.dataSource = createDataSource(scope, element, role, dataSource);\n            }\n            options.$angular = [scope];\n            return {\n                options: options,\n                unresolved: unresolved\n            };\n        }\n        function bindToKNgDisabled(widget, scope, element, kNgDisabled) {\n            if (kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar || kendo.ui.Menu && widget instanceof kendo.ui.Menu) {\n                $log.warn('k-ng-disabled specified on a widget that does not have the enable() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgDisabled, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.enable(!newValue);\n                }\n            });\n        }\n        function bindToKNgReadonly(widget, scope, element, kNgReadonly) {\n            if (typeof widget.readonly != 'function') {\n                $log.warn('k-ng-readonly specified on a widget that does not have the readonly() method: ' + widget.options.name);\n                return;\n            }\n            scope.$watch(kNgReadonly, function (newValue, oldValue) {\n                if (newValue != oldValue) {\n                    widget.readonly(newValue);\n                }\n            });\n        }\n        function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {\n            if (attrs[origAttr]) {\n                var set = $parse(attrs[origAttr]).assign;\n                if (set) {\n                    set(scope, widget);\n                } else {\n                    throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);\n                }\n            }\n        }\n        function formValue(element) {\n            if (/checkbox|radio/i.test(element.attr('type'))) {\n                return element.prop('checked');\n            }\n            return element.val();\n        }\n        var formRegExp = /^(input|select|textarea)$/i;\n        function isForm(element) {\n            return formRegExp.test(element[0].tagName);\n        }\n        function bindToNgModel(widget, scope, element, ngModel, ngForm) {\n            if (!widget.value) {\n                return;\n            }\n            var value;\n            var haveChangeOnElement = false;\n            if (isForm(element)) {\n                value = function () {\n                    return formValue(element);\n                };\n            } else {\n                value = function () {\n                    return widget.value();\n                };\n            }\n            var viewRender = function () {\n                var val = ngModel.$viewValue;\n                if (val === undefined) {\n                    val = ngModel.$modelValue;\n                }\n                if (val === undefined) {\n                    val = null;\n                }\n                haveChangeOnElement = true;\n                setTimeout(function () {\n                    haveChangeOnElement = false;\n                    if (widget) {\n                        var kNgModel = scope[widget.element.attr('k-ng-model')];\n                        if (kNgModel) {\n                            val = kNgModel;\n                        }\n                        if (widget.options.autoBind === false && !widget.listView.bound()) {\n                            if (val) {\n                                widget.value(val);\n                            }\n                        } else {\n                            widget.value(val);\n                        }\n                    }\n                }, 0);\n            };\n            ngModel.$render = viewRender;\n            setTimeout(function () {\n                if (ngModel.$render !== viewRender) {\n                    ngModel.$render = viewRender;\n                    ngModel.$render();\n                }\n            });\n            if (isForm(element)) {\n                element.on('change', function () {\n                    haveChangeOnElement = true;\n                });\n            }\n            var onChange = function (pristine) {\n                return function () {\n                    var formPristine;\n                    if (haveChangeOnElement && !element.is('select')) {\n                        return;\n                    }\n                    if (pristine && ngForm) {\n                        formPristine = ngForm.$pristine;\n                    }\n                    ngModel.$setViewValue(value());\n                    if (pristine) {\n                        ngModel.$setPristine();\n                        if (formPristine) {\n                            ngForm.$setPristine();\n                        }\n                    }\n                    digest(scope);\n                };\n            };\n            widget.first('change', onChange(false));\n            widget.first('spin', onChange(false));\n            if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {\n                widget.first('dataBound', onChange(true));\n            }\n            var currentVal = value();\n            if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {\n                if (!ngModel.$isEmpty(ngModel.$viewValue)) {\n                    widget.value(ngModel.$viewValue);\n                } else if (currentVal != null && currentVal !== '' && currentVal != ngModel.$viewValue) {\n                    ngModel.$setViewValue(currentVal);\n                }\n            }\n            ngModel.$setPristine();\n        }\n        function bindToKNgModel(widget, scope, kNgModel) {\n            if (kendo.ui.DateRangePicker && widget instanceof kendo.ui.DateRangePicker) {\n                var rangePickerModels = kNgModel.split(',');\n                var rangePickerStartModel = rangePickerModels[0].trim();\n                var rangePickerEndModel;\n                bindToKNgModel(widget._startDateInput, scope, rangePickerStartModel);\n                if (rangePickerModels[1]) {\n                    rangePickerEndModel = rangePickerModels[1].trim();\n                    bindToKNgModel(widget._endDateInput, scope, rangePickerEndModel);\n                    widget.range({\n                        start: scope[rangePickerStartModel],\n                        end: scope[rangePickerEndModel]\n                    });\n                } else {\n                    widget.range({\n                        start: scope[rangePickerStartModel],\n                        end: null\n                    });\n                }\n                return;\n            }\n            if (typeof widget.value != 'function') {\n                $log.warn('k-ng-model specified on a widget that does not have the value() method: ' + widget.options.name);\n                return;\n            }\n            var form = $(widget.element).parents('ng-form, form').first();\n            var ngForm = kendo.getter(form.attr('name'), true)(scope);\n            var getter = $parse(kNgModel);\n            var setter = getter.assign;\n            var updating = false;\n            var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect || kendo.ui.RangeSlider && widget instanceof kendo.ui.RangeSlider;\n            var length = function (value) {\n                return value && valueIsCollection ? value.length : 0;\n            };\n            var currentValueLength = length(getter(scope));\n            widget.$angular_setLogicValue(getter(scope));\n            var watchHandler = function (newValue, oldValue) {\n                if (newValue === undefined) {\n                    newValue = null;\n                }\n                if (updating || newValue == oldValue && length(newValue) == currentValueLength) {\n                    return;\n                }\n                currentValueLength = length(newValue);\n                widget.$angular_setLogicValue(newValue);\n            };\n            if (valueIsCollection) {\n                scope.$watchCollection(kNgModel, watchHandler);\n            } else {\n                scope.$watch(kNgModel, watchHandler);\n            }\n            var changeHandler = function () {\n                updating = true;\n                if (ngForm && ngForm.$pristine) {\n                    ngForm.$setDirty();\n                }\n                digest(scope, function () {\n                    setter(scope, widget.$angular_getLogicValue());\n                    currentValueLength = length(getter(scope));\n                });\n                updating = false;\n            };\n            widget.first('change', changeHandler);\n            widget.first('spin', changeHandler);\n        }\n        function destroyWidgetOnScopeDestroy(scope, widget) {\n            var deregister = scope.$on('$destroy', function () {\n                deregister();\n                if (widget) {\n                    kendo.destroy(widget.element);\n                    widget = null;\n                }\n            });\n            return deregister;\n        }\n        function propagateClassToWidgetWrapper(widget, element) {\n            if (!(window.MutationObserver && widget.wrapper)) {\n                return;\n            }\n            var prevClassList = [].slice.call($(element)[0].classList);\n            var mo = new MutationObserver(function (changes) {\n                suspend();\n                if (!widget) {\n                    return;\n                }\n                changes.forEach(function (chg) {\n                    var w = $(widget.wrapper)[0];\n                    switch (chg.attributeName) {\n                    case 'class':\n                        var currClassList = [].slice.call(chg.target.classList);\n                        currClassList.forEach(function (cls) {\n                            if (prevClassList.indexOf(cls) < 0) {\n                                w.classList.add(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.add(cls);\n                                }\n                            }\n                        });\n                        prevClassList.forEach(function (cls) {\n                            if (currClassList.indexOf(cls) < 0) {\n                                w.classList.remove(cls);\n                                if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) {\n                                    widget.input[0].classList.remove(cls);\n                                }\n                            }\n                        });\n                        prevClassList = currClassList;\n                        break;\n                    case 'disabled':\n                        if (typeof widget.enable == 'function' && !widget.element.attr('readonly')) {\n                            widget.enable(!$(chg.target).attr('disabled'));\n                        }\n                        break;\n                    case 'readonly':\n                        if (typeof widget.readonly == 'function' && !widget.element.attr('disabled')) {\n                            widget.readonly(!!$(chg.target).attr('readonly'));\n                        }\n                        break;\n                    }\n                });\n                resume();\n            });\n            function suspend() {\n                mo.disconnect();\n            }\n            function resume() {\n                mo.observe($(element)[0], { attributes: true });\n            }\n            resume();\n            widget.first('destroy', suspend);\n        }\n        function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {\n            var unregister = scope.$watch(rebindAttr, function (newValue, oldValue) {\n                if (!widget._muteRebind && newValue !== oldValue) {\n                    unregister();\n                    if (attrs._cleanUp) {\n                        attrs._cleanUp();\n                    }\n                    var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];\n                    if (templateOptions) {\n                        templateOptions.forEach(function (name) {\n                            var templateContents = scope.$eval(attrs['k' + name]);\n                            if (templateContents) {\n                                originalElement.append($(templateContents).attr(kendo.toHyphens('k' + name), ''));\n                            }\n                        });\n                    }\n                    var _wrapper = $(widget.wrapper)[0];\n                    var _element = $(widget.element)[0];\n                    var isUpload = widget.options.name === 'Upload';\n                    if (isUpload) {\n                        element = $(_element);\n                    }\n                    var compile = element.injector().get('$compile');\n                    widget._destroy();\n                    if (destroyRegister) {\n                        destroyRegister();\n                    }\n                    widget = null;\n                    if (_element) {\n                        if (_wrapper) {\n                            _wrapper.parentNode.replaceChild(_element, _wrapper);\n                        }\n                        $(element).replaceWith(originalElement);\n                    }\n                    compile(originalElement)(scope);\n                }\n            }, true);\n            digest(scope);\n        }\n        function bind(f, obj) {\n            return function (a, b) {\n                return f.call(obj, a, b);\n            };\n        }\n        function setTemplate(key, value) {\n            this[key] = kendo.stringify(value);\n        }\n        module.factory('directiveFactory', [\n            '$compile',\n            function (compile) {\n                var kendoRenderedTimeout;\n                var RENDERED = false;\n                $defaultCompile = compile;\n                var create = function (role, origAttr) {\n                    return {\n                        restrict: 'AC',\n                        require: [\n                            '?ngModel',\n                            '^?form'\n                        ],\n                        scope: false,\n                        controller: [\n                            '$scope',\n                            '$attrs',\n                            '$element',\n                            function ($scope, $attrs) {\n                                this.template = bind(setTemplate, $attrs);\n                                $attrs._cleanUp = bind(function () {\n                                    this.template = null;\n                                    $attrs._cleanUp = null;\n                                }, this);\n                            }\n                        ],\n                        link: function (scope, element, attrs, controllers) {\n                            var $element = $(element);\n                            var roleattr = role.replace(/([A-Z])/g, '-$1');\n                            $element.attr(roleattr, $element.attr('data-' + roleattr));\n                            $element[0].removeAttribute('data-' + roleattr);\n                            var widget = createWidget(scope, element, attrs, role, origAttr, controllers);\n                            if (!widget) {\n                                return;\n                            }\n                            if (kendoRenderedTimeout) {\n                                clearTimeout(kendoRenderedTimeout);\n                            }\n                            kendoRenderedTimeout = setTimeout(function () {\n                                scope.$emit('kendoRendered');\n                                if (!RENDERED) {\n                                    RENDERED = true;\n                                    $('form').each(function () {\n                                        var form = $(this).controller('form');\n                                        if (form) {\n                                            form.$setPristine();\n                                        }\n                                    });\n                                }\n                            });\n                        }\n                    };\n                };\n                return { create: create };\n            }\n        ]);\n        var TAGNAMES = {\n            Editor: 'textarea',\n            NumericTextBox: 'input',\n            DatePicker: 'input',\n            DateTimePicker: 'input',\n            TimePicker: 'input',\n            AutoComplete: 'input',\n            ColorPicker: 'input',\n            MaskedTextBox: 'input',\n            MultiSelect: 'input',\n            Upload: 'input',\n            Validator: 'form',\n            Button: 'button',\n            MobileButton: 'a',\n            MobileBackButton: 'a',\n            MobileDetailButton: 'a',\n            ListView: 'ul',\n            MobileListView: 'ul',\n            ScrollView: 'div',\n            PanelBar: 'ul',\n            TreeView: 'ul',\n            Menu: 'ul',\n            ContextMenu: 'ul',\n            ActionSheet: 'ul',\n            Switch: 'input'\n        };\n        var SKIP_SHORTCUTS = [\n            'MobileView',\n            'MobileDrawer',\n            'MobileLayout',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileModalView'\n        ];\n        var MANUAL_DIRECTIVES = [\n            'MobileApplication',\n            'MobileView',\n            'MobileModalView',\n            'MobileLayout',\n            'MobileActionSheet',\n            'MobileDrawer',\n            'MobileSplitView',\n            'MobilePane',\n            'MobileScrollView',\n            'MobilePopOver'\n        ];\n        angular.forEach([\n            'MobileNavBar',\n            'MobileButton',\n            'MobileBackButton',\n            'MobileDetailButton',\n            'MobileTabStrip',\n            'MobileScrollView',\n            'MobileScroller'\n        ], function (widget) {\n            MANUAL_DIRECTIVES.push(widget);\n            widget = 'kendo' + widget;\n            module.directive(widget, function () {\n                return {\n                    restrict: 'A',\n                    link: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, widget, widget);\n                    }\n                };\n            });\n        });\n        function createDirectives(klass, isMobile) {\n            function make(directiveName, widgetName) {\n                module.directive(directiveName, [\n                    'directiveFactory',\n                    function (directiveFactory) {\n                        return directiveFactory.create(widgetName, directiveName);\n                    }\n                ]);\n            }\n            var name = isMobile ? 'Mobile' : '';\n            name += klass.fn.options.name;\n            var className = name;\n            var shortcut = 'kendo' + name.charAt(0) + name.substr(1).toLowerCase();\n            name = 'kendo' + name;\n            var dashed = name.replace(/([A-Z])/g, '-$1');\n            if (SKIP_SHORTCUTS.indexOf(name.replace('kendo', '')) == -1) {\n                var names = name === shortcut ? [name] : [\n                    name,\n                    shortcut\n                ];\n                angular.forEach(names, function (directiveName) {\n                    module.directive(directiveName, function () {\n                        return {\n                            restrict: 'E',\n                            replace: true,\n                            template: function (element, attributes) {\n                                var tag = TAGNAMES[className] || 'div';\n                                var scopeField = attributes.kScopeField || attributes.scopeField;\n                                return '<' + tag + ' ' + dashed + (scopeField ? '=\"' + scopeField + '\"' : '') + '>' + element.html() + '</' + tag + '>';\n                            }\n                        };\n                    });\n                });\n            }\n            if (MANUAL_DIRECTIVES.indexOf(name.replace('kendo', '')) > -1) {\n                return;\n            }\n            make(name, name);\n            if (shortcut != name) {\n                make(shortcut, name);\n            }\n        }\n        function kendoWidgetInstance(el) {\n            el = $(el);\n            return kendo.widgetInstance(el, kendo.ui) || kendo.widgetInstance(el, kendo.mobile.ui) || kendo.widgetInstance(el, kendo.dataviz.ui);\n        }\n        function digest(scope, func) {\n            var root = scope.$root || scope;\n            var isDigesting = /^\\$(digest|apply)$/.test(root.$$phase);\n            if (func) {\n                if (isDigesting) {\n                    func();\n                } else {\n                    root.$apply(func);\n                }\n            } else if (!isDigesting) {\n                root.$digest();\n            }\n        }\n        function destroyScope(scope, el) {\n            scope.$destroy();\n            if (el) {\n                $(el).removeData('$scope').removeData('$$kendoScope').removeData('$isolateScope').removeData('$isolateScopeNoTemplate').removeClass('ng-scope');\n            }\n        }\n        var encode = kendo.htmlEncode;\n        var open = /{{/g;\n        var close = /}}/g;\n        var encOpen = '{&#8203;{';\n        var encClose = '}&#8203;}';\n        kendo.htmlEncode = function (str) {\n            return encode(str).replace(open, encOpen).replace(close, encClose);\n        };\n        var pendingPatches = [];\n        function defadvice(klass, methodName, func) {\n            if ($.isArray(klass)) {\n                return angular.forEach(klass, function (klass) {\n                    defadvice(klass, methodName, func);\n                });\n            }\n            if (typeof klass == 'string') {\n                var a = klass.split('.');\n                var x = kendo;\n                while (x && a.length > 0) {\n                    x = x[a.shift()];\n                }\n                if (!x) {\n                    pendingPatches.push([\n                        klass,\n                        methodName,\n                        func\n                    ]);\n                    return false;\n                }\n                klass = x.prototype;\n            }\n            var origMethod = klass[methodName];\n            klass[methodName] = function () {\n                var self = this, args = arguments;\n                return func.apply({\n                    self: self,\n                    next: function () {\n                        return origMethod.apply(self, arguments.length > 0 ? arguments : args);\n                    }\n                }, args);\n            };\n            return true;\n        }\n        kendo.onWidgetRegistered(function (entry) {\n            pendingPatches = $.grep(pendingPatches, function (args) {\n                return !defadvice.apply(null, args);\n            });\n            createDirectives(entry.widget, entry.prefix == 'Mobile');\n        });\n        defadvice([\n            'ui.Widget',\n            'mobile.ui.Widget'\n        ], 'angular', function (cmd, arg) {\n            var self = this.self;\n            if (cmd == 'init') {\n                if (!arg && OPTIONS_NOW) {\n                    arg = OPTIONS_NOW;\n                }\n                OPTIONS_NOW = null;\n                if (arg && arg.$angular) {\n                    self.$angular_scope = arg.$angular[0];\n                    self.$angular_init(self.element, arg);\n                }\n                return;\n            }\n            var scope = self.$angular_scope;\n            if (scope) {\n                withoutTimeout(function () {\n                    var x = arg(), elements = x.elements, data = x.data;\n                    if (elements.length > 0) {\n                        switch (cmd) {\n                        case 'cleanup':\n                            angular.forEach(elements, function (el) {\n                                var itemScope = $(el).data('$$kendoScope');\n                                if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {\n                                    destroyScope(itemScope, el);\n                                }\n                            });\n                            break;\n                        case 'compile':\n                            var injector = self.element.injector();\n                            var compile = injector ? injector.get('$compile') : $defaultCompile;\n                            angular.forEach(elements, function (el, i) {\n                                var itemScope;\n                                if (x.scopeFrom) {\n                                    itemScope = x.scopeFrom;\n                                } else {\n                                    var vars = data && data[i];\n                                    if (vars !== undefined) {\n                                        itemScope = $.extend(scope.$new(), vars);\n                                        itemScope.$$kendoScope = true;\n                                    } else {\n                                        itemScope = scope;\n                                    }\n                                }\n                                $(el).data('$$kendoScope', itemScope);\n                                compile(el)(itemScope);\n                            });\n                            digest(scope);\n                            break;\n                        }\n                    }\n                });\n            }\n        });\n        defadvice('ui.Widget', '$angular_getLogicValue', function () {\n            return this.self.value();\n        });\n        defadvice('ui.Widget', '$angular_setLogicValue', function (val) {\n            this.self.value(val);\n        });\n        defadvice('ui.Select', '$angular_getLogicValue', function () {\n            var item = this.self.dataItem(), valueField = this.self.options.dataValueField;\n            if (item) {\n                if (this.self.options.valuePrimitive) {\n                    if (!!valueField) {\n                        return item[valueField];\n                    } else {\n                        return item;\n                    }\n                } else {\n                    return item.toJSON();\n                }\n            } else {\n                return null;\n            }\n        });\n        defadvice('ui.Select', '$angular_setLogicValue', function (val) {\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var text = options.text || '';\n            if (val === undefined) {\n                val = '';\n            }\n            if (valueField && !options.valuePrimitive && val) {\n                text = val[options.dataTextField] || '';\n                val = val[valueField || options.dataTextField];\n            }\n            if (self.options.autoBind === false && !self.listView.bound()) {\n                if (!text && val && options.valuePrimitive) {\n                    self.value(val);\n                } else {\n                    self._preselect(val, text);\n                }\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.MultiSelect', '$angular_getLogicValue', function () {\n            var value = this.self.dataItems().slice(0);\n            var valueField = this.self.options.dataValueField;\n            if (valueField && this.self.options.valuePrimitive) {\n                value = $.map(value, function (item) {\n                    return item[valueField];\n                });\n            }\n            return value;\n        });\n        defadvice('ui.MultiSelect', '$angular_setLogicValue', function (val) {\n            if (val == null) {\n                val = [];\n            }\n            var self = this.self;\n            var options = self.options;\n            var valueField = options.dataValueField;\n            var data = val;\n            if (valueField && !options.valuePrimitive) {\n                val = $.map(val, function (item) {\n                    return item[valueField];\n                });\n            }\n            if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {\n                self._preselect(data, val);\n            } else {\n                self.value(val);\n            }\n        });\n        defadvice('ui.Widget', '$angular_init', function (element, options) {\n            var self = this.self;\n            if (options && !$.isArray(options)) {\n                var scope = self.$angular_scope;\n                for (var i = self.events.length; --i >= 0;) {\n                    var event = self.events[i];\n                    var handler = options[event];\n                    if (handler && typeof handler == 'string') {\n                        options[event] = self.$angular_makeEventHandler(event, scope, handler);\n                    }\n                }\n            }\n        });\n        defadvice('ui.Widget', '$angular_makeEventHandler', function (event, scope, handler) {\n            handler = $parse(handler);\n            return function (e) {\n                digest(scope, function () {\n                    handler(scope, { kendoEvent: e });\n                });\n            };\n        });\n        defadvice([\n            'ui.Grid',\n            'ui.ListView',\n            'ui.TreeView',\n            'ui.PanelBar'\n        ], '$angular_makeEventHandler', function (event, scope, handler) {\n            if (event != 'change') {\n                return this.next();\n            }\n            handler = $parse(handler);\n            return function (ev) {\n                var widget = ev.sender;\n                var options = widget.options;\n                var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;\n                if (angular.isString(options.selectable)) {\n                    cell = options.selectable.indexOf('cell') !== -1;\n                    multiple = options.selectable.indexOf('multiple') !== -1;\n                }\n                if (widget._checkBoxSelection) {\n                    multiple = true;\n                }\n                elems = locals.selected = this.select();\n                items = locals.data = [];\n                columns = locals.columns = [];\n                for (var i = 0; i < elems.length; i++) {\n                    var item = cell ? elems[i].parentNode : elems[i];\n                    var dataItem = widget.dataItem(item);\n                    if (cell) {\n                        if (angular.element.inArray(dataItem, items) < 0) {\n                            items.push(dataItem);\n                        }\n                        colIdx = angular.element(elems[i]).index();\n                        if (angular.element.inArray(colIdx, columns) < 0) {\n                            columns.push(colIdx);\n                        }\n                    } else {\n                        items.push(dataItem);\n                    }\n                }\n                if (!multiple) {\n                    locals.dataItem = locals.data = items[0];\n                    locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);\n                    locals.selected = elems[0];\n                }\n                digest(scope, function () {\n                    handler(scope, locals);\n                });\n            };\n        });\n        defadvice('ui.Grid', '$angular_init', function (element, options) {\n            this.next();\n            if (options.columns) {\n                var settings = $.extend({}, kendo.Template, options.templateSettings);\n                angular.forEach(options.columns, function (col) {\n                    if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined || col.encoded)) {\n                        col.template = '<span ng-bind=\\'' + kendo.expr(col.field, 'dataItem') + '\\'>#: ' + kendo.expr(col.field, settings.paramName) + '#</span>';\n                    }\n                });\n            }\n        });\n        {\n            defadvice('mobile.ui.ButtonGroup', 'value', function (mew) {\n                var self = this.self;\n                if (mew != null) {\n                    self.select(self.element.children('li.km-button').eq(mew));\n                    self.trigger('change');\n                    self.trigger('select', { index: self.selectedIndex });\n                }\n                return self.selectedIndex;\n            });\n            defadvice('mobile.ui.ButtonGroup', '_select', function () {\n                this.next();\n                this.self.trigger('change');\n            });\n        }\n        module.directive('kendoMobileApplication', function () {\n            return {\n                terminal: true,\n                link: function (scope, element, attrs) {\n                    createWidget(scope, element, attrs, 'kendoMobileApplication', 'kendoMobileApplication');\n                }\n            };\n        }).directive('kendoMobileView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileView', 'kendoMobileView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileDrawer', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileDrawer', 'kendoMobileDrawer');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileModalView', function () {\n            return {\n                scope: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileModalView', 'kendoMobileModalView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                        attrs._instance._scroller();\n                    }\n                }\n            };\n        }).directive('kendoMobileSplitView', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        attrs._instance = createWidget(scope, element, attrs, 'kendoMobileSplitView', 'kendoMobileSplitView');\n                    },\n                    post: function (scope, element, attrs) {\n                        attrs._instance._layout();\n                    }\n                }\n            };\n        }).directive('kendoMobilePane', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePane', 'kendoMobilePane');\n                    }\n                }\n            };\n        }).directive('kendoMobileLayout', function () {\n            return {\n                link: {\n                    pre: function (scope, element, attrs) {\n                        createWidget(scope, element, attrs, 'kendoMobileLayout', 'kendoMobileLayout');\n                    }\n                }\n            };\n        }).directive('kendoMobileActionSheet', function () {\n            return {\n                restrict: 'A',\n                link: function (scope, element, attrs) {\n                    element.find('a[k-action]').each(function () {\n                        $(this).attr('data-' + kendo.ns + 'action', $(this).attr('k-action'));\n                    });\n                    createWidget(scope, element, attrs, 'kendoMobileActionSheet', 'kendoMobileActionSheet');\n                }\n            };\n        }).directive('kendoMobilePopOver', function () {\n            return {\n                terminal: true,\n                link: {\n                    pre: function (scope, element, attrs) {\n                        attrs.defaultOptions = scope.viewOptions;\n                        createWidget(scope, element, attrs, 'kendoMobilePopOver', 'kendoMobilePopOver');\n                    }\n                }\n            };\n        }).directive('kendoViewTitle', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<span data-' + kendo.ns + 'role=\\'view-title\\'>' + element.html() + '</span>';\n                }\n            };\n        }).directive('kendoMobileHeader', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-header').attr('data-role', 'header');\n                }\n            };\n        }).directive('kendoMobileFooter', function () {\n            return {\n                restrict: 'E',\n                link: function (scope, element) {\n                    element.addClass('km-footer').attr('data-role', 'footer');\n                }\n            };\n        }).directive('kendoMobileScrollViewPage', function () {\n            return {\n                restrict: 'E',\n                replace: true,\n                template: function (element) {\n                    return '<div data-' + kendo.ns + 'role=\\'page\\'>' + element.html() + '</div>';\n                }\n            };\n        });\n        angular.forEach([\n            'align',\n            'icon',\n            'rel',\n            'transition',\n            'actionsheetContext'\n        ], function (attr) {\n            var kAttr = 'k' + attr.slice(0, 1).toUpperCase() + attr.slice(1);\n            module.directive(kAttr, function () {\n                return {\n                    restrict: 'A',\n                    priority: 2,\n                    link: function (scope, element, attrs) {\n                        element.attr(kendo.attr(kendo.toHyphens(attr)), scope.$eval(attrs[kAttr]));\n                    }\n                };\n            });\n        });\n        var WIDGET_TEMPLATE_OPTIONS = {\n            'TreeMap': ['Template'],\n            'MobileListView': [\n                'HeaderTemplate',\n                'Template'\n            ],\n            'MobileScrollView': [\n                'EmptyTemplate',\n                'Template'\n            ],\n            'Grid': [\n                'AltRowTemplate',\n                'DetailTemplate',\n                'RowTemplate'\n            ],\n            'ListView': [\n                'EditTemplate',\n                'Template',\n                'AltTemplate'\n            ],\n            'Pager': [\n                'SelectTemplate',\n                'LinkTemplate'\n            ],\n            'PivotGrid': [\n                'ColumnHeaderTemplate',\n                'DataCellTemplate',\n                'RowHeaderTemplate'\n            ],\n            'Scheduler': [\n                'AllDayEventTemplate',\n                'DateHeaderTemplate',\n                'EventTemplate',\n                'MajorTimeHeaderTemplate',\n                'MinorTimeHeaderTemplate'\n            ],\n            'ScrollView': ['Template'],\n            'PanelBar': ['Template'],\n            'TreeView': ['Template'],\n            'Validator': ['ErrorTemplate']\n        };\n        (function () {\n            var templateDirectives = {};\n            angular.forEach(WIDGET_TEMPLATE_OPTIONS, function (templates, widget) {\n                angular.forEach(templates, function (template) {\n                    if (!templateDirectives[template]) {\n                        templateDirectives[template] = [];\n                    }\n                    templateDirectives[template].push('?^^kendo' + widget);\n                });\n            });\n            angular.forEach(templateDirectives, function (parents, directive) {\n                var templateName = 'k' + directive;\n                var attrName = kendo.toHyphens(templateName);\n                module.directive(templateName, function () {\n                    return {\n                        restrict: 'A',\n                        require: parents,\n                        terminal: true,\n                        compile: function ($element, $attrs) {\n                            if ($attrs[templateName] !== '') {\n                                return;\n                            }\n                            $element.removeAttr(attrName);\n                            var template = $element[0].outerHTML;\n                            return function (scope, element, attrs, controllers) {\n                                var controller;\n                                while (!controller && controllers.length) {\n                                    controller = controllers.shift();\n                                }\n                                if (!controller) {\n                                    $log.warn(attrName + ' without a matching parent widget found. It can be one of the following: ' + parents.join(', '));\n                                } else {\n                                    controller.template(templateName, template);\n                                    element.remove();\n                                }\n                            };\n                        }\n                    };\n                });\n            });\n        }());\n    }(window.kendo.jQuery, window.angular));\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));\n(function (f, define) {\n    define('kendo.dataviz', [\n        'kendo.core',\n        'kendo.fx',\n        'kendo.router',\n        'kendo.view',\n        'kendo.data.odata',\n        'kendo.data.xml',\n        'kendo.data',\n        'kendo.data.signalr',\n        'kendo.binder',\n        'kendo.userevents',\n        'kendo.draganddrop',\n        'kendo.mobile.scroller',\n        'kendo.popup',\n        'kendo.tooltip',\n        'kendo.drawing',\n        'kendo.dataviz.core',\n        'kendo.dataviz.themes',\n        'kendo.dataviz.chart',\n        'kendo.dataviz.gauge',\n        'kendo.dataviz.barcode',\n        'kendo.dataviz.qrcode',\n        'kendo.dataviz.stock',\n        'kendo.dataviz.sparkline',\n        'kendo.dataviz.map',\n        'kendo.dataviz.diagram',\n        'kendo.dataviz.treemap',\n        'kendo.angular'\n    ], f);\n}(function () {\n    'bundle all';\n    return window.kendo;\n}, typeof define == 'function' && define.amd ? define : function (a1, a2, a3) {\n    (a3 || a2)();\n}));"]}