{"version":3,"file":"kendo.core.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendocore","js","this","breakpoints","EVENT","defaultBreakpoints","small","medium","large","mediaQuery","query","Object","assign","kendo","defaults","mediaQueryList","window","matchMedia","onEnterCallbacks","onLeaveCallbacks","onChangeHandlers","kendoMediaQuery","onChangeHandler","ev","forEach","cb","matches","addEventListener","onChange","push","onEnter","media","MediaQueryListEvent","onLeave","destroy","removeEventListener","createMediaQuery","packageMetadata","name","productName","productCodes","publishDate","version","replace","licensingDocsUrl","$","undefined$1","Template","cultures","extend","each","isArray","Array","noop","math","Math","JSON","support","percentRegExp","formatRegExp","boxShadowRegExp","numberRegExp","MONTH","HOUR","ZONE","WEEKDAY","QUARTER","DATE_FIELD_MAP","G","y","q","Q","M","L","d","E","c","e","h","H","k","K","m","s","a","t","x","X","z","Z","NAME_TYPES","month","type","minLength","standAlone","quarter","weekday","dayperiod","era","FUNCTION","STRING","NUMBER","OBJECT","NULL","BOOLEAN","UNDEFINED","PREFIX","ARIA_LABELLEDBY","ARIA_LABEL","getterCache","setterCache","slice","cssPropertiesNames","noDepricateExtend","src","copyIsArray","copy","options","clone","target","arguments","i","length","deep","jQuery","isPlainObject","Class","proto","member","fn","base","that","subclass","init","apply","prototype","constructor","_initOptions","deepExtend","isPresent","value","isBlank","isString","isNumeric","isNaN","parseFloat","isDate","getTime","isFunction","preventDefault","_defaultPrevented","isDefaultPrevented","Observable","_events","bind","eventName","handlers","one","idx","original","handler","eventNames","handlersIsFunction","unbind","first","unshift","trigger","events","sender","call","splice","compilePart","part","stringPart","split","join","charAt","rest","substring","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","zeros","pad","number","digits","end","getHiddenDimensions","element","includeMargin","width","height","css","appendTo","outerWidth","outerHeight","remove","wrapResize","autosize","shouldCorrectWidth","_outerWidth","_outerHeight","parent","wrapper","closest","calculateFromHidden","hasClass","visible","is","wrapperStyle","style","elementHeight","display","position","test","add","show","hide","destination","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","RegExp","ArrayBuffer","HTMLElement","Date","testRx","agent","rxs","dflt","rx","hasOwnProperty","toCamelCase","str","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","getPropertyValue","currentStyle","size","paramName","useWithBlock","render","template","html","compile","parts","settings","argumentName","match","functionBody","Function","_slotCount","floor","debugTemplates","Error","format","console","warn","gap","indent","rep","escapable","meta","toString","quote","string","lastIndex","charCodeAt","key","holder","v","partial","mind","toJSON","isFinite","String","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","dateFormatRegExp","standardFormatRegExp","literalRegExp","commaRegExp","EMPTY","POINT","SHARP","ZERO","EN","objectToString","findCulture","culture","numberFormat","getCulture","current","pattern","decimals","groupSize","percent","symbol","currency","abbr","calendars","standard","days","names","namesAbbr","namesShort","months","AM","PM","patterns","D","F","g","T","u","Y","firstDay","twoDigitYearMax","cultureName","indexOf","calendar","groupInteger","start","integer","integerLength","newGroupSize","decimalIndex","groupSizes","shift","reverse","round","precision","negative","toFixed","min","fmt","date","minutes","result","sign","getDate","getDay","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","getTimezoneOffset","abs","formatDate","isCurrency","isPercent","customPrecision","formatAndPrecision","fraction","ch","hasGroup","hasNegativeFormat","sharpIndex","zeroIndex","hasZero","hasSharp","currencyIndex","decimal","literals","replacement","toLocaleString","exec","toLowerCase","toExponential","quoteChar","literal","lastIndexOf","rounded","max","formatNumber","values","index","placeholderFormat","parseInt","_extractFormat","_activeElement","activeElement","documentElement","_round","nonBreakingSpaceRegExp","spaceRegExp","exponentRegExp","shortTimeZoneRegExp","longTimeZoneRegExp","dateRegExp","offsetRegExp","FORMATS_SEQUENCE","STANDARD_FORMATS","exact3","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","strict","shouldUnpadZeros","count","pmHour","UTC","amDesignators","pmDesignators","hoursOffset","minutesOffset","lookAhead","longestDesignatorLength","from","sort","b","getNumber","rg","valueIdx","isInteger","unpadZero","substr","getIndexByName","lower","subLength","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","day","hours","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","setHours","adjustDST","setFullYear","internalParseDate","formats","tzoffset","offset","timezone","convert","cultureFormats","formatIdx","concat","getDefaultFormats","parseDate","parseExactDate","percentSymbol","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","scrollWidth","removeChild","isRtl","table","tbodyInnerHtml","touch","docStyle","transitions","transforms","elementProto","hasHW3D","WebKitCSSMatrix","cssFlexbox","prefix","hasTransitions","lowPrefix","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","chrome","webkit","navigator","device","browser","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","cssClass","docElement","mobileOS","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","attr","mouseAndTouchPresent","detectBrowser","edge","safari","opera","msie","mozilla","documentMode","chromiumEdge","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","clientWidth","top","addClass","eventCapture","input","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","sorted","field","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","selector","nodeList","querySelectorAll","parentNode","pushState","history","hashChange","customElements","mobileChrome","crios","msPointers","MSPointerEvent","pointers","PointerEvent","kineticScrollNeeded","effects","prepareAnimationOptions","duration","complete","teardown","completeCallback","animate","instance","queue","promise","enabled","Element","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","classes","toggleClass","kendoRemoveClass","kendoToggleClass","toggle","ampRegExp","ltRegExp","quoteRegExp","aposRegExp","gtRegExp","eventTarget","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","on","mousedown","mouseup","mousemove","mousecancel","click","resize","localUrlRe","widgets","_widgetRegisteredCallbacks","ui","fx","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","ns","getShadows","shadow","radius","blur","left","right","bottom","wrap","autowidth","percentage","windowOuterWidth","removeClass","percentWidth","percentHeight","forceDimensions","isScrollable","dataset","className","overflow","scrollLeft","el","mozila","browserVersion","obj","toHyphens","getOffset","positioned","pageYOffset","pageXOffset","parseEffects","directions","down","up","in","out","htmlEncode","unescape","decodeURIComponent","error","_","m1","m2","fromCharCode","isLocalUrl","url","expr","expression","safe","members","wrapExpression","exprToArray","filter","getter","fields","setter","innerSetter","val","prop","props","pop","accessor","get","set","guid","random","id","chars","roleSelector","role","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","suppressLog","log","Widget","KendoLicensing","validatePackage","_showWatermarkOverlay","addWatermarkOverlay","dataSource","componentTypes","componentType","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_clearCssClasses","_setEvents","_applyCssClasses","force","getSize","currentSize","_size","_resize","dimensions","setSize","removeData","_destroy","validFill","widgetName","protoOptions","__proto__","cssProperties","propertyDictionary","_altname","getValidClass","widget","propName","fillMode","fill","_ariaLabel","labelId","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","newOptions","currentOptions","themeColor","label","DataBoundWidget","dataItems","flatView","domElement","offsetHeight","notify","templateRegExp","jsonRegExp","jsonFormatRegExp","dashRegExp","parseOption","option","getAttribute","parse","parseOptions","containmentComparer","contains","resizableWidget","inArray","initWidget","roles","fullPath","widgetKeyRegExp","nodeType","widgetKey","isEmptyObject","rolesFromNamespaces","namespaces","find","addBack","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","scrollTop","opacity","loading","prependTo","plugin","register","widgetEntry","args","method","ContainerNullObject","nullObject","MobileWidget","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","focusable","isTabIndexNotNaN","nodeName","disabled","href","pseudos","parents","themes","views","touchScroller","elements","useNative","Scroller","kendoMobileScroller","suites","elementData","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","MOUSE_EVENTS","MouseEventNormalizer","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","eventMap","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","getEventMap","eventRegEx","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","kendoJQuery","context","rootjQuery","search","touchstart","touchend","keyDownCallBack","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","to","zoneAndRule","zones","zoneRules","until","findZone","info","fromOffset","toOffset","diff","tempToOffset","fromLocalOffset","toLocalOffset","toLocalDate","MS_PER_MINUTE","MS_PER_DAY","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","calcWeekInYear","weekStartDay","firstWeekInYear","newDate","addDays","moveDateToWeekStart","diffInMS","toInvariantTime","setTime","ignoreDST","difference","today","staticDate","addYear","currentDate","addLiteral","lastPart","isHour12","startsWith","text","searchString","isInDateRange","msValue","msMin","msMax","isInTimeRange","isToday","nextDay","previousDay","toUtcTime","MS_PER_HOUR","splitDateFormat","specifier","patternLength","formatLength","nameType","datePattern","replaceAll","hour12","dateFieldName","dateFields","dateFormatNames","lastDayOfMonth","last","timeOffset","weekInYear","prevWeekDate","nextWeekDate","weekNumber","firstDayOfYear","lastDayOfYear","nextYear","previousYear","stripWhitespace","createNodeIterator","iterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","child","nodeValue","animationFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","animationQueue","queueAnimation","runNextAnimation","parseQueryStringParams","params","paramParts","elementUnderCursor","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","lastExecTime","throttled","elapsed","caret","rangeElement","isPosition","selectionStart","focus","setSelectionRange","selectionEnd","selection","createTextRange","collapse","moveStart","moveEnd","select","rangeDuplicated","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","getWidgetFocusableElement","nextFocusable","addAttribute","attribute","removeAttribute","toggleAttribute","matchesMedia","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","getFileGroup","extension","withPrefix","fileTypeMap","groups","getFileSizeMessage","pow","selectorFromClasses","themeColorValues","fillValues","shapeValues","sizeValues","roundedValues","positionModeValues","resizeValues","overflowValues","layoutFlowValues","defaultValues","registerCssClass","shorthand","registerCssClasses","arr","fillModeValues","registerValues","j","newValues","currentValue","dict","widgetValues","validValue","widgetProperties","overridePrefix","registerPrefix","propertyToCssClassMap","getValidCssClass","applyStylesFromKendoAttributes","styleProps","styleProp","currentElement","$currentElement","kendoAttr","whenAll","resolveValues","remaining","deferred","Deferred","failed","rejectContexts","rejectValues","resolveContexts","updateFunc","contexts","notifyWith","done","fail","resolveWith","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","submit","fileSaver","downloadAttribute","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","saveAs","save","forceProxy","proxyModelSetters","observable","defineProperty","dirty","getSeriesColors","series","colors","item","isElement","HTMLDocument","setDefaults","path","curr","DEBUG_KENDO_TEMPLATES","class2type","_i","setScriptKey","showBanner"],"sources":["kendo.core.js"],"mappings":"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","sourcesContent":["(function (global, factory) {\n    typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n    typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n    (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendocore = global.kendocore || {}, global.kendocore.js = factory()));\n})(this, (function () {\n    let breakpoints;\n    const EVENT = \"change\";\n\n    const defaultBreakpoints = {\n        small: \"(max-width: 500px)\",\n        medium: \"(min-width: 500.1px) and (max-width: 768px)\",\n        large: \"(min-width: 768.1px)\",\n    };\n\n    function createMediaQuery(query) {\n        let mediaQueryList = window.matchMedia(query);\n        let onEnterCallbacks = [];\n        let onLeaveCallbacks = [];\n        let onChangeHandlers = [];\n        let kendoMediaQuery = { mediaQueryList };\n\n        const onChangeHandler = (ev) => {\n            onChangeHandlers.forEach((cb) => cb(ev));\n\n            if (ev.matches) {\n                onEnterCallbacks.forEach((cb) => cb(ev));\n            } else {\n                onLeaveCallbacks.forEach((cb) => cb(ev));\n            }\n        };\n\n        mediaQueryList.addEventListener(EVENT, onChangeHandler);\n\n        const onChange = (cb) => {\n            onChangeHandlers.push(cb);\n            return kendoMediaQuery;\n        };\n\n        const onEnter = (cb) => {\n            onEnterCallbacks.push(cb);\n\n            if (mediaQueryList.matches) {\n                const media = mediaQueryList.media;\n                const matches = true;\n\n                const ev = new MediaQueryListEvent(EVENT, {\n                    media,\n                    matches,\n                });\n\n                cb(ev);\n            }\n\n            return kendoMediaQuery;\n        };\n\n        const onLeave = (cb) => {\n            onLeaveCallbacks.push(cb);\n            return kendoMediaQuery;\n        };\n\n        const destroy = () => {\n            if (mediaQueryList) {\n                mediaQueryList.removeEventListener(EVENT, onChangeHandler);\n            }\n            onEnterCallbacks = null;\n            onLeaveCallbacks = null;\n            onChangeHandlers = null;\n            mediaQueryList = null;\n            kendoMediaQuery = null;\n        };\n\n        kendoMediaQuery.onChange = onChange;\n        kendoMediaQuery.onEnter = onEnter;\n        kendoMediaQuery.onLeave = onLeave;\n        kendoMediaQuery.destroy = destroy;\n\n        return kendoMediaQuery;\n    }\n\n    function mediaQuery(query) {\n        if (!query) {\n            return;\n        }\n\n        breakpoints =\n            breakpoints ||\n            Object.assign({}, defaultBreakpoints, kendo.defaults.breakpoints);\n\n        if (query in breakpoints) {\n            query = breakpoints[query];\n        }\n\n        return createMediaQuery(query);\n    }\n\n    var __meta__ = {\n        id: \"core\",\n        name: \"Core\",\n        category: \"framework\",\n        description: \"The core of the Kendo framework.\"\n    };\n\n    var packageMetadata = {\n        name: '@progress/kendo-ui',\n        productName: 'Kendo UI',\n        productCodes: ['KENDOUICOMPLETE', 'KENDOUI', 'UIASPCORE', 'KENDOMVC', 'KENDOUIMVC'],\n        publishDate: 0,\n        version: '2024.2.514'.replace(/^\\s+|\\s+$/g, ''),\n        licensingDocsUrl: 'https://docs.telerik.com/kendo-ui/intro/installation/using-license-code?utm_medium=product&utm_source=kendojquery&utm_campaign=kendo-ui-jquery-purchase-license-keys-warning'\n    };\n\n\n    (function($, window, undefined$1) {\n        var kendo = window.kendo = window.kendo || { cultures: {} },\n            extend = $.extend,\n            each = $.each,\n            isArray = Array.isArray,\n            noop = $.noop,\n            math = Math,\n            Template,\n            JSON = window.JSON || {},\n            support = {},\n            percentRegExp = /%/,\n            formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g,\n            boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i,\n            numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/,\n            MONTH = \"month\",\n            HOUR = \"hour\",\n            ZONE = \"zone\",\n            WEEKDAY = \"weekday\",\n            QUARTER = \"quarter\",\n            DATE_FIELD_MAP = {\n                \"G\": \"era\",\n                \"y\": \"year\",\n                \"q\": QUARTER,\n                \"Q\": QUARTER,\n                \"M\": MONTH,\n                \"L\": MONTH,\n                \"d\": \"day\",\n                \"E\": WEEKDAY,\n                \"c\": WEEKDAY,\n                \"e\": WEEKDAY,\n                \"h\": HOUR,\n                \"H\": HOUR,\n                \"k\": HOUR,\n                \"K\": HOUR,\n                \"m\": \"minute\",\n                \"s\": \"second\",\n                \"a\": \"dayperiod\",\n                \"t\": \"dayperiod\",\n                \"x\": ZONE,\n                \"X\": ZONE,\n                \"z\": ZONE,\n                \"Z\": ZONE\n            },\n            NAME_TYPES = {\n                month: {\n                    type: \"months\",\n                    minLength: 3,\n                    standAlone: \"L\"\n                },\n\n                quarter: {\n                    type: \"quarters\",\n                    minLength: 3,\n                    standAlone: \"q\"\n                },\n\n                weekday: {\n                    type: \"days\",\n                    minLength: {\n                        E: 0,\n                        c: 3,\n                        e: 3\n                    },\n                    standAlone: \"c\"\n                },\n\n                dayperiod: {\n                    type: \"dayPeriods\",\n                    minLength: 0\n                },\n\n                era: {\n                    type: \"eras\",\n                    minLength: 0\n                }\n            },\n            FUNCTION = \"function\",\n            STRING = \"string\",\n            NUMBER = \"number\",\n            OBJECT = \"object\",\n            NULL = \"null\",\n            BOOLEAN = \"boolean\",\n            UNDEFINED = \"undefined\",\n            PREFIX = \"prefix\",\n            ARIA_LABELLEDBY = \"aria-labelledby\",\n            ARIA_LABEL = \"aria-label\",\n            LABELIDPART = \"_label\",\n            getterCache = {},\n            setterCache = {},\n            slice = [].slice,\n            cssPropertiesNames = [ \"themeColor\", \"fillMode\", \"shape\", \"size\", \"rounded\", \"positionMode\" ],\n            // avoid extending the depricated properties in latest verions of jQuery\n            noDepricateExtend = function() {\n                var src, copyIsArray, copy, name, options, clone,\n                    target = arguments[ 0 ] || {},\n                    i = 1,\n                    length = arguments.length,\n                    deep = false;\n\n                // Handle a deep copy situation\n                if ( typeof target === \"boolean\" ) {\n                    deep = target;\n\n                    // skip the boolean and the target\n                    target = arguments[ i ] || {};\n                    i++;\n                }\n\n                // Handle case when target is a string or something (possible in deep copy)\n                if ( typeof target !== \"object\" && typeof target !== \"function\") {\n                    target = {};\n                }\n\n                // extend jQuery itself if only one argument is passed\n                if ( i === length ) {\n                    target = this;\n                    i--;\n                }\n\n                for ( ; i < length; i++ ) {\n\n                    // Only deal with non-null/undefined values\n                    if ( ( options = arguments[ i ] ) != null ) {\n\n                        // Extend the base object\n                        for ( name in options ) {\n                            // filters, concat and : properties are depricated in the jQuery 3.3.0\n                            // accessing these properties throw a warning when jQuery migrate is included\n                            if (name == \"filters\" || name == \"concat\" || name == \":\") {\n                                continue;\n                            }\n                            src = target[ name ];\n                            copy = options[ name ];\n\n                            // Prevent never-ending loop\n                            if ( target === copy ) {\n                                continue;\n                            }\n\n                            // Recurse if we're merging plain objects or arrays\n                            if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n                                ( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n                                if ( copyIsArray ) {\n                                    copyIsArray = false;\n                                    clone = src && Array.isArray( src ) ? src : [];\n\n                                } else {\n                                    clone = src && jQuery.isPlainObject( src ) ? src : {};\n                                }\n\n                                // Never move original objects, clone them\n                                target[ name ] = noDepricateExtend( deep, clone, copy );\n\n                            // Don't bring in undefined values\n                            } else if ( copy !== undefined$1 ) {\n                                target[ name ] = copy;\n                            }\n                        }\n                    }\n                }\n\n                // Return the modified object\n                return target;\n            };\n\n        kendo.version = \"2024.2.514\".replace(/^\\s+|\\s+$/g, '');\n\n        function Class() {}\n\n        Class.extend = function(proto) {\n            var base = function() {},\n                member,\n                that = this,\n                subclass = proto && proto.init ? proto.init : function() {\n                    that.apply(this, arguments);\n                },\n                fn;\n\n            base.prototype = that.prototype;\n            fn = subclass.fn = subclass.prototype = new base();\n\n            for (member in proto) {\n                if (proto[member] != null && proto[member].constructor === Object) {\n                    // Merge object members\n                    fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n                } else {\n                    fn[member] = proto[member];\n                }\n            }\n\n            fn.constructor = subclass;\n            subclass.extend = that.extend;\n\n            return subclass;\n        };\n\n        Class.prototype._initOptions = function(options) {\n            this.options = deepExtend({}, this.options, options);\n        };\n\n        const isPresent = kendo.isPresent = (value) => value !== null && value !== undefined$1;\n        const isBlank = kendo.isBlank = (value) => value === null || value === undefined$1;\n        const isString = kendo.isString = (value) => typeof value === 'string';\n        const isNumeric = kendo.isNumeric = (value) => !isNaN(value - parseFloat(value));\n        const isDate = kendo.isDate = (value) => value && value.getTime;\n        const isFunction = kendo.isFunction = (value) => typeof value === 'function';\n\n        var preventDefault = function() {\n            this._defaultPrevented = true;\n        };\n\n        var isDefaultPrevented = function() {\n            return this._defaultPrevented === true;\n        };\n\n        var Observable = Class.extend({\n            init: function() {\n                this._events = {};\n            },\n\n            bind: function(eventName, handlers, one) {\n                var that = this,\n                    idx,\n                    eventNames = typeof eventName === STRING ? [eventName] : eventName,\n                    length,\n                    original,\n                    handler,\n                    handlersIsFunction = typeof handlers === FUNCTION,\n                    events;\n\n                if (handlers === undefined$1) {\n                    for (idx in eventName) {\n                        that.bind(idx, eventName[idx]);\n                    }\n                    return that;\n                }\n\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n\n                    if (handler) {\n                        if (one) {\n                            original = handler;\n                            handler = function() {\n                                that.unbind(eventName, handler);\n                                original.apply(that, arguments);\n                            };\n                            handler.original = original;\n                        }\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.push(handler);\n                    }\n                }\n\n                return that;\n            },\n\n            one: function(eventNames, handlers) {\n                return this.bind(eventNames, handlers, true);\n            },\n\n            first: function(eventName, handlers) {\n                var that = this,\n                    idx,\n                    eventNames = typeof eventName === STRING ? [eventName] : eventName,\n                    length,\n                    handler,\n                    handlersIsFunction = typeof handlers === FUNCTION,\n                    events;\n\n                for (idx = 0, length = eventNames.length; idx < length; idx++) {\n                    eventName = eventNames[idx];\n\n                    handler = handlersIsFunction ? handlers : handlers[eventName];\n\n                    if (handler) {\n                        events = that._events[eventName] = that._events[eventName] || [];\n                        events.unshift(handler);\n                    }\n                }\n\n                return that;\n            },\n\n            trigger: function(eventName, e) {\n                var that = this,\n                    events = that._events[eventName],\n                    idx,\n                    length;\n\n                if (events) {\n                    e = e || {};\n\n                    e.sender = that;\n\n                    e._defaultPrevented = false;\n\n                    e.preventDefault = preventDefault;\n\n                    e.isDefaultPrevented = isDefaultPrevented;\n\n                    events = events.slice();\n\n                    for (idx = 0, length = events.length; idx < length; idx++) {\n                        events[idx].call(that, e);\n                    }\n\n                    return e._defaultPrevented === true;\n                }\n\n                return false;\n            },\n\n            unbind: function(eventName, handler) {\n                var that = this,\n                    events = that._events[eventName],\n                    idx;\n\n                if (eventName === undefined$1) {\n                    that._events = {};\n                } else if (events) {\n                    if (handler) {\n                        for (idx = events.length - 1; idx >= 0; idx--) {\n                            if (events[idx] === handler || events[idx].original === handler) {\n                                events.splice(idx, 1);\n                            }\n                        }\n                    } else {\n                        that._events[eventName] = [];\n                    }\n                }\n\n                return that;\n            }\n        });\n\n\n         function compilePart(part, stringPart) {\n             if (stringPart) {\n                 return \"'\" +\n                     part.split(\"'\").join(\"\\\\'\")\n                         .split('\\\\\"').join('\\\\\\\\\\\\\"')\n                         .replace(/\\n/g, \"\\\\n\")\n                         .replace(/\\r/g, \"\\\\r\")\n                         .replace(/\\t/g, \"\\\\t\") + \"'\";\n             } else {\n                 var first = part.charAt(0),\n                     rest = part.substring(1);\n\n                 if (first === \"=\") {\n                     return \"+(\" + rest + \")+\";\n                 } else if (first === \":\") {\n                     return \"+$kendoHtmlEncode(\" + rest + \")+\";\n                 } else {\n                     return \";\" + part + \";$kendoOutput+=\";\n                 }\n             }\n         }\n\n        var argumentNameRegExp = /^\\w+/,\n            encodeRegExp = /\\$\\{([^}]*)\\}/g,\n            escapedCurlyRegExp = /\\\\\\}/g,\n            curlyRegExp = /__CURLY__/g,\n            escapedSharpRegExp = /\\\\#/g,\n            sharpRegExp = /__SHARP__/g,\n            zeros = [\"\", \"0\", \"00\", \"000\", \"0000\"];\n\n        Template = {\n            paramName: \"data\", // name of the parameter of the generated template\n            useWithBlock: true, // whether to wrap the template in a with() block\n            render: function(template, data) {\n                var idx,\n                    length,\n                    html = \"\";\n\n                for (idx = 0, length = data.length; idx < length; idx++) {\n                    html += template(data[idx]);\n                }\n\n                return html;\n            },\n            compile: function(template, options) {\n                var settings = extend({}, this, options),\n                    paramName = settings.paramName,\n                    argumentName = paramName.match(argumentNameRegExp)[0],\n                    useWithBlock = settings.useWithBlock,\n                    functionBody = \"var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;\",\n                    fn,\n                    parts,\n                    idx;\n\n                if (isFunction(template)) {\n                    return template;\n                }\n\n                functionBody += useWithBlock ? \"with(\" + paramName + \"){\" : \"\";\n\n                functionBody += \"$kendoOutput=\";\n\n                parts = template\n                    .replace(escapedCurlyRegExp, \"__CURLY__\")\n                    .replace(encodeRegExp, \"#=$kendoHtmlEncode($1)#\")\n                    .replace(curlyRegExp, \"}\")\n                    .replace(escapedSharpRegExp, \"__SHARP__\")\n                    .split(\"#\");\n\n                for (idx = 0; idx < parts.length; idx ++) {\n                    functionBody += compilePart(parts[idx], idx % 2 === 0);\n                }\n\n                functionBody += useWithBlock ? \";}\" : \";\";\n\n                functionBody += \"return $kendoOutput;\";\n\n                functionBody = functionBody.replace(sharpRegExp, \"#\");\n\n                try {\n                    // This function evaluation is required for legacy support of the Kendo Template syntax - non CSP compliant.\n                    fn = new Function(argumentName, functionBody);\n                    fn._slotCount = Math.floor(parts.length / 2);\n                    return fn;\n                } catch (e) {\n                    if (kendo.debugTemplates) {\n                        window.console.warn(`Invalid template:'${template}' Generated code:'${functionBody}'`);\n                    } else {\n                        throw new Error(kendo.format(\"Invalid template:'{0}' Generated code:'{1}'\", template, functionBody));\n                    }\n                }\n            }\n        };\n\n    function pad(number, digits, end) {\n        number = number + \"\";\n        digits = digits || 2;\n        end = digits - number.length;\n\n        if (end) {\n            return zeros[digits].substring(0, end) + number;\n        }\n\n        return number;\n    }\n\n        //JSON stringify\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,\n            gap,\n            indent,\n            meta = {\n                \"\\b\": \"\\\\b\",\n                \"\\t\": \"\\\\t\",\n                \"\\n\": \"\\\\n\",\n                \"\\f\": \"\\\\f\",\n                \"\\r\": \"\\\\r\",\n                \"\\\"\": '\\\\\"',\n                \"\\\\\": \"\\\\\\\\\"\n            },\n            rep,\n            toString = {}.toString;\n\n\n        if (typeof Date.prototype.toJSON !== FUNCTION) {\n\n            Date.prototype.toJSON = function() {\n                var that = this;\n\n                return isFinite(that.valueOf()) ?\n                    pad(that.getUTCFullYear(), 4) + \"-\" +\n                    pad(that.getUTCMonth() + 1) + \"-\" +\n                    pad(that.getUTCDate()) + \"T\" +\n                    pad(that.getUTCHours()) + \":\" +\n                    pad(that.getUTCMinutes()) + \":\" +\n                    pad(that.getUTCSeconds()) + \"Z\" : null;\n            };\n\n            String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function() {\n                return this.valueOf();\n            };\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 :\n                    \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n            }) + \"\\\"\" : \"\\\"\" + string + \"\\\"\";\n        }\n\n        function str(key, holder) {\n            var i,\n                k,\n                v,\n                length,\n                mind = gap,\n                partial,\n                value = holder[key],\n                type;\n\n            if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n                value = value.toJSON(key);\n            }\n\n            if (typeof rep === FUNCTION) {\n                value = rep.call(holder, key, value);\n            }\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                        \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\" :\n                        \"[\" + 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\n                v = partial.length === 0 ? \"{}\" : gap ?\n                    \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\" :\n                    \"{\" + partial.join(\",\") + \"}\";\n                gap = mind;\n                return v;\n            }\n        }\n\n        if (typeof JSON.stringify !== FUNCTION) {\n            JSON.stringify = function(value, replacer, space) {\n                var i;\n                gap = \"\";\n                indent = \"\";\n\n                if (typeof space === NUMBER) {\n                    for (i = 0; i < space; i += 1) {\n                        indent += \" \";\n                    }\n\n                } else if (typeof space === STRING) {\n                    indent = space;\n                }\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\n                return str(\"\", { \"\": value });\n            };\n        }\n    })();\n\n    // Date and Number formatting\n    (function() {\n        var dateFormatRegExp = /EEEE|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            standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i,\n            literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g,\n            commaRegExp = /\\,/g,\n            EMPTY = \"\",\n            POINT = \".\",\n            COMMA = \",\",\n            SHARP = \"#\",\n            ZERO = \"0\",\n            PLACEHOLDER = \"??\",\n            EN = \"en-US\",\n            objectToString = {}.toString;\n\n        //cultures\n        kendo.cultures = kendo.cultures || {}; // Ensure cultures object exists\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                    decimals: 2,\n                    \",\": \",\",\n                    \".\": \".\",\n                    groupSize: [3],\n                    symbol: \"%\"\n                },\n                currency: {\n                    name: \"US Dollar\",\n                    abbr: \"USD\",\n                    pattern: [\"($n)\", \"$n\"],\n                    decimals: 2,\n                    \",\": \",\",\n                    \".\": \".\",\n                    groupSize: [3],\n                    symbol: \"$\"\n                }\n            },\n            calendars: {\n                standard: {\n                    days: {\n                        names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n                        namesAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n                        namesShort: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ]\n                    },\n                    months: {\n                        names: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n                        namesAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n                    },\n                    AM: [ \"AM\", \"am\", \"AM\" ],\n                    PM: [ \"PM\", \"pm\", \"PM\" ],\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\n\n         function findCulture(culture) {\n            if (culture) {\n                if (culture.numberFormat) {\n                    return culture;\n                }\n\n                if (typeof culture === STRING) {\n                    var cultures = kendo.cultures;\n                    return cultures[culture] || cultures[culture.split(\"-\")[0]] || null;\n                }\n\n                return null;\n            }\n\n            return null;\n        }\n\n        function getCulture(culture) {\n            if (culture) {\n                culture = findCulture(culture);\n            }\n\n            return culture || kendo.cultures.current;\n        }\n\n        function appendDesignatorsToCultures(calendars) {\n            // Don't ask. It's temporary.\n            if ((calendars.standard.AM && calendars.standard.AM.length)\n            && (calendars.standard.PM && calendars.standard.PM.length)\n            && (calendars.standard.AM.indexOf(\"PMA0\") < 0)\n            && (calendars.standard.AM.indexOf(\"AM\") > -1 || calendars.standard.PM.indexOf(\"PM\") > -1)) {\n                calendars.standard.AM.push(\"a\", \"A\", \"PMa\", \"PMA\", \"PMa0\", \"PMA0\");\n                calendars.standard.PM.push(\"p\", \"P\", \"AMp\", \"AMP\", \"AMp0\", \"AMP0\");\n            }\n        }\n\n        kendo.culture = function(cultureName) {\n            var cultures = kendo.cultures, culture;\n\n            if (cultureName !== undefined$1) {\n                culture = findCulture(cultureName) || cultures[EN];\n                culture.calendar = culture.calendars.standard;\n                cultures.current = culture;\n            } else {\n                appendDesignatorsToCultures(cultures.current.calendars);\n                return cultures.current;\n            }\n        };\n\n        kendo.findCulture = findCulture;\n        kendo.getCulture = getCulture;\n\n        //set current culture to en-US.\n        kendo.culture(EN);\n\n        function formatDate(date, format, culture) {\n            culture = getCulture(culture);\n\n            var calendar = culture.calendars.standard,\n                days = calendar.days,\n                months = calendar.months;\n\n            format = format.pattern || calendar.patterns[format] || format;\n\n            return format.replace(dateFormatRegExp, function(match) {\n                var minutes;\n                var result;\n                var sign;\n\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\" || match === \"EEEE\") {\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\" || match === \"aa\") {\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\n                    result = math.abs(minutes / 60).toString().split(\".\")[0];\n                    minutes = math.abs(minutes) - (result * 60);\n\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\n                    result = math.abs(result).toString().split(\".\")[0];\n                    result = (sign ? \"+\" : \"-\") + (match === \"zz\" ? pad(result) : result);\n                }\n\n                return result !== undefined$1 ? result : match.slice(1, match.length - 1);\n            });\n        }\n\n        //number formatting\n        function formatNumber(number, format, culture) {\n            culture = getCulture(culture);\n\n            var numberFormat = culture.numberFormat,\n                decimal = numberFormat[POINT],\n                precision = numberFormat.decimals,\n                pattern = numberFormat.pattern[0],\n                literals = [],\n                symbol,\n                isCurrency, isPercent,\n                customPrecision,\n                formatAndPrecision,\n                negative = number < 0,\n                integer,\n                fraction,\n                integerLength,\n                fractionLength,\n                replacement = EMPTY,\n                value = EMPTY,\n                idx,\n                length,\n                ch,\n                hasGroup,\n                hasNegativeFormat,\n                decimalIndex,\n                sharpIndex,\n                zeroIndex,\n                hasZero, hasSharp,\n                percentIndex,\n                currencyIndex,\n                startZeroIndex,\n                start = -1,\n                end;\n\n            //return empty string if no number\n            if (number === undefined$1) {\n                return EMPTY;\n            }\n\n            if (!isFinite(number)) {\n                return number;\n            }\n\n            //if no format then return number.toString() or number.toLocaleString() if culture.name is not defined\n            if (!format) {\n                return culture.name.length ? number.toLocaleString() : number.toString();\n            }\n\n            formatAndPrecision = standardFormatRegExp.exec(format);\n\n            // standard formatting\n            if (formatAndPrecision) {\n                format = formatAndPrecision[1].toLowerCase();\n\n                isCurrency = format === \"c\";\n                isPercent = format === \"p\";\n\n                if (isCurrency || isPercent) {\n                    //get specific number format information if format is currency or percent\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\n                customPrecision = formatAndPrecision[2];\n\n                if (customPrecision) {\n                    precision = +customPrecision;\n                }\n\n                //return number in exponential format\n                if (format === \"e\") {\n                    var exp = customPrecision ? number.toExponential(precision) : number.toExponential(); // toExponential() and toExponential(undefined) differ in FF #653438.\n\n                    return exp.replace(POINT, numberFormat[POINT]);\n                }\n\n                // multiply if format is percent\n                if (isPercent) {\n                    number *= 100;\n                }\n\n                number = round(number, precision);\n                negative = number < 0;\n                number = number.split(POINT);\n\n                integer = number[0];\n                fraction = number[1];\n\n                //exclude \"-\" if number is negative.\n                if (negative) {\n                    integer = integer.substring(1);\n                }\n\n                value = groupInteger(integer, 0, integer.length, numberFormat);\n\n                if (fraction) {\n                    value += decimal + fraction;\n                }\n\n                if (format === \"n\" && !negative) {\n                    return value;\n                }\n\n                number = EMPTY;\n\n                for (idx = 0, length = pattern.length; idx < length; idx++) {\n                    ch = pattern.charAt(idx);\n\n                    if (ch === \"n\") {\n                        number += value;\n                    } else if (ch === \"$\" || ch === \"%\") {\n                        number += symbol;\n                    } else {\n                        number += ch;\n                    }\n                }\n\n                return number;\n            }\n\n            //custom formatting\n            //\n            //separate format by sections.\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(\"\\\\\", \"\"),\n                        literal = match.slice(1).replace(quoteChar, \"\");\n\n                    literals.push(literal);\n\n                    return PLACEHOLDER;\n                });\n            }\n\n            format = format.split(\";\");\n            if (negative && format[1]) {\n                //get negative format\n                format = format[1];\n                hasNegativeFormat = true;\n            } else if (number === 0 && format[2]) {\n                //format for zeros\n                format = format[2];\n                if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n                    //return format if it is string constant.\n                    return format;\n                }\n            } else {\n                format = format[0];\n            }\n\n            percentIndex = format.indexOf(\"%\");\n            currencyIndex = format.indexOf(\"$\");\n\n            isPercent = percentIndex != -1;\n            isCurrency = currencyIndex != -1;\n\n            //multiply number if the format has percent\n            if (isPercent) {\n                number *= 100;\n            }\n\n            if (isCurrency && format[currencyIndex - 1] === \"\\\\\") {\n                format = format.split(\"\\\\\").join(\"\");\n                isCurrency = false;\n            }\n\n            if (isCurrency || isPercent) {\n                //get specific number format information if format is currency or percent\n                numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n                decimal = numberFormat[POINT];\n                precision = numberFormat.decimals;\n                symbol = numberFormat.symbol;\n            }\n\n            hasGroup = format.indexOf(COMMA) > -1;\n            if (hasGroup) {\n                format = format.replace(commaRegExp, EMPTY);\n            }\n\n            decimalIndex = format.indexOf(POINT);\n            length = format.length;\n\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\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\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\n                        while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n                            sharpIndex--;\n\n                            rounded = round(number, sharpIndex, negative);\n                        }\n\n                        idx = sharpIndex;\n                    } else if (hasZero && idx < zeroIndex) {\n                        idx = zeroIndex;\n                    }\n                }\n            }\n\n            number = round(number, idx, negative);\n\n            sharpIndex = format.indexOf(SHARP);\n            startZeroIndex = zeroIndex = format.indexOf(ZERO);\n\n            //define the index of the first digit placeholder\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\n            sharpIndex = format.lastIndexOf(SHARP);\n            zeroIndex = format.lastIndexOf(ZERO);\n\n            //define the index of the last digit placeholder\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\n            if (start == length) {\n                end = start;\n            }\n\n            if (start != -1) {\n                value = number.toString().split(POINT);\n                integer = value[0];\n                fraction = value[1] || EMPTY;\n\n                integerLength = integer.length;\n                fractionLength = fraction.length;\n\n                if (negative && (number * -1) >= 0) {\n                    negative = false;\n                }\n\n                number = format.substring(0, start);\n\n                if (negative && !hasNegativeFormat) {\n                    number += \"-\";\n                }\n\n                for (idx = start; idx < length; idx++) {\n                    ch = format.charAt(idx);\n\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\n                        if ((decimalIndex - idx) <= integerLength && decimalIndex - idx > -1) {\n                            number += integer;\n                            idx = decimalIndex;\n                        }\n\n                        if (decimalIndex === idx) {\n                            number += (fraction ? decimal : EMPTY) + fraction;\n                            idx += end - decimalIndex + 1;\n                            continue;\n                        }\n                    }\n\n                    if (ch === ZERO) {\n                        number += ch;\n                        replacement = ch;\n                    } else if (ch === SHARP) {\n                        number += replacement;\n                    }\n                }\n\n                if (hasGroup) {\n                    number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, (integerLength + start)), numberFormat);\n                }\n\n                if (end >= start) {\n                    number += format.substring(end + 1);\n                }\n\n                //replace symbol placeholders\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\n                length = literals.length;\n\n                if (length) {\n                    for (idx = 0; idx < length; idx++) {\n                        number = number.replace(PLACEHOLDER, literals[idx]);\n                    }\n                }\n            }\n\n            return number;\n        }\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\n            end = decimalIndex !== -1 ? decimalIndex : end + 1;\n\n            integer = number.substring(start, end);\n            integerLength = integer.length;\n\n            if (integerLength >= groupSize) {\n                idx = integerLength;\n                parts = [];\n\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$1 ? newGroupSize : groupSize;\n\n                    if (groupSize === 0) {\n                        if (idx > 0) {\n                            parts.push(integer.substring(0, idx));\n                        }\n                        break;\n                    }\n                }\n\n                integer = parts.reverse().join(numberFormat[COMMA]);\n                number = number.substring(0, start) + integer + number.substring(end);\n            }\n\n            return number;\n        };\n\n        var round = function(value, precision, negative) {\n            precision = precision || 0;\n\n            value = value.toString().split('e');\n            value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision)));\n\n            if (negative) {\n                value = -value;\n            }\n\n            value = value.toString().split('e');\n            value = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision));\n\n            return value.toFixed(Math.min(precision, 20));\n        };\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\n            return value !== undefined$1 ? value : \"\";\n        };\n\n        kendo.format = function(fmt) {\n            var values = arguments;\n\n            return fmt.replace(formatRegExp, function(match, index, placeholderFormat) {\n                var value = values[parseInt(index, 10) + 1];\n\n                return toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\");\n            });\n        };\n\n        kendo._extractFormat = function(format) {\n            if (format.slice(0,3) === \"{0:\") {\n                format = format.slice(3, format.length - 1);\n            }\n\n            return format;\n        };\n\n        kendo._activeElement = function() {\n            try {\n                return document.activeElement;\n            } catch (e) {\n                return document.documentElement.activeElement;\n            }\n        };\n\n        kendo._round = round;\n        kendo._outerWidth = function(element, includeMargin, calculateFromHidden) {\n            element = $(element);\n            if (calculateFromHidden) {\n                return getHiddenDimensions(element, includeMargin).width;\n            }\n\n            return $(element).outerWidth(includeMargin || false) || 0;\n        };\n        kendo._outerHeight = function(element, includeMargin, calculateFromHidden) {\n            element = $(element);\n            if (calculateFromHidden) {\n                return getHiddenDimensions(element, includeMargin).height;\n            }\n\n            return $(element).outerHeight(includeMargin || false) || 0;\n        };\n        kendo.toString = toString;\n    })();\n\n\n    (function() {\n        var nonBreakingSpaceRegExp = /\\u00A0/g,\n            spaceRegExp = /\\s/g,\n            exponentRegExp = /[eE][\\-+]?[0-9]+/,\n            shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/,\n            longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/,\n            dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\n            offsetRegExp = /[+-]\\d*/,\n            FORMATS_SEQUENCE = [ [], [ \"G\", \"g\", \"F\" ], [ \"D\", \"d\", \"y\", \"m\", \"T\", \"t\" ] ],\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                \"yyyy-MM-ddTHH:mm\",\n                \"yyyy-MM-dd HH:mm\",\n                \"yyyy/MM/dd HH:mm\"\n                ], [\n                \"yyyy/MM/dd\",\n                \"yyyy-MM-dd\",\n                \"HH:mm:ss\",\n                \"HH:mm\"\n                ]\n            ],\n            numberRegExp = {\n                2: /^\\d{1,2}/,\n                3: /^\\d{1,3}/,\n                4: /^\\d{4}/,\n                exact3: /^\\d{3}/\n            },\n            objectToString = {}.toString;\n\n        function outOfRange(value, start, end) {\n            return !(value >= start && value <= end);\n        }\n\n        function designatorPredicate(designator) {\n            return designator.charAt(0);\n        }\n\n        function mapDesignators(designators) {\n            return $.map(designators, designatorPredicate);\n        }\n\n        //if date's day is different than the typed one - adjust\n        function adjustDST(date, hours) {\n            if (!hours && date.getHours() === 23) {\n                date.setHours(date.getHours() + 2);\n            }\n        }\n\n        function lowerArray(data) {\n            var idx = 0,\n                length = data.length,\n                array = [];\n\n            for (; idx < length; idx++) {\n                array[idx] = (data[idx] + \"\").toLowerCase();\n            }\n\n            return array;\n        }\n\n        function lowerLocalInfo(localInfo) {\n            var newLocalInfo = {}, property;\n\n            for (property in localInfo) {\n                newLocalInfo[property] = lowerArray(localInfo[property]);\n            }\n\n            return newLocalInfo;\n        }\n\n        function unpadZero(value) {\n            return value.replace(/^0*/, '');\n        }\n\n        function parseExact(value, format, culture, strict, shouldUnpadZeros) {\n            if (!value) {\n                return null;\n            }\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                },\n                longestDesignatorLength = (designators) => Array.from(designators).sort((a, b) => b.length - a.length)[0].length,\n                getNumber = function(size) {\n                    var rg, match, part = \"\";\n                    if (size === 2) {\n                        for (let i = 0; i <= size; i++) {\n                            part += value[valueIdx + i] || \"\";\n                        }\n                    }\n\n                    // If the value comes in the form of 021, 022, 023 we must trim the leading zero otherwise the result will be 02 in all three cases instead of 21/22/23.\n                    if (shouldUnpadZeros && part.match(numberRegExp.exact3) && Number.isInteger(Number(part)) && Number(part) > 0) {\n                        part = unpadZero(part);\n                    } else {\n                        part = value.substr(valueIdx, size);\n                    }\n\n                    rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}');\n                    match = part.match(rg);\n\n                    if (match) {\n                        match = match[0];\n                        valueIdx += match.length;\n                        return parseInt(match, 10);\n                    }\n                    return null;\n                },\n                getIndexByName = function(names, lower, subLength) {\n                    var i = 0,\n                        length = names.length,\n                        name, nameLength,\n                        matchLength = 0,\n                        matchIdx = 0,\n                        subValue;\n\n                    for (; i < length; i++) {\n                        name = names[i];\n                        nameLength = name.length;\n                        subValue = value.substr(valueIdx, subLength || nameLength); // The `subLength` is part of the appendDesignatorsToCultures logic.\n\n                        if (lower) {\n                            subValue = subValue.toLowerCase();\n                        }\n\n                        if (subValue == name && nameLength > matchLength) {\n                            matchLength = nameLength;\n                            matchIdx = i;\n                        }\n                    }\n\n                    if (matchLength) {\n                        valueIdx += matchLength;\n                        return matchIdx + 1;\n                    }\n\n                    return null;\n                },\n                checkLiteral = function() {\n                    var result = false;\n                    if (value.charAt(valueIdx) === format[idx]) {\n                        valueIdx++;\n                        result = true;\n                    }\n                    return result;\n                },\n                calendar = culture.calendars.standard,\n                year = null,\n                month = null,\n                day = null,\n                hours = null,\n                minutes = null,\n                seconds = null,\n                milliseconds = null,\n                idx = 0,\n                valueIdx = 0,\n                literal = false,\n                date = new Date(),\n                twoDigitYearMax = calendar.twoDigitYearMax || 2029,\n                defaultYear = date.getFullYear(),\n                ch, count, length, pattern,\n                pmHour, UTC, matches,\n                amDesignators, pmDesignators,\n                hoursOffset, minutesOffset,\n                hasTime, match;\n\n            if (!format) {\n                format = \"d\"; //shord date format\n            }\n\n            //if format is part of the patterns get real format\n            pattern = calendar.patterns[format];\n            if (pattern) {\n                format = pattern;\n            }\n\n            format = format.split(\"\");\n            length = format.length;\n\n            for (; idx < length; idx++) {\n                ch = format[idx];\n\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\n                        if (day !== null && count > 2) {\n                            continue;\n                        }\n\n                        day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? \"namesAbbr\" : \"names\"], true);\n\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\n                        if (month === null || outOfRange(month, 1, 12)) {\n                            return null;\n                        }\n                        month -= 1; //because month is zero based\n                    } else if (ch === \"y\") {\n                        count = lookAhead(\"y\");\n                        year = getNumber(count);\n\n                        if (year === null) {\n                            return null;\n                        }\n\n                        if (count == 2) {\n                            if (typeof twoDigitYearMax === \"string\") {\n                                twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n                            }\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\n                        match = value.substr(valueIdx, count).match(numberRegExp[3]);\n                        milliseconds = getNumber(count); //move value index position\n\n                        if (milliseconds !== null) {\n                            milliseconds = parseFloat(\"0.\" + match[0], 10);\n                            milliseconds = kendo._round(milliseconds, 3);\n                            milliseconds *= 1000;\n                        }\n\n                        if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n                            return null;\n                        }\n\n                    } else if (ch === \"t\") {\n                        count = lookAhead(\"t\");\n                        amDesignators = calendar.AM;\n                        pmDesignators = calendar.PM;\n\n                        if (count === 1) {\n                            amDesignators = mapDesignators(amDesignators);\n                            pmDesignators = mapDesignators(pmDesignators);\n                        }\n\n                        pmHour = getIndexByName(pmDesignators, false, longestDesignatorLength(pmDesignators));\n                        if (!pmHour && !getIndexByName(amDesignators, false, longestDesignatorLength(amDesignators))) {\n                            return null;\n                        }\n                    }\n                    else if (ch === \"z\") {\n                        UTC = true;\n                        count = lookAhead(\"z\");\n\n                        if (value.substr(valueIdx, 1) === \"Z\") {\n                            checkLiteral();\n                            continue;\n                        }\n\n                        matches = value.substr(valueIdx, 6)\n                                       .match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n\n                        if (!matches) {\n                            return null;\n                        }\n\n                        matches = matches[0].split(\":\");\n\n                        hoursOffset = matches[0];\n                        minutesOffset = matches[1];\n\n                        if (!minutesOffset && hoursOffset.length > 3) { //(+|-)[hh][mm] format is used\n                            valueIdx = hoursOffset.length - 2;\n                            minutesOffset = hoursOffset.substring(valueIdx);\n                            hoursOffset = hoursOffset.substring(0, valueIdx);\n                        }\n\n                        hoursOffset = parseInt(hoursOffset, 10);\n                        if (outOfRange(hoursOffset, -12, 13)) {\n                            return null;\n                        }\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\n            // if more characters follow, assume wrong format\n            // https://github.com/telerik/kendo-ui-core/issues/3476\n            if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n                return null;\n            }\n\n            hasTime = hours !== null || minutes !== null || seconds || null;\n\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\n                if (day === null) {\n                    day = 1;\n                }\n            }\n\n            if (pmHour && hours < 12) {\n                hours += 12;\n            }\n\n            if (UTC) {\n                if (hoursOffset) {\n                    hours += -hoursOffset;\n                }\n\n                if (minutesOffset) {\n                    minutes += -minutesOffset;\n                }\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\n            if (year < 100) {\n                value.setFullYear(year);\n            }\n\n            if (value.getDate() !== day && UTC === undefined$1) {\n                return null;\n            }\n\n            return value;\n        }\n\n        function parseMicrosoftFormatOffset(offset) {\n            var sign = offset.substr(0, 1) === \"-\" ? -1 : 1;\n\n            offset = offset.substring(1);\n            offset = (parseInt(offset.substr(0, 2), 10) * 60) + parseInt(offset.substring(2), 10);\n\n            return sign * offset;\n        }\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\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\n            return formats;\n        }\n\n        function internalParseDate(value, formats, culture, strict, shouldUnpadZeros) {\n            if (objectToString.call(value) === \"[object Date]\") {\n                return value;\n            }\n\n            var idx = 0;\n            var date = null;\n            var length;\n            var tzoffset;\n\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\n                    date = new Date(parseInt(date, 10));\n\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\n                    return date;\n                }\n            }\n\n            culture = kendo.getCulture(culture);\n\n            if (!formats) {\n                formats = getDefaultFormats(culture);\n            }\n\n            formats = isArray(formats) ? formats : [formats];\n            length = formats.length;\n\n            for (; idx < length; idx++) {\n                date = parseExact(value, formats[idx], culture, strict, shouldUnpadZeros);\n                if (date) {\n                    return date;\n                }\n            }\n\n            return date;\n        }\n\n        kendo.parseDate = function(value, formats, culture, shouldUnpadZeros) {\n            return internalParseDate(value, formats, culture, false, shouldUnpadZeros);\n        };\n\n        kendo.parseExactDate = function(value, formats, culture) {\n            return internalParseDate(value, formats, culture, true);\n        };\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\n        kendo.parseFloat = function(value, culture, format) {\n            if (!value && value !== 0) {\n               return null;\n            }\n\n            if (typeof value === NUMBER) {\n               return value;\n            }\n\n            value = value.toString();\n            culture = kendo.getCulture(culture);\n\n            var number = culture.numberFormat,\n                percent = number.percent,\n                currency = number.currency,\n                symbol = currency.symbol,\n                percentSymbol = percent.symbol,\n                negative = value.indexOf(\"-\"),\n                parts, isPercent;\n\n            //handle exponential number\n            if (exponentRegExp.test(value)) {\n                value = parseFloat(value.replace(number[\".\"], \".\"));\n                if (isNaN(value)) {\n                    value = null;\n                }\n                return value;\n            }\n\n            if (negative > 0) {\n                return null;\n            } else {\n                negative = negative > -1;\n            }\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\n            value = value.replace(\"-\", \"\")\n                         .replace(symbol, \"\")\n                         .replace(nonBreakingSpaceRegExp, \" \")\n                         .split(number[\",\"].replace(nonBreakingSpaceRegExp, \" \")).join(\"\")\n                         .replace(spaceRegExp, \"\")\n                         .replace(number[\".\"], \".\");\n\n            value = parseFloat(value);\n\n            if (isNaN(value)) {\n                value = null;\n            } else if (negative) {\n                value *= -1;\n            }\n\n            if (value && isPercent) {\n                value /= 100;\n            }\n\n            return value;\n        };\n    })();\n\n        function getShadows(element) {\n            var shadow = element.css(kendo.support.transitions.css + \"box-shadow\") || element.css(\"box-shadow\"),\n                radius = shadow ? shadow.match(boxShadowRegExp) || [ 0, 0, 0, 0, 0 ] : [ 0, 0, 0, 0, 0 ],\n                blur = math.max((+radius[3]), +(radius[4] || 0));\n\n            return {\n                left: (-radius[1]) + blur,\n                right: (+radius[1]) + blur,\n                bottom: (+radius[2]) + blur\n            };\n        }\n\n        function getHiddenDimensions(element, includeMargin) {\n            var clone, width, height;\n\n            clone = element.clone();\n            clone.css(\"display\", \"\");\n            clone.css(\"visibility\", \"hidden\");\n            clone.appendTo($(\"body\"));\n\n            width = clone.outerWidth(includeMargin || false);\n            height = clone.outerHeight(includeMargin || false);\n\n            clone.remove();\n\n            return {\n                width: width || 0,\n                height: height || 0\n            };\n        }\n\n        function wrap(element, autosize, resize, shouldCorrectWidth = true, autowidth) {\n            var percentage,\n                outerWidth = kendo._outerWidth,\n                outerHeight = kendo._outerHeight,\n                parent = element.parent(),\n                windowOuterWidth = outerWidth(window);\n\n            parent.parent().removeClass(\"k-animation-container-sm\");\n\n            if (!parent.hasClass(\"k-child-animation-container\")) {\n                var width = element[0].style.width,\n                    height = element[0].style.height,\n                    percentWidth = percentRegExp.test(width),\n                    percentHeight = percentRegExp.test(height),\n                    forceDimensions = element.hasClass(\"k-tooltip\") || element.is(\".k-menu-horizontal.k-context-menu\"),\n                    calculateFromHidden = element.hasClass(\"k-tooltip\");\n\n                percentage = percentWidth || percentHeight;\n\n                if (!percentWidth && (!autosize || (autosize && width) || forceDimensions)) { width = autosize ? outerWidth(element, false, calculateFromHidden) + 1 : outerWidth(element, false, calculateFromHidden); }\n                if (!percentHeight && (!autosize || (autosize && height)) || forceDimensions) { height = outerHeight(element, false, calculateFromHidden); }\n\n                element.wrap(\n                    $(\"<div/>\")\n                    .addClass(\"k-child-animation-container\")\n                    .css({\n                        width: autowidth ? \"auto\" : width,\n                        height: height\n                    }));\n                parent = element.parent();\n\n                parent.wrap(\n                             $(\"<div/>\")\n                             .addClass(\"k-animation-container\")\n                             .attr(\"role\", \"region\")\n                            );\n\n                if (percentage) {\n                    element.css({\n                        width: \"100%\",\n                        height: \"100%\"\n                    });\n                }\n            } else {\n                wrapResize(element, autosize, shouldCorrectWidth);\n            }\n\n            parent = parent.parent();\n\n            if (windowOuterWidth < outerWidth(parent)) {\n                parent.addClass(\"k-animation-container-sm\");\n                resize = true;\n            }\n\n            if (resize) {\n                wrapResize(element, autosize, shouldCorrectWidth);\n            }\n\n            return parent;\n        }\n\n        function wrapResize(element, autosize, shouldCorrectWidth) {\n            var percentage,\n                outerWidth = kendo._outerWidth,\n                outerHeight = kendo._outerHeight,\n                parent = element.parent(),\n                wrapper = element.closest(\".k-animation-container\"),\n                calculateFromHidden = element.hasClass(\"k-tooltip\"),\n                visible = element.is(\":visible\"),\n                wrapperStyle = parent[0].style,\n                elementHeight = element[0].style.height;\n\n            if (wrapper.is(\":hidden\")) {\n                wrapper.css({\n                    display: \"\",\n                    position: \"\"\n                });\n            }\n\n            percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n\n            if (!percentage) {\n                if (!visible) {\n                    element.add(parent).show();\n                }\n                if (shouldCorrectWidth) {\n                    parent.css(\"width\", \"\"); // Needed to get correct width dimensions\n                }\n                parent.css({\n                    width: autosize ? outerWidth(element, false, calculateFromHidden) + 1 : outerWidth(element, false, calculateFromHidden),\n                });\n\n                if (elementHeight === \"auto\") {\n                    element.css({ height: outerHeight(parent) });\n                } else {\n                    parent.css({\n                        height: outerHeight(element)\n                    });\n                }\n\n                if (!visible) {\n                    element.hide();\n                }\n            }\n        }\n\n        function deepExtend(destination) {\n            var i = 1,\n                length = arguments.length;\n\n            for (i = 1; i < length; i++) {\n                deepExtendOne(destination, arguments[i]);\n            }\n\n            return destination;\n        }\n\n        function deepExtendOne(destination, source) {\n            var ObservableArray = kendo.data.ObservableArray,\n                LazyObservableArray = kendo.data.LazyObservableArray,\n                DataSource = kendo.data.DataSource,\n                HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n                property,\n                propValue,\n                propType,\n                propInit,\n                destProp;\n\n            for (property in source) {\n                propValue = source[property];\n                propType = typeof propValue;\n\n                if (propType === OBJECT && propValue !== null) {\n                    propInit = propValue.constructor;\n                } else {\n                    propInit = null;\n                }\n\n                if (propInit &&\n                    propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray &&\n                    propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp &&\n                    (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer) && !(propValue instanceof HTMLElement)) {\n\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\n            return destination;\n        }\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$1 ? dflt : agent;\n        }\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\n        function toCamelCase(str) {\n            return str.replace(/\\-(\\w)/g, function(strMatch, g1) {\n                return g1.toUpperCase();\n            });\n        }\n\n        function getComputedStyles(element, properties) {\n            var styles = {}, computedStyle;\n\n            if (document.defaultView && document.defaultView.getComputedStyle) {\n                computedStyle = document.defaultView.getComputedStyle(element, \"\");\n\n                if (properties) {\n                    $.each(properties, function(idx, value) {\n                        styles[value] = computedStyle.getPropertyValue(value);\n                    });\n                }\n            } else {\n                computedStyle = element.currentStyle;\n\n                if (properties) {\n                    $.each(properties, function(idx, value) {\n                        styles[value] = computedStyle[toCamelCase(value)];\n                    });\n                }\n            }\n\n            if (!kendo.size(styles)) {\n                styles = computedStyle;\n            }\n\n            return styles;\n        }\n\n        function isScrollable(element) {\n            if (element.dataset[kendo.ns + \"scrollable\"] === \"false\") {\n                return false;\n            }\n\n            if (element && element.className && typeof(element.className) === \"string\" && element.className.indexOf(\"k-auto-scrollable\") > -1) {\n                return true;\n            }\n\n            var overflow = getComputedStyles(element, [\"overflow\"]).overflow;\n            return overflow.indexOf(\"auto\") > -1 || overflow.indexOf(\"scroll\") > -1;\n        }\n\n        function scrollLeft(element, value) {\n            var webkit = support.browser.webkit;\n            var mozila = support.browser.mozilla;\n            var browserVersion = support.browser.version;\n            var el, isRtl;\n\n            if (element instanceof $ && value !== undefined$1) {\n                element.each(function(i, e) {\n                    scrollLeft(e, value);\n                });\n\n                return;\n            } else {\n                el = element instanceof $ ? element[0] : element;\n            }\n\n            if (!el) {\n                return;\n            }\n\n            isRtl = support.isRtl(element);\n\n            // After updating browser detection,\n            // Test in which if should the Safari browsers go\n            if (value !== undefined$1) {\n                if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n                    el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n                } else if (isRtl && (mozila || webkit) && value > 0) {\n                    el.scrollLeft = -value;\n                } else {\n                    el.scrollLeft = value;\n                }\n            } else {\n                if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n                    return el.scrollWidth - el.clientWidth - el.scrollLeft;\n                } else {\n                    return Math.abs(el.scrollLeft);\n                }\n            }\n        }\n\n        (function() {\n            support._scrollbar = undefined$1;\n\n            support.scrollbar = function(refresh) {\n                if (!isNaN(support._scrollbar) && !refresh) {\n                    return support._scrollbar;\n                } else {\n                    var div = document.createElement(\"div\"),\n                        result;\n\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\n                    support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n\n                    document.body.removeChild(div);\n\n                    return result;\n                }\n            };\n\n            support.isRtl = function(element) {\n                return $(element).closest(\".k-rtl\").length > 0;\n            };\n\n            var table = document.createElement(\"table\");\n\n            // Internet Explorer does not support setting the innerHTML of TBODY and TABLE elements\n            try {\n                table.innerHTML = \"<tr><td></td></tr>\";\n\n                support.tbodyInnerHtml = true;\n            } catch (e) {\n                support.tbodyInnerHtml = false;\n            }\n\n            support.touch = \"ontouchstart\" in window;\n\n            var docStyle = document.documentElement.style;\n            var transitions = support.transitions = false,\n                transforms = support.transforms = false,\n                elementProto = \"HTMLElement\" in window ? HTMLElement.prototype : [];\n\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\n            each([ \"Moz\", \"webkit\", \"O\", \"ms\" ], function() {\n                var prefix = this.toString(),\n                    hasTransitions = typeof table.style[prefix + \"Transition\"] === STRING;\n\n                if (hasTransitions || typeof table.style[prefix + \"Transform\"] === STRING) {\n                    var lowPrefix = prefix.toLowerCase();\n\n                    transforms = {\n                        css: (lowPrefix != \"ms\") ? \"-\" + lowPrefix + \"-\" : \"\",\n                        prefix: prefix,\n                        event: (lowPrefix === \"o\" || lowPrefix === \"webkit\") ? lowPrefix : \"\"\n                    };\n\n                    if (hasTransitions) {\n                        transitions = transforms;\n                        transitions.event = transitions.event ? transitions.event + \"TransitionEnd\" : \"transitionend\";\n                    }\n\n                    return false;\n                }\n            });\n\n            table = null;\n\n            support.transforms = transforms;\n            support.transitions = transitions;\n\n            support.devicePixelRatio = window.devicePixelRatio === undefined$1 ? 1 : window.devicePixelRatio;\n\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                //window.outerWidth throws error when in IE showModalDialog.\n                support.screenWidth = window.screen.availWidth;\n                support.screenHeight = window.screen.availHeight;\n            }\n\n            support.detectOS = function(ua) {\n                var os = false, minorVersion, match = [],\n                    notAndroidPhone = !/mobile safari/i.test(ua),\n                    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                    },\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                    },\n                    formFactorRxs = {\n                        tablet: /playbook|ipad|fire/i\n                    },\n                    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\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) { return false; } // Break if not Metro/Mobile Windows\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; // Use file protocol to detect appModes.\n                            os.appMode = window.navigator.standalone || (/file|local|wmapp/).test(window.location.protocol) || os.cordova; // Use file protocol to detect appModes.\n\n                            if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n                                os.tablet = agent;\n                            }\n\n                            break;\n                        }\n                    }\n                }\n                return os;\n            };\n\n            var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n\n            support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n\n            support.hasNativeScrolling = false;\n\n            if (mobileOS.ios || (mobileOS.android && mobileOS.majorVersion > 2) || mobileOS.wp) {\n                support.hasNativeScrolling = mobileOS;\n            }\n\n            support.delayedClick = function() {\n\n                // only the mobile devices with touch events do this.\n                if (support.touch) {\n                    // All iOS devices so far (by the time I am writing this, iOS 9.0.2 is the latest),\n                    // delay their click events.\n                    if (mobileOS.ios) {\n                        return true;\n                    }\n\n                    if (mobileOS.android) {\n\n                        if (!support.browser.chrome) { // older webkits and webviews delay the click\n                            return true;\n                        }\n\n                        // from here on, we deal with Chrome on Android.\n                        if (support.browser.version < 32) {\n                            return false;\n                        }\n\n                        // Chrome 32+ does conditional fast clicks if the view port is not user scalable.\n                        return !($(\"meta[name=viewport]\").attr(\"content\") || \"\").match(/user-scalable=no/i);\n                    }\n                }\n\n                return false;\n            };\n\n            support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n\n            support.detectBrowser = function(ua) {\n                var browser = false,\n                    match = [],\n                    chromiumEdgeMatch = [],\n                    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\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\n                            if (browser.chrome) {\n                                chromiumEdgeMatch = ua.match(/(edg)[ \\/]([\\w.]+)/i);\n\n                                if (chromiumEdgeMatch) {\n                                    browser.chromiumEdge = true;\n                                }\n                            }\n\n                            break;\n                        }\n                    }\n                }\n\n                return browser;\n            };\n\n            support.browser = support.detectBrowser(navigator.userAgent);\n\n            if (!mobileOS && support.touch && support.browser.safari) {\n                mobileOS = support.mobileOS = {\n                    ios: true,\n                    tablet: \"tablet\",\n                    device: \"ipad\",\n                    majorVersion: 13\n                };\n            }\n\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\n                if (support.browser.chrome) {\n                    //not using queryCommandSupported due to chromium issues 476508 and 542948\n                    commands.paste = false;\n                    if (support.browser.version >= 43) {\n                        commands.copy = true;\n                        commands.cut = true;\n                    }\n                }\n\n                return commands;\n            };\n\n            support.clipboard = support.detectClipboardAccess();\n\n            support.zoomLevel = function() {\n                try {\n                    var browser = support.browser;\n                    var ie11WidthCorrection = 0;\n                    var docEl = document.documentElement;\n\n                    if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n                        ie11WidthCorrection = support.scrollbar();\n                    }\n\n                    return support.touch ? (docEl.clientWidth / window.innerWidth) :\n                           browser.msie && browser.version >= 10 ? (((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth) : 1;\n                } catch (e) {\n                    return 1;\n                }\n            };\n\n            (function(browser) {\n                // add browser-specific CSS class\n                var cssClass = \"\",\n                    docElement = $(document.documentElement),\n                    majorVersion = parseInt(browser.version, 10);\n\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\n                if (cssClass) {\n                    cssClass = \"k-\" + cssClass + \" k-\" + cssClass + majorVersion;\n                }\n                if (support.mobileOS) {\n                    cssClass += \" k-mobile\";\n                }\n\n                if (!support.cssFlexbox) {\n                    cssClass += \" k-no-flexbox\";\n                }\n\n                docElement.addClass(cssClass);\n            })(support.browser);\n\n            support.eventCapture = document.documentElement.addEventListener;\n\n            var input = document.createElement(\"input\");\n\n            support.placeholder = \"placeholder\" in input;\n            support.propertyChangeEvent = \"onpropertychange\" in input;\n\n            support.input = (function() {\n                var types = [\"number\", \"date\", \"time\", \"month\", \"week\", \"datetime\", \"datetime-local\"];\n                var length = types.length;\n                var value = \"test\";\n                var result = {};\n                var idx = 0;\n                var type;\n\n                for (;idx < length; idx++) {\n                    type = types[idx];\n                    input.setAttribute(\"type\", type);\n                    input.value = value;\n\n                    result[type.replace(\"-\", \"\")] = input.type !== \"text\" && input.value !== value;\n                }\n\n                return result;\n            })();\n\n            input.style.cssText = \"float:left;\";\n\n            support.cssFloat = !!input.style.cssFloat;\n\n            input = null;\n\n            support.stableSort = (function() {\n                // Chrome sort is not stable for more than *10* items\n                // IE9+ sort is not stable for than *512* items\n                var threshold = 513;\n\n                var sorted = [{\n                    index: 0,\n                    field: \"b\"\n                }];\n\n                for (var i = 1; i < threshold; i++) {\n                    sorted.push({\n                        index: i,\n                        field: \"a\"\n                    });\n                }\n\n                sorted.sort(function(a, b) {\n                    return a.field > b.field ? 1 : (a.field < b.field ? -1 : 0);\n                });\n\n                return sorted[0].index === 1;\n            })();\n\n            support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector ||\n                                      elementProto.msMatchesSelector || elementProto.oMatchesSelector ||\n                                      elementProto.matchesSelector || elementProto.matches ||\n              function( selector ) {\n                  var nodeList = document.querySelectorAll ? ( this.parentNode || document ).querySelectorAll( selector ) || [] : $(selector),\n                      i = nodeList.length;\n\n                  while (i--) {\n                      if (nodeList[i] == this) {\n                          return true;\n                      }\n                  }\n\n                  return false;\n              };\n\n            support.matchMedia = \"matchMedia\" in window;\n\n            support.pushState = window.history && window.history.pushState;\n\n            support.hashChange = \"onhashchange\" in window;\n\n            support.customElements = \"registerElement\" in window.document;\n\n            var chrome = support.browser.chrome,\n                mobileChrome = support.browser.crios,\n                mozilla = support.browser.mozilla,\n                safari = support.browser.safari;\n            support.msPointers = !chrome && window.MSPointerEvent;\n            support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n            support.kineticScrollNeeded = mobileOS && (mobileOS.device !== \"ipad\" || mobileOS.majorVersion < 13) && (support.touch || support.msPointers || support.pointers);\n        })();\n\n\n        function size(obj) {\n            var result = 0, key;\n            for (key in obj) {\n                if (obj.hasOwnProperty(key) && key != \"toJSON\") { // Ignore fake IE7 toJSON.\n                    result++;\n                }\n            }\n\n            return result;\n        }\n\n        function getOffset(element, type, positioned) {\n            if (!type) {\n                type = \"offset\";\n            }\n\n            var offset = element[type]();\n            // clone ClientRect object to JS object (jQuery3)\n            var result = {\n                top: offset.top,\n                right: offset.right,\n                bottom: offset.bottom,\n                left: offset.left\n            };\n\n            // IE10 touch zoom is living in a separate viewport\n            if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n                var sign = support.isRtl(element) ? 1 : -1;\n\n                result.top -= (window.pageYOffset - (document.documentElement.scrollTop));\n                result.left -= (window.pageXOffset + (sign * document.documentElement.scrollLeft));\n            }\n\n            return result;\n        }\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\n        function parseEffects(input) {\n            var effects = {};\n\n            each((typeof input === \"string\" ? input.split(\" \") : input), function(idx) {\n                effects[idx] = this;\n            });\n\n            return effects;\n        }\n\n        function fx(element) {\n            return new kendo.effects.Element(element);\n        }\n\n        var effects = {};\n\n        $.extend(effects, {\n            enabled: true,\n            Element: function(element) {\n                this.element = $(element);\n            },\n\n            promise: function(element, options) {\n                if (!element.is(\":visible\")) {\n                    element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\n                }\n\n                if (options.hide) {\n                    element.data(\"olddisplay\", element.css(\"display\")).hide();\n                }\n\n                if (options.init) {\n                    options.init();\n                }\n\n                if (options.completeCallback) {\n                    options.completeCallback(element); // call the external complete callback with the element\n                }\n\n                element.dequeue();\n            },\n\n            disable: function() {\n                this.enabled = false;\n                this.promise = this.promiseShim;\n            },\n\n            enable: function() {\n                this.enabled = true;\n                this.promise = this.animatedPromise;\n            }\n        });\n\n        effects.promiseShim = effects.promise;\n\n        function prepareAnimationOptions(options, duration, reverse, complete) {\n            if (typeof options === STRING) {\n                // options is the list of effect names separated by space e.g. animate(element, \"fadeIn slideDown\")\n\n                // only callback is provided e.g. animate(element, options, function() {});\n                if (isFunction(duration)) {\n                    complete = duration;\n                    duration = 400;\n                    reverse = false;\n                }\n\n                if (isFunction(reverse)) {\n                    complete = reverse;\n                    reverse = false;\n                }\n\n                if (typeof duration === BOOLEAN) {\n                    reverse = duration;\n                    duration = 400;\n                }\n\n                options = {\n                    effects: options,\n                    duration: duration,\n                    reverse: reverse,\n                    complete: complete\n                };\n            }\n\n            return extend({\n                //default options\n                effects: {},\n                duration: 400, //jQuery default duration\n                reverse: false,\n                init: noop,\n                teardown: noop,\n                hide: false\n            }, options, { completeCallback: options.complete, complete: noop }); // Move external complete callback, so deferred.resolve can be always executed.\n\n        }\n\n        function animate(element, options, duration, reverse, complete) {\n            var idx = 0,\n                length = element.length,\n                instance;\n\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\n            return element;\n        }\n\n        function toggleClass(element, classes, options, add) {\n            if (classes) {\n                classes = classes.split(\" \");\n\n                each(classes, function(idx, value) {\n                    element.toggleClass(value, add);\n                });\n            }\n\n            return element;\n        }\n\n        if (!(\"kendoAnimate\" in $.fn)) {\n            extend($.fn, {\n                kendoStop: function(clearQueue, gotoEnd) {\n                    return this.stop(clearQueue, gotoEnd);\n                },\n\n                kendoAnimate: function(options, duration, reverse, complete) {\n                    return animate(this, options, duration, reverse, complete);\n                },\n\n                kendoAddClass: function(classes, options) {\n                    return kendo.toggleClass(this, classes, options, true);\n                },\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\n        var ampRegExp = /&/g,\n            ltRegExp = /</g,\n            quoteRegExp = /\"/g,\n            aposRegExp = /'/g,\n            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\n        function unescape(value) {\n            var template;\n\n            try {\n                template = window.decodeURIComponent(value);\n            } catch (error) {\n                // If the string contains Unicode characters\n                // the decodeURIComponent() will throw an error.\n                // Therefore: convert to UTF-8 character\n                template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function(_, m1, m2) {\n                    return String.fromCharCode(parseInt(\"0x\" + (m1 || m2), 16));\n                });\n            }\n\n            return template;\n        }\n\n        var eventTarget = function(e) {\n            return e.target;\n        };\n\n        if (support.touch) {\n\n            eventTarget = function(e) {\n                var touches = \"originalEvent\" in e ? e.originalEvent.changedTouches : \"changedTouches\" in e ? e.changedTouches : null;\n\n                return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n            };\n\n            each([\"swipe\", \"swipeLeft\", \"swipeRight\", \"swipeUp\", \"swipeDown\", \"doubleTap\", \"tap\"], function(m, value) {\n                $.fn[value] = function(callback) {\n                    return this.on(value, callback);\n                };\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\n        var wrapExpression = function(members, paramName) {\n            var result = paramName || \"d\",\n                index,\n                idx,\n                length,\n                member,\n                count = 1;\n\n            for (idx = 0, length = members.length; idx < length; idx++) {\n                member = members[idx];\n                if (member !== \"\") {\n                    index = member.indexOf(\"[\");\n\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\n                    count++;\n                    result += member + ((idx < length - 1) ? \" || {})\" : \")\");\n                }\n            }\n            return new Array(count).join(\"(\") + result;\n        },\n        localUrlRe = /^([a-z]+:)?\\/\\//i;\n\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: Template.compile.bind(Template),\n            render: Template.render.bind(Template),\n            stringify: JSON.stringify.bind(JSON),\n            eventTarget: eventTarget,\n            htmlEncode: htmlEncode,\n            unescape: unescape,\n            isLocalUrl: function(url) {\n                return url && !localUrlRe.test(url);\n            },\n            mediaQuery: mediaQuery,\n\n            expr: function(expression, safe, paramName) {\n                expression = expression || \"\";\n\n                if (typeof safe == STRING) {\n                    paramName = safe;\n                    safe = false;\n                }\n\n                paramName = paramName || \"d\";\n\n                if (expression && expression.charAt(0) !== \"[\") {\n                    expression = \".\" + expression;\n                }\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\n                return expression;\n            },\n\n            exprToArray: (expression, safe) => {\n                expression = expression || \"\";\n\n                return expression.indexOf(\".\") >= 0 || expression.indexOf(\"[\") >= 0 ?\n                    expression.split(/[[\\].]/).map(v => v.replace(/[\"']/g, '')).filter(v => v) :\n                    expression === \"\" ? [] : [expression];\n            },\n\n            getter: function(expression, safe) {\n                var key = expression + safe;\n\n                return getterCache[key] = getterCache[key] || ((obj) => {\n                    const fields = kendo.exprToArray(expression, safe);\n\n                    let result = obj;\n                    for (let idx = 0; idx < fields.length; idx++) {\n                        result = result[fields[idx]];\n                        if (!kendo.isPresent(result) && safe) {\n                            return result;\n                        }\n                    }\n\n                    return result;\n                });\n            },\n\n            setter: function(expression) {\n                return setterCache[expression] = setterCache[expression] || ((obj, value) => {\n                    const fields = kendo.exprToArray(expression);\n\n                    const innerSetter = ({ parent, val, prop, props }) => {\n                        if (props.length) {\n                            parent = parent[props.shift()];\n                            innerSetter({ parent, val, prop, props });\n                        } else {\n                            parent[prop] = val;\n                        }\n                    };\n\n                    innerSetter({\n                        parent: obj,\n                        val: value,\n                        prop: fields.pop(),\n                        props: fields\n                    });\n                });\n            },\n\n            accessor: function(expression) {\n                return {\n                    get: kendo.getter(expression),\n                    set: kendo.setter(expression)\n                };\n            },\n\n            guid: function() {\n                var id = \"\", i, random, chars = \"abcdef\";\n\n                id += chars[Math.floor(Math.random() * Math.floor(chars.length))];\n\n                for (i = 1; i < 32; i++) {\n                    random = math.random() * 16 | 0;\n\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\n                return id;\n            },\n\n            roleSelector: function(role) {\n                return role.replace(/(\\S+)/g, \"[\" + kendo.attr(\"role\") + \"=$1],\").slice(0, -1);\n            },\n\n            directiveSelector: function(directives) {\n                var selectors = directives.split(\" \");\n\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\n                return selectors.join(\" \").replace(/(\\S+)/g, \"kendo-mobile-$1,\").slice(0, -1);\n            },\n\n            triggeredByInput: function(e) {\n                return (/^(label|input|textarea|select)$/i).test(e.target.tagName);\n            },\n\n            onWidgetRegistered: function(callback) {\n                for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n                    callback(kendo.widgets[i]);\n                }\n\n                kendo._widgetRegisteredCallbacks.push(callback);\n            },\n\n            logToConsole: function(message, type) {\n                var console = window.console;\n\n                if (!kendo.suppressLog && typeof(console) != \"undefined\" && console.log) {\n                    console[type || \"log\"](message);\n                }\n            }\n        });\n\n        var Widget = Observable.extend( {\n            init: function(element, options) {\n                var that = this;\n\n                if (!validatePackage()) {\n                    that._showWatermarkOverlay = addWatermarkOverlay;\n                }\n\n                that.element = kendo.jQuery(element).handler(that);\n\n                Observable.fn.init.call(that);\n\n                var dataSource = options ? options.dataSource : null;\n                var props;\n\n                if (options) {\n                    props = (that.componentTypes || {})[(options || {}).componentType];\n                }\n\n                if (dataSource) {\n                    // avoid deep cloning the data source\n                    options = extend({}, options, { dataSource: {} });\n                }\n\n                options = that.options = extend(true, {}, that.options, that.defaults, props || {}, options);\n\n                if (dataSource) {\n                    options.dataSource = dataSource;\n                }\n\n                if (!that.element.attr(kendo.attr(\"role\"))) {\n                    that.element.attr(kendo.attr(\"role\"), (options.name || \"\").toLowerCase());\n                }\n\n                that.element.data(\"kendo\" + options.prefix + options.name, that);\n\n                that.bind(that.events, options);\n            },\n\n            events: [],\n\n            options: {\n                prefix: \"\"\n            },\n\n            _hasBindingTarget: function() {\n                return !!this.element[0].kendoBindingTarget;\n            },\n\n            _tabindex: function(target) {\n                target = target || this.wrapper;\n\n                var element = this.element,\n                    TABINDEX = \"tabindex\",\n                    tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n\n                element.removeAttr(TABINDEX);\n\n                target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n            },\n\n            setOptions: function(options) {\n                this._clearCssClasses(options);\n                this._setEvents(options);\n                $.extend(this.options, options);\n                this._applyCssClasses();\n            },\n\n            _setEvents: function(options) {\n                var that = this,\n                    idx = 0,\n                    length = that.events.length,\n                    e;\n\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                        if (that._events && that._events[e]) {\n                            delete that._events[e];\n                        }\n                    }\n                }\n\n                that.bind(that.events, options);\n            },\n\n            resize: function(force) {\n                var size = this.getSize(),\n                    currentSize = this._size;\n\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\n            getSize: function() {\n                return kendo.dimensions(this.element);\n            },\n\n            size: function(size) {\n                if (!size) {\n                    return this.getSize();\n                } else {\n                    this.setSize(size);\n                }\n            },\n\n            setSize: $.noop,\n            _resize: $.noop,\n\n            destroy: function() {\n                var that = this;\n\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\n            _applyCssClasses: function(element) {\n                var protoOptions = this.__proto__.options,\n                    options = this.options,\n                    el = element || this.wrapper || this.element,\n                    classes = [],\n                    i, prop, validFill, widgetName;\n\n                if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n                    return;\n                }\n\n                for (i = 0; i < cssPropertiesNames.length; i++) {\n                    prop = cssPropertiesNames[i];\n                    widgetName = this.options._altname || protoOptions.name;\n\n                    if (protoOptions.hasOwnProperty(prop)) {\n                        if (prop === \"themeColor\") {\n                            validFill = kendo.cssProperties.getValidClass({\n                                widget: widgetName,\n                                propName: \"fillMode\",\n                                value: options.fillMode\n                            });\n\n                            if (validFill && validFill.length) {\n                                classes.push(kendo.cssProperties.getValidClass({\n                                    widget: widgetName,\n                                    propName: prop,\n                                    value: options[prop],\n                                    fill: options.fillMode\n                                }));\n                            }\n                        } else {\n                            classes.push(kendo.cssProperties.getValidClass({\n                                widget: widgetName,\n                                propName: prop,\n                                value: options[prop]\n                            }));\n                        }\n                    }\n                }\n\n                el.addClass(classes.join(\" \"));\n            },\n\n            _ariaLabel: function(target) {\n                var that = this,\n                    inputElm = that.element,\n                    inputId = inputElm.attr(\"id\"),\n                    labelElm = $(\"label[for=\\\"\" + inputId + \"\\\"]\"),\n                    ariaLabel = inputElm.attr(ARIA_LABEL),\n                    ariaLabelledBy = inputElm.attr(ARIA_LABELLEDBY),\n                    labelId;\n\n                if (target[0] === inputElm[0]) {\n                    return;\n                }\n\n                if (ariaLabel) {\n                    target.attr(ARIA_LABEL, ariaLabel);\n                } else if (ariaLabelledBy) {\n                    target.attr(ARIA_LABELLEDBY, ariaLabelledBy);\n                } else if (labelElm.length) {\n                    labelId = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\n                    target.attr(ARIA_LABELLEDBY, labelId);\n                }\n            },\n\n            _clearCssClasses: function(newOptions, element) {\n                var protoOptions = this.__proto__.options,\n                    currentOptions = this.options,\n                    el = element || this.wrapper || this.element,\n                    i, prop, widgetName;\n\n                if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n                    return;\n                }\n\n                for (i = 0; i < cssPropertiesNames.length; i++) {\n                    prop = cssPropertiesNames[i];\n                    widgetName = this.options._altname || protoOptions.name;\n\n                    if (protoOptions.hasOwnProperty(prop) && newOptions.hasOwnProperty(prop)) {\n                        if (prop === \"themeColor\") {\n                            el.removeClass(kendo.cssProperties.getValidClass({\n                                widget: widgetName,\n                                propName: prop,\n                                value: currentOptions[prop],\n                                fill: currentOptions.fillMode\n                            }));\n                        } else {\n                            if (prop === \"fillMode\") {\n                                el.removeClass(kendo.cssProperties.getValidClass({\n                                    widget: widgetName,\n                                    propName: \"themeColor\",\n                                    value: currentOptions.themeColor,\n                                    fill: currentOptions.fillMode\n                                }));\n                            }\n\n                            el.removeClass(kendo.cssProperties.getValidClass({\n                                widget: widgetName,\n                                propName: prop,\n                                value: currentOptions[prop]\n                            }));\n                        }\n                    }\n                }\n            },\n\n            _generateLabelId: function(label, inputId) {\n                var labelId = inputId + LABELIDPART;\n\n                label.attr(\"id\", labelId);\n\n                return labelId;\n            },\n        });\n\n        var DataBoundWidget = Widget.extend({\n            dataItems: function() {\n                return this.dataSource.flatView();\n            }\n        });\n\n        kendo.dimensions = function(element, dimensions) {\n            var domElement = element[0];\n\n            if (dimensions) {\n                element.css(dimensions);\n            }\n\n            return { width: domElement.offsetWidth, height: domElement.offsetHeight };\n        };\n\n        kendo.notify = noop;\n\n        var templateRegExp = /template$/i,\n            jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/,\n            jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/,\n            dashRegExp = /([A-Z])/g;\n\n        function parseOption(element, option) {\n            var value;\n\n            if (option.indexOf(\"data\") === 0) {\n                option = option.substring(4);\n                option = option.charAt(0).toLowerCase() + option.substring(1);\n            }\n\n            option = option.replace(dashRegExp, \"-$1\");\n            value = element.getAttribute(\"data-\" + kendo.ns + option);\n\n            if (value === null) {\n                value = undefined$1;\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\" && option != \"format\") {\n                value = parseFloat(value);\n            } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n                try {\n                    value = JSON.parse(value);\n                } catch (error) {\n                    // Fallback to function eval for legacy reason - non CSP compliant\n                    value = new Function(\"return (\" + value + \")\")();\n                }\n            }\n\n            return value;\n        }\n\n        function parseOptions(element, options, source) {\n            var result = {},\n                option,\n                value,\n                role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n            for (option in options) {\n                value = parseOption(element, option);\n\n                if (value !== undefined$1) {\n\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\n                    result[option] = value;\n                }\n            }\n\n            return result;\n        }\n\n        kendo.initWidget = function(element, options, roles) {\n            var result,\n                option,\n                widget,\n                idx,\n                length,\n                role,\n                value,\n                dataSource,\n                fullPath,\n                widgetKeyRegExp;\n\n            // Preserve backwards compatibility with (element, options, namespace) signature, where namespace was kendo.ui\n            if (!roles) {\n                roles = kendo.ui.roles;\n            } else if (roles.roles) {\n                roles = roles.roles;\n            }\n\n            element = element.nodeType ? element : element[0];\n\n            role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n            if (!role) {\n                return;\n            }\n\n            fullPath = role.indexOf(\".\") === -1;\n\n            // look for any widget that may be already instantiated based on this role.\n            // The prefix used is unknown, hence the regexp\n            //\n\n            if (fullPath) {\n                widget = roles[role];\n            } else { // full namespace path - like kendo.ui.Widget\n                widget = kendo.getter(role)(window);\n            }\n\n            var data = $(element).data(),\n                widgetKey = widget ? \"kendo\" + widget.fn.options.prefix + widget.fn.options.name : \"\";\n\n            if (fullPath) {\n                widgetKeyRegExp = new RegExp(\"^kendo.*\" + role + \"$\", \"i\");\n            } else { // full namespace path - like kendo.ui.Widget\n                widgetKeyRegExp = new RegExp(\"^\" + widgetKey + \"$\", \"i\");\n            }\n\n            for (var key in data) {\n                if (key.match(widgetKeyRegExp)) {\n                    // we have detected a widget of the same kind - save its reference, we will set its options\n                    if (key === widgetKey) {\n                        result = data[key];\n                    } else {\n                        return data[key];\n                    }\n                }\n            }\n\n            if (!widget) {\n                return;\n            }\n\n            dataSource = parseOption(element, \"dataSource\");\n\n            options = $.extend({}, parseOptions(element, $.extend({}, widget.fn.options, widget.fn.defaults) ), options);\n\n            if (dataSource) {\n                if (typeof dataSource === STRING) {\n                    options.dataSource = kendo.getter(dataSource)(window);\n                } else {\n                    options.dataSource = dataSource;\n                }\n            }\n\n            for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n                option = widget.fn.events[idx];\n\n                value = parseOption(element, option);\n\n                if (value !== undefined$1) {\n                    options[option] = kendo.getter(value)(window);\n                }\n            }\n\n            if (!result) {\n                result = new widget(element, options);\n            } else if (!$.isEmptyObject(options)) {\n                result.setOptions(options);\n            }\n\n            return result;\n        };\n\n        kendo.rolesFromNamespaces = function(namespaces) {\n            var roles = [],\n                idx,\n                length;\n\n            if (!namespaces[0]) {\n                namespaces = [kendo.ui, kendo.dataviz.ui];\n            }\n\n            for (idx = 0, length = namespaces.length; idx < length; idx ++) {\n                roles[idx] = namespaces[idx].roles;\n            }\n\n            return extend.apply(null, [{}].concat(roles.reverse()));\n        };\n\n        kendo.init = function(element) {\n            var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n\n            $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n                kendo.initWidget(this, {}, roles);\n            });\n        };\n\n        kendo.destroy = function(element) {\n            $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n                var data = $(this).data();\n\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\n        function containmentComparer(a, b) {\n            return $.contains(a, b) ? -1 : 1;\n        }\n\n        function resizableWidget() {\n            var widget = $(this);\n            return ($.inArray(widget.attr(\"data-\" + kendo.ns + \"role\"), [\"slider\", \"rangeslider\", \"breadcrumb\"]) > -1) || widget.is(\":visible\");\n        }\n\n        kendo.resize = function(element, force) {\n            var widgets = $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().filter(resizableWidget);\n\n            if (!widgets.length) {\n                return;\n            }\n\n            // sort widgets based on their parent-child relation\n            var widgetsArray = $.makeArray(widgets);\n            widgetsArray.sort(containmentComparer);\n\n            // resize widgets\n            $.each(widgetsArray, function() {\n                var widget = kendo.widgetInstance($(this));\n                if (widget) {\n                    widget.resize(force);\n                }\n            });\n        };\n\n        kendo.parseOptions = parseOptions;\n\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\"),\n                    support = kendo.support,\n                    browser = support.browser,\n                    isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n\n                    options = $.extend({}, {\n                        width: \"100%\",\n                        height: \"100%\",\n                        top: container.scrollTop(),\n                        opacity: false\n                    }, options);\n\n                    cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n\n                if (toggle) {\n                    if (!mask.length) {\n                        isRtl = support.isRtl(container);\n                        leftRight = isRtl ? \"right\" : \"left\";\n                        containerScrollLeft = kendo.scrollLeft(container);\n                        webkitCorrection = browser.webkit ? (!isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft) : 0;\n\n                        mask = $(kendo.format(\"<div class='{0}'><span role='alert' aria-live='polite' class='k-loading-text'>{1}</span><div class='k-loading-image'></div><div class='k-loading-color'></div></div>\", cssClass, kendo.ui.progress.messages.loading))\n                            .width(options.width).height(options.height)\n                            .css(\"top\", options.top)\n                            .css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection)\n                            .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,\n                    getter;\n\n                register = register || kendo.ui;\n                prefix = prefix || \"\";\n\n                register[name] = widget;\n\n                register.roles[name.toLowerCase()] = widget;\n\n                getter = \"getKendo\" + prefix + name;\n                name = \"kendo\" + prefix + name;\n\n                var widgetEntry = { name: name, widget: widget, prefix: prefix || \"\" };\n                kendo.widgets.push(widgetEntry);\n\n                for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n                    kendo._widgetRegisteredCallbacks[i](widgetEntry);\n                }\n\n                $.fn[name] = function(options) {\n                    var value = this,\n                        args;\n\n                    if (typeof options === STRING) {\n                        args = slice.call(arguments, 1);\n\n                        this.each(function() {\n                            var widget = $.data(this, name),\n                                method,\n                                result;\n\n                            if (!widget) {\n                                throw new Error(kendo.format(\"Cannot call method '{0}' of {1} before it is initialized\", options, name));\n                            }\n\n                            method = widget[options];\n\n                            if (typeof method !== FUNCTION) {\n                                throw new Error(kendo.format(\"Cannot find method '{0}' of {1}\", options, name));\n                            }\n\n                            result = method.apply(widget, args);\n\n                            if (result !== undefined$1) {\n                                value = result;\n                                return false;\n                            }\n                        });\n                    } else {\n                        this.each(function() {\n                            return new widget(this, options);\n                        });\n                    }\n\n                    return value;\n                };\n\n                $.fn[name].widget = widget;\n\n                $.fn[getter] = function() {\n                    return this.data(name);\n                };\n            }\n        });\n\n        kendo.ui.progress.messages = {\n            loading: \"Loading...\"\n        };\n\n        var ContainerNullObject = { bind: function() { return this; }, nullObject: true, 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\n            destroy: function() {\n                Widget.fn.destroy.call(this);\n                this.element.kendoDestroy();\n            },\n\n            options: {\n                prefix: \"Mobile\"\n            },\n\n            events: [],\n\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\n            viewHasNativeScrolling: function() {\n                var view = this.view();\n                return view && view.options.useNativeScrolling;\n            },\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\n        extend(kendo.mobile, {\n            init: function(element) {\n                kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n            },\n\n            roles: {},\n\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\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\n        kendo.touchScroller = function(elements, options) {\n            // return the first touch scroller\n            if (!options) { options = {}; }\n\n            options.useNative = true;\n\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\n        kendo.preventDefault = function(e) {\n            e.preventDefault();\n        };\n\n        kendo.widgetInstance = function(element, suites) {\n            var role = element.data(kendo.ns + \"role\"),\n                widgets = [], i, length,\n                elementData = element.data(\"kendoView\");\n\n            if (role) {\n                // HACK!!! mobile view scroller widgets are instantiated on data-role=\"content\" elements. We need to discover them when resizing.\n                if (role === \"content\") {\n                    role = \"scroller\";\n                }\n\n                // kendo.View is not a ui plugin\n\n                if (role === \"view\" && elementData) {\n                    return elementData;\n                }\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                }\n                else {\n                    widgets = [ kendo.ui.roles[role], kendo.dataviz.ui.roles[role], kendo.mobile.ui.roles[role] ];\n                }\n\n                if (role.indexOf(\".\") >= 0) {\n                    widgets = [ kendo.getter(role)(window) ];\n                }\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\n        kendo.onResize = function(callback) {\n            var handler = callback;\n            if (support.mobileOS.android) {\n                handler = function() { setTimeout(callback, 600); };\n            }\n\n            $(window).on(support.resize, handler);\n            return handler;\n        };\n\n        kendo.unbindResize = function(callback) {\n            $(window).off(support.resize, callback);\n        };\n\n        kendo.attrValue = function(element, key) {\n            return element.data(kendo.ns + key);\n        };\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\n        function focusable(element, isTabIndexNotNaN) {\n            var nodeName = element.nodeName.toLowerCase();\n\n            return (/input|select|textarea|button|object/.test(nodeName) ?\n                    !element.disabled :\n                    nodeName === \"a\" ?\n                    element.href || isTabIndexNotNaN :\n                    isTabIndexNotNaN\n                   ) &&\n                visible(element);\n        }\n\n        function visible(element) {\n            return $.expr.pseudos.visible(element) &&\n                !$(element).parents().addBack().filter(function() {\n                    return $.css(this,\"visibility\") === \"hidden\";\n                }).length;\n        }\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\n        var MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mouseup\", \"click\"];\n        var EXCLUDE_BUST_CLICK_SELECTOR = \"label, input, [data-rel=external]\";\n\n        var MouseEventNormalizer = {\n            setupMouseMute: function() {\n                var idx = 0,\n                    length = MOUSE_EVENTS.length,\n                    element = document.documentElement;\n\n                if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n                    return;\n                }\n\n                MouseEventNormalizer.mouseTrap = true;\n\n                MouseEventNormalizer.bustClick = false;\n                MouseEventNormalizer.captureMouse = false;\n\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\n                for (; idx < length; idx++) {\n                    element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n                }\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\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\n        var eventMap = {\n            down: \"touchstart mousedown\",\n            move: \"mousemove touchmove\",\n            up: \"mouseup touchend touchcancel\",\n            cancel: \"mouseleave touchcancel\"\n        };\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\n        if (support.msPointers && !(\"onmspointerenter\" in window)) { // IE10\n            // Create MSPointerEnter/MSPointerLeave events using mouseover/out and event-time checks\n            $.each({\n                MSPointerEnter: \"MSPointerOver\",\n                MSPointerLeave: \"MSPointerOut\"\n            }, function( orig, fix ) {\n                $.event.special[ orig ] = {\n                    delegateType: fix,\n                    bindType: fix,\n\n                    handle: function( event ) {\n                        var ret,\n                            target = this,\n                            related = event.relatedTarget,\n                            handleObj = event.handleObj;\n\n                        // For mousenter/leave call the handler if related is outside the target.\n                        // NB: No relatedTarget if the mouse left/entered the browser window\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\n\n        var getEventMap = function(e) { return (eventMap[e] || e); },\n            eventRegEx = /([^ ]+)/g;\n\n        kendo.applyEventMap = function(events, ns) {\n            events = events.replace(eventRegEx, getEventMap);\n\n            if (ns) {\n                events = events.replace(eventRegEx, \"$1.\" + ns);\n            }\n\n            return events;\n        };\n\n        kendo.keyDownHandler = function(e, widget) {\n            var events = widget._events.kendoKeydown;\n\n            if (!events) {\n                return true;\n            }\n\n            events = events.slice();\n            e.sender = widget;\n            e.preventKendoKeydown = false;\n            for (var idx = 0, length = events.length; idx < length; idx++) {\n                events[idx].call(widget, e);\n            }\n\n            return !e.preventKendoKeydown;\n        };\n\n        var on = $.fn.on;\n\n        function kendoJQuery(selector, context) {\n            return new kendoJQuery.fn.init(selector, context);\n        }\n\n        noDepricateExtend(true, kendoJQuery, $);\n\n        kendoJQuery.fn = kendoJQuery.prototype = new $();\n\n        kendoJQuery.fn.constructor = kendoJQuery;\n\n        kendoJQuery.fn.init = function(selector, context) {\n            if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n                context = kendoJQuery(context);\n            }\n\n            return $.fn.init.call(this, selector, context, rootjQuery);\n        };\n\n        kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n\n        var rootjQuery = kendoJQuery(document);\n\n        extend(kendoJQuery.fn, {\n            handler: function(handler) {\n                this.data(\"handler\", handler);\n                return this;\n            },\n\n            autoApplyNS: function(ns) {\n                this.data(\"kendoNS\", ns || kendo.guid());\n                return this;\n            },\n\n            on: function() {\n                var that = this,\n                    ns = that.data(\"kendoNS\");\n\n                // support for event map signature\n                if (arguments.length === 1) {\n                    return on.call(that, arguments[0]);\n                }\n\n                var context = that,\n                    args = slice.call(arguments);\n\n                if (typeof args[args.length - 1] === UNDEFINED) {\n                    args.pop();\n                }\n\n                var callback = args[args.length - 1],\n                    events = kendo.applyEventMap(args[0], ns);\n\n                // setup mouse trap\n                if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n                    MouseEventNormalizer.setupMouseMute();\n\n                    var selector = args.length === 2 ? null : args[1],\n                        bustClick = events.indexOf(\"click\") > -1 && events.indexOf(\"touchend\") > -1;\n\n                    on.call(this,\n                        {\n                            touchstart: MouseEventNormalizer.muteMouse,\n                            touchend: MouseEventNormalizer.unMuteMouse\n                        },\n                        selector,\n                        {\n                            bustClick: bustClick\n                        });\n                }\n\n                if (arguments[0].indexOf(\"keydown\") !== -1 && args[1] && args[1].options) {\n                    args[0] = events;\n                    var widget = args[1];\n                    var keyDownCallBack = args[args.length - 1];\n                    args[args.length - 1] = function(e) {\n                        if (kendo.keyDownHandler(e, widget)) {\n                           return keyDownCallBack.apply(this, [e]);\n                        }\n                    };\n                    on.apply(that, args);\n                    return that;\n                }\n\n                if (typeof callback === STRING) {\n                    context = that.data(\"handler\");\n                    callback = context[callback];\n\n                    args[args.length - 1] = function(e) {\n                        callback.call(context, e);\n                    };\n                }\n\n                args[0] = events;\n\n                on.apply(that, args);\n\n                return that;\n            },\n\n            kendoDestroy: function(ns) {\n                ns = ns || this.data(\"kendoNS\");\n\n                if (ns) {\n                    this.off(\".\" + ns);\n                }\n\n                return this;\n            }\n        });\n\n        kendo.jQuery = kendoJQuery;\n        kendo.eventMap = eventMap;\n\n        kendo.timezone = (function() {\n            var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };\n            var days = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, 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\n                if (!cache) {\n                    rule[8] = cache = {};\n                }\n\n                if (cache[year]) {\n                    return cache[year];\n                }\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\n                    targetDay = days[on.substr(4, 3)];\n                    ourDay = date.getUTCDay();\n\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\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n\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\n                    targetDay = days[on.substr(0, 3)];\n                    ourDay = date.getUTCDay();\n\n                    date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n                }\n\n                return cache[year] = date;\n            }\n\n            function findRule(utcTime, rules, zone) {\n                rules = rules[zone];\n\n                if (!rules) {\n                    var time = zone.split(\":\");\n                    var offset = 0;\n\n                    if (time.length > 1) {\n                        offset = time[0] * 60 + Number(time[1]);\n                    }\n\n                    return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-'];\n                }\n\n                var year = new Date(utcTime).getUTCFullYear();\n\n                rules = jQuery.grep(rules, function(rule) {\n                    var from = rule[0];\n                    var to = rule[1];\n\n                    return from <= year && (to >= year || (from == year && to == \"only\") || to == \"max\");\n                });\n\n                rules.push(utcTime);\n\n                rules.sort(function(a, b) {\n                    if (typeof a != \"number\") {\n                        a = Number(ruleToDate(year, a));\n                    }\n\n                    if (typeof b != \"number\") {\n                        b = Number(ruleToDate(year, b));\n                    }\n\n                    return a - b;\n                });\n\n                var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n\n                return isNaN(rule) ? rule : null;\n            }\n\n            function findZone(utcTime, zones, timezone) {\n                var zoneRules = zones[timezone];\n\n                if (typeof zoneRules === \"string\") {\n                    zoneRules = zones[zoneRules];\n                }\n\n                if (!zoneRules) {\n                    throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n                }\n\n                for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n                    var until = zoneRules[idx][3];\n\n                    if (until && utcTime > until) {\n                        break;\n                    }\n                }\n\n                var zone = zoneRules[idx + 1];\n\n                if (!zone) {\n                    throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + \".\");\n                }\n\n                return zone;\n            }\n\n            function zoneAndRule(utcTime, zones, rules, timezone) {\n                if (typeof utcTime != NUMBER) {\n                    utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(),\n                        utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(),\n                        utcTime.getSeconds(), utcTime.getMilliseconds());\n                }\n\n                var zone = findZone(utcTime, zones, timezone);\n\n                return {\n                    zone: zone,\n                    rule: findRule(utcTime, rules, zone[1])\n                };\n            }\n\n            function offset(utcTime, timezone) {\n                if (timezone == \"Etc/UTC\" || timezone == \"Etc/GMT\") {\n                    return 0;\n                }\n\n                var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n                var zone = info.zone;\n                var rule = info.rule;\n\n                return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n            }\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\n                var base = zone[2];\n\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\n                return base;\n            }\n\n            function convert(date, fromOffset, toOffset) {\n                var tempToOffset = toOffset;\n                var diff;\n\n                if (typeof fromOffset == STRING) {\n                    fromOffset = this.offset(date, fromOffset);\n                }\n\n                if (typeof toOffset == STRING) {\n                    toOffset = this.offset(date, toOffset);\n                }\n\n                var fromLocalOffset = date.getTimezoneOffset();\n\n                date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n\n                var toLocalOffset = date.getTimezoneOffset();\n\n                if (typeof tempToOffset == STRING) {\n                    tempToOffset = this.offset(date, tempToOffset);\n                }\n\n                diff = (toLocalOffset - fromLocalOffset) + (toOffset - tempToOffset);\n\n                return new Date(date.getTime() + diff * 60000);\n            }\n\n            function apply(date, timezone) {\n               return this.convert(date, date.getTimezoneOffset(), timezone);\n            }\n\n            function remove(date, timezone) {\n               return this.convert(date, timezone, date.getTimezoneOffset());\n            }\n\n            function toLocalDate(time) {\n                return this.apply(new Date(time), \"Etc/UTC\");\n            }\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\n        kendo.date = (function() {\n            var MS_PER_MINUTE = 60000,\n                MS_PER_DAY = 86400000;\n\n            function adjustDST(date, hours) {\n                if (hours === 0 && date.getHours() === 23) {\n                    date.setHours(date.getHours() + 2);\n                    return true;\n                }\n\n                return false;\n            }\n\n            function setDayOfWeek(date, day, dir) {\n                var hours = date.getHours();\n\n                dir = dir || 1;\n                day = ((day - date.getDay()) + (7 * dir)) % 7;\n\n                date.setDate(date.getDate() + day);\n                adjustDST(date, hours);\n            }\n\n            function dayOfWeek(date, day, dir) {\n                date = new Date(date);\n                setDayOfWeek(date, day, dir);\n                return date;\n            }\n\n            function firstDayOfMonth(date) {\n                return new Date(\n                    date.getFullYear(),\n                    date.getMonth(),\n                    1\n                );\n            }\n\n            function lastDayOfMonth(date) {\n                var last = new Date(date.getFullYear(), date.getMonth() + 1, 0),\n                    first = firstDayOfMonth(date),\n                    timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n\n                if (timeOffset) {\n                    last.setHours(first.getHours() + (timeOffset / 60));\n                }\n\n                return last;\n            }\n\n            function firstDayOfYear(date) {\n                return new Date(date.getFullYear(), 0, 1);\n            }\n\n            function lastDayOfYear(date) {\n                return new Date(date.getFullYear(), 11, 31);\n            }\n\n            function moveDateToWeekStart(date, weekStartDay) {\n                if (weekStartDay !== 1) {\n                    return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n                }\n\n                return addDays(date, (4 - (date.getDay() || 7)));\n            }\n\n            function calcWeekInYear(date, weekStartDay) {\n                var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n\n                var newDate = moveDateToWeekStart(date, weekStartDay);\n\n                var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n\n                var days = Math.floor(diffInMS / MS_PER_DAY);\n\n                return 1 + Math.floor(days / 7);\n            }\n\n            function weekInYear(date, weekStartDay) {\n                if (weekStartDay === undefined$1) {\n                    weekStartDay = kendo.culture().calendar.firstDay;\n                }\n\n                var prevWeekDate = addDays(date, -7);\n                var nextWeekDate = addDays(date, 7);\n\n                var weekNumber = calcWeekInYear(date, weekStartDay);\n\n                if (weekNumber === 0) {\n                    return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n                }\n\n                if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n                    return 1;\n                }\n\n                return weekNumber;\n            }\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\n            function toUtcTime(date) {\n                return Date.UTC(date.getFullYear(), date.getMonth(),\n                            date.getDate(), date.getHours(), date.getMinutes(),\n                            date.getSeconds(), date.getMilliseconds());\n            }\n\n            function getMilliseconds(date) {\n                return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n            }\n\n            function isInTimeRange(value, min, max) {\n                var msMin = getMilliseconds(min),\n                    msMax = getMilliseconds(max),\n                    msValue;\n\n                if (!value || msMin == msMax) {\n                    return true;\n                }\n\n                if (min >= max) {\n                    max += MS_PER_DAY;\n                }\n\n                msValue = getMilliseconds(value);\n\n                if (msMin > msValue) {\n                    msValue += MS_PER_DAY;\n                }\n\n                if (msMax < msMin) {\n                    msMax += MS_PER_DAY;\n                }\n\n                return msValue >= msMin && msValue <= msMax;\n            }\n\n            function isInDateRange(value, min, max) {\n                var msMin = min.getTime(),\n                    msMax = max.getTime(),\n                    msValue;\n\n                if (msMin >= msMax) {\n                    msMax += MS_PER_DAY;\n                }\n\n                msValue = value.getTime();\n\n                return msValue >= msMin && msValue <= msMax;\n            }\n\n            function addDays(date, offset) {\n                var hours = date.getHours();\n                    date = new Date(date);\n\n                setTime(date, offset * MS_PER_DAY);\n                adjustDST(date, hours);\n                return date;\n            }\n\n            function setTime(date, milliseconds, ignoreDST) {\n                var offset = date.getTimezoneOffset();\n                var difference;\n\n                date.setTime(date.getTime() + milliseconds);\n\n                if (!ignoreDST) {\n                    difference = date.getTimezoneOffset() - offset;\n                    date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n                }\n            }\n\n            function setHours(date, time) {\n                date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n                adjustDST(date, time.getHours());\n                return date;\n            }\n\n            function today() {\n                return getDate(new Date());\n            }\n\n            function isToday(date) {\n               return getDate(date).getTime() == today().getTime();\n            }\n\n            function toInvariantTime(date) {\n                var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n\n                if (date) {\n                    staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n                }\n\n                return staticDate;\n            }\n\n            function addYear(date, offset) {\n                var currentDate = new Date(date);\n\n                return new Date(currentDate.setFullYear(currentDate.getFullYear() + offset));\n            }\n\n            function addLiteral(parts, value) {\n                var lastPart = parts[parts.length - 1];\n                if (lastPart && lastPart.type === \"LITERAL\") {\n                    lastPart.pattern += value;\n                } else {\n                    parts.push({\n                        type: \"literal\",\n                        pattern: value\n                    });\n                }\n            }\n\n            function isHour12(pattern) {\n                return pattern === \"h\" || pattern === \"K\";\n            }\n\n            function dateNameType(formatLength) {\n                var nameType;\n                if (formatLength <= 3) {\n                    nameType = \"abbreviated\";\n                } else if (formatLength === 4) {\n                    nameType = \"wide\";\n                } else if (formatLength === 5) {\n                    nameType = \"narrow\";\n                }\n\n                return nameType;\n            }\n\n            function startsWith(text, searchString, position) {\n                position = position || 0;\n                return text.indexOf(searchString, position) === position;\n            }\n\n            function datePattern(format, info) {\n                var calendar = info.calendar;\n                var result;\n                if (typeof format === \"string\") {\n                    if (calendar.patterns[format]) {\n                        result = calendar.patterns[format];\n                    } else {\n                        result = format;\n                    }\n                }\n\n                if (!result) {\n                    result = calendar.patterns.d;\n                }\n\n                return result;\n            }\n\n            function splitDateFormat(format) {\n                var info = kendo.culture();\n                var pattern = datePattern(format, info).replaceAll(\"dddd\", \"EEEE\").replaceAll(\"ddd\", \"EEE\").replace(\"tt\", \"aa\");\n                var parts = [];\n                var dateFormatRegExp = /d{1,2}|E{1,6}|e{1,6}|c{3,6}|c{1}|M{1,5}|L{1,5}|y{1,4}|H{1,2}|h{1,2}|k{1,2}|K{1,2}|m{1,2}|a{1,5}|s{1,2}|S{1,3}|t{1,2}|z{1,4}|Z{1,5}|x{1,5}|X{1,5}|G{1,5}|q{1,5}|Q{1,5}|\"[^\"]*\"|'[^']*'/g;\n\n                var lastIndex = dateFormatRegExp.lastIndex = 0;\n                var match = dateFormatRegExp.exec(pattern);\n                var specifier;\n                var type;\n                var part;\n                var names;\n                var minLength;\n                var patternLength;\n\n                while (match) {\n                    var value = match[0];\n\n                    if (lastIndex < match.index) {\n                        addLiteral(parts, pattern.substring(lastIndex, match.index));\n                    }\n\n                    if (startsWith(value, '\"') || startsWith(value, \"'\")) {\n                        addLiteral(parts, value);\n                    } else {\n                        specifier = value[0];\n                        type = DATE_FIELD_MAP[specifier];\n                        part = {\n                            type: type,\n                            pattern: value\n                        };\n\n                        if (type === \"hour\") {\n                            part.hour12 = isHour12(value);\n                        }\n\n                        names = NAME_TYPES[type];\n\n                        if (names) {\n                            minLength = typeof names.minLength === \"number\" ? names.minLength : names.minLength[specifier];\n                            patternLength = value.length;\n\n                            if (patternLength >= minLength && value !== \"aa\") {\n                                part.names = {\n                                    type: names.type,\n                                    nameType: dateNameType(patternLength),\n                                    standAlone: names.standAlone === specifier\n                                };\n                            }\n                        }\n\n                        parts.push(part);\n                    }\n\n                    lastIndex = dateFormatRegExp.lastIndex;\n                    match = dateFormatRegExp.exec(pattern);\n                }\n\n                if (lastIndex < pattern.length) {\n                    addLiteral(parts, pattern.substring(lastIndex));\n                }\n\n                return parts;\n            }\n\n            function dateFormatNames(options) {\n                let { type, nameType } = options;\n                const info = kendo.culture();\n                if (nameType === \"wide\") {\n                    nameType = \"names\";\n                }\n                if (nameType === \"abbreviated\") {\n                    nameType = \"namesAbbr\";\n                }\n                if (nameType === \"narrow\") {\n                    nameType = \"namesShort\";\n                }\n                let result = info.calendar[type][nameType];\n                if (!result) {\n                    result = info.calendar[type][\"name\"];\n                }\n                return result;\n            }\n\n            function dateFieldName(options) {\n                const info = kendo.culture();\n                const dateFields = info.calendar.dateFields;\n                const fieldNameInfo = dateFields[options.type] || {};\n\n                return fieldNameInfo[options.nameType];\n            }\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                splitDateFormat: splitDateFormat,\n                dateFieldName: dateFieldName,\n                dateFormatNames: dateFormatNames,\n                lastDayOfMonth: lastDayOfMonth,\n                weekInYear: weekInYear,\n                getMilliseconds: getMilliseconds,\n                firstDayOfYear: firstDayOfYear,\n                lastDayOfYear: lastDayOfYear,\n                nextYear: function(date) {\n                    return addYear(date, 1);\n                },\n                previousYear: function(date) {\n                    return addYear(date, -1);\n                }\n            };\n        })();\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\n                while (iterator.nextNode()) {\n                    if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n                        iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n                    }\n                }\n            } else { // IE7/8 support\n                for (var i = 0; i < element.childNodes.length; i++) {\n                    var child = element.childNodes[i];\n\n                    if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n                        element.removeChild(child);\n                        i--;\n                    }\n\n                    if (child.nodeType == 1) {\n                        kendo.stripWhitespace(child);\n                    }\n                }\n            }\n        };\n\n        var animationFrame = window.requestAnimationFrame ||\n                              window.webkitRequestAnimationFrame ||\n                              window.mozRequestAnimationFrame ||\n                              window.oRequestAnimationFrame ||\n                              window.msRequestAnimationFrame ||\n                              function(callback) { setTimeout(callback, 1000 / 60); };\n\n        kendo.animationFrame = function(callback) {\n            animationFrame.call(window, callback);\n        };\n\n        var animationQueue = [];\n\n        kendo.queueAnimation = function(callback) {\n            animationQueue[animationQueue.length] = callback;\n            if (animationQueue.length === 1) {\n                kendo.runNextAnimation();\n            }\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\n        kendo.parseQueryStringParams = function(url) {\n            var queryString = url.split('?')[1] || \"\",\n                params = {},\n                paramParts = queryString.split(/&|=/),\n                length = paramParts.length,\n                idx = 0;\n\n            for (; idx < length; idx += 2) {\n                if (paramParts[idx] !== \"\") {\n                    params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n                }\n            }\n\n            return params;\n        };\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\n        kendo.wheelDeltaY = function(jQueryEvent) {\n            var e = jQueryEvent.originalEvent,\n                deltaY = e.wheelDeltaY,\n                delta;\n\n                if (e.wheelDelta) { // Webkit and IE\n                    if (deltaY === undefined$1 || deltaY) { // IE does not have deltaY, thus always scroll (horizontal scrolling is treated as vertical)\n                        delta = e.wheelDelta;\n                    }\n                } else if (e.detail && e.axis === e.VERTICAL_AXIS) { // Firefox and Opera\n                    delta = (-e.detail) * 10;\n                }\n\n            return delta;\n        };\n\n        kendo.throttle = function(fn, delay) {\n            var timeout;\n            var lastExecTime = 0;\n\n            if (!delay || delay <= 0) {\n                return fn;\n            }\n\n            var throttled = function() {\n                var that = this;\n                var elapsed = +new Date() - lastExecTime;\n                var args = arguments;\n\n                function exec() {\n                    fn.apply(that, args);\n                    lastExecTime = +new Date();\n                }\n\n                // first execution\n                if (!lastExecTime) {\n                    return exec();\n                }\n\n                if (timeout) {\n                    clearTimeout(timeout);\n                }\n\n                if (elapsed > delay) {\n                    exec();\n                } else {\n                    timeout = setTimeout(exec, delay - elapsed);\n                }\n            };\n\n            throttled.cancel = function() {\n                clearTimeout(timeout);\n            };\n\n            return throttled;\n        };\n\n\n        kendo.caret = function(element, start, end) {\n            var rangeElement;\n            var isPosition = start !== undefined$1;\n\n            if (end === undefined$1) {\n                end = start;\n            }\n\n            if (element[0]) {\n                element = element[0];\n            }\n\n            if (isPosition && element.disabled) {\n                return;\n            }\n\n            try {\n                if (element.selectionStart !== undefined$1) {\n                    if (isPosition) {\n                        element.focus();\n                        var mobile = support.mobileOS;\n                        if (mobile.wp || mobile.android) {// without the timeout the caret is at the end of the input\n                            setTimeout(function() { element.setSelectionRange(start, end); }, 0);\n                        }\n                        else {\n                            element.setSelectionRange(start, end);\n                        }\n                    } else {\n                        start = [element.selectionStart, element.selectionEnd];\n                    }\n                } else if (document.selection) {\n                    if ($(element).is(\":visible\")) {\n                        element.focus();\n                    }\n\n                    rangeElement = element.createTextRange();\n\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(),\n                            selectionStart, selectionEnd;\n\n                            rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n                            rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n                            selectionStart = rangeDuplicated.text.length;\n                            selectionEnd = selectionStart + rangeElement.text.length;\n\n                        start = [selectionStart, selectionEnd];\n                    }\n                }\n            } catch (e) {\n                /* element is not focused or it is not in the DOM */\n                start = [];\n            }\n\n            return start;\n        };\n\n        kendo.antiForgeryTokens = function() {\n            var tokens = { },\n                csrf_token = $(\"meta[name=csrf-token],meta[name=_csrf]\").attr(\"content\"),\n                csrf_param = $(\"meta[name=csrf-param],meta[name=_csrf_header]\").attr(\"content\");\n\n            $(\"input[name^='__RequestVerificationToken']\").each(function() {\n                tokens[this.name] = this.value;\n            });\n\n            if (csrf_param !== undefined$1 && csrf_token !== undefined$1) {\n              tokens[csrf_param] = csrf_token;\n            }\n\n            return tokens;\n        };\n\n        kendo.cycleForm = function(form) {\n            var firstElement = form.find(\"input, .k-widget, .k-dropdownlist, .k-combobox\").first();\n            var lastElement = form.find(\"button, .k-button\").last();\n\n            function focus(el) {\n                var widget = kendo.widgetInstance(el);\n\n                if (widget && widget.focus) {\n                  widget.focus();\n                } else {\n                  el.trigger(\"focus\");\n                }\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\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\n        kendo.focusElement = function(element) {\n            var scrollTopPositions = [];\n            var scrollableParents = element.parentsUntil(\"body\")\n                    .filter(function(index, element) {\n                        var computedStyle = kendo.getComputedStyles(element, [\"overflow\"]);\n                        return computedStyle.overflow !== \"visible\";\n                    })\n                    .add(window);\n\n            scrollableParents.each(function(index, parent) {\n                scrollTopPositions[index] = $(parent).scrollTop();\n            });\n\n            try {\n                //The setActive method does not cause the document to scroll to the active object in the current page\n                element[0].setActive();\n            } catch (e) {\n                element[0].focus();\n            }\n\n            scrollableParents.each(function(index, parent) {\n                $(parent).scrollTop(scrollTopPositions[index]);\n            });\n        };\n\n        kendo.focusNextElement = function() {\n            if (document.activeElement) {\n                var focussable = $(\":kendoFocusable\");\n                var index = focussable.index(document.activeElement);\n\n                if (index > -1) {\n                   var nextElement = focussable[index + 1] || focussable[0];\n                   nextElement.focus();\n                }\n            }\n        };\n\n        kendo.trim = function(value) {\n            if (!!value) {\n                return value.toString().trim();\n            } else {\n                return \"\";\n            }\n        };\n\n        kendo.getWidgetFocusableElement = function(element) {\n            var nextFocusable = element.closest(\":kendoFocusable\"),\n                widgetInstance = kendo.widgetInstance(element),\n                target;\n\n            if (nextFocusable.length) {\n                target = nextFocusable;\n            } else if (widgetInstance) {\n                target = widgetInstance.options.name === 'Editor' ?\n                    $(widgetInstance.body) :\n                    widgetInstance.wrapper.find(\":kendoFocusable\").first();\n            } else {\n                target = element;\n            }\n\n            return target;\n        };\n\n        kendo.addAttribute = function(element, attribute, value) {\n            var current = element.attr(attribute) || \"\";\n\n            if (current.indexOf(value) < 0) {\n                element.attr(attribute, (current + \" \" + value).trim());\n            }\n        };\n\n        kendo.removeAttribute = function(element, attribute, value) {\n            var current = element.attr(attribute) || \"\";\n\n            element.attr(attribute, current.replace(value, \"\").trim());\n        };\n\n        kendo.toggleAttribute = function(element, attribute, value) {\n            var current = element.attr(attribute) || \"\";\n\n            if (current.indexOf(value) < 0) {\n                kendo.addAttribute(element, attribute, value);\n            } else {\n                kendo.removeAttribute(element, attribute, value);\n            }\n        };\n\n        kendo.matchesMedia = function(mediaQuery) {\n            var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n            return support.matchMedia && window.matchMedia(media).matches;\n        };\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\n        kendo.fileGroupMap = {\n            audio: [\".aif\", \".iff\", \".m3u\", \".m4a\", \".mid\", \".mp3\", \".mpa\", \".wav\", \".wma\", \".ogg\", \".wav\", \".wma\", \".wpl\"],\n            video: [\".3g2\", \".3gp\", \".avi\", \".asf\", \".flv\", \".m4u\", \".rm\", \".h264\", \".m4v\", \".mkv\", \".mov\", \".mp4\", \".mpg\",\n                    \".rm\", \".swf\", \".vob\", \".wmv\"],\n            image: [\".ai\", \".dds\", \".heic\", \".jpe\", \"jfif\", \".jif\", \".jp2\", \".jps\", \".eps\", \".bmp\", \".gif\", \".jpeg\",\n                    \".jpg\", \".png\", \".ps\", \".psd\", \".svg\", \".svgz\", \".tif\", \".tiff\"],\n            txt: [\".doc\", \".docx\", \".log\", \".pages\", \".tex\", \".wpd\", \".wps\", \".odt\", \".rtf\", \".text\", \".txt\", \".wks\"],\n            presentation: [\".key\", \".odp\", \".pps\", \".ppt\", \".pptx\"],\n            data: [\".xlr\", \".xls\", \".xlsx\"],\n            programming: [\".tmp\", \".bak\", \".msi\", \".cab\", \".cpl\", \".cur\", \".dll\", \".dmp\", \".drv\", \".icns\", \".ico\", \".link\",\n                          \".sys\", \".cfg\", \".ini\", \".asp\", \".aspx\", \".cer\", \".csr\", \".css\", \".dcr\", \".htm\", \".html\", \".js\",\n                          \".php\", \".rss\", \".xhtml\"],\n            pdf: [\".pdf\"],\n            config: [\".apk\", \".app\", \".bat\", \".cgi\", \".com\", \".exe\", \".gadget\", \".jar\", \".wsf\"],\n            zip: [\".7z\", \".cbr\", \".gz\", \".sitx\", \".arj\", \".deb\", \".pkg\", \".rar\", \".rpm\", \".tar.gz\", \".z\", \".zip\", \".zipx\"],\n            \"disc-image\": [\".dmg\", \".iso\", \".toast\", \".vcd\", \".bin\", \".cue\", \".mdf\"]\n        };\n\n        kendo.getFileGroup = function(extension, withPrefix) {\n            var fileTypeMap = kendo.fileGroupMap;\n            var groups = Object.keys(fileTypeMap);\n            var type = \"file\";\n\n            if (extension === undefined$1 || !extension.length) {\n                return type;\n            }\n\n            for (var i = 0; i < groups.length; i += 1) {\n                var extensions = fileTypeMap[groups[i]];\n\n                if (extensions.indexOf(extension.toLowerCase()) > -1) {\n                   return withPrefix ? \"file-\" + groups[i] : groups[i];\n                }\n            }\n\n            return type;\n        };\n\n        kendo.getFileSizeMessage = function(size) {\n            var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n            if (size === 0) {\n                return '0 Byte';\n            }\n\n            var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n            return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n        };\n\n        kendo.selectorFromClasses = function(classes) {\n            return \".\" + classes.split(\" \").join(\".\");\n        };\n\n        // Standardized Properties and CSS classes\n\n        var themeColorValues = ['base', 'primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse'];\n        var fillValues = ['solid', 'outline', 'flat'];\n        //var postitionValues = ['edge', 'outside', 'inside'];\n        var shapeValues = ['rectangle', 'square'];\n        var sizeValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n        var roundedValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n        //var alignValues = [ ['top start', 'top-start'], ['top end', 'top-end'], ['bottom start', 'bottom-start'], ['bottom end', 'bottom-end'] ];\n        var positionModeValues = [ 'fixed', 'static', 'sticky', 'absolute' ];\n        var resizeValues = [ ['both', 'resize'], ['horizontal', 'resize-x'], ['vertical', 'resize-y'] ];\n        var overflowValues = [ 'auto', 'hidden', 'visible', 'scroll', 'clip' ];\n        var layoutFlowValues = [ ['vertical', '!k-flex-col'], ['horizontal', '!k-flex-row'] ];\n\n        kendo.cssProperties = (function() {\n            var defaultValues = {},\n                propertyDictionary = {};\n\n            function registerPrefix(widget, prefix) {\n                var dict = kendo.cssProperties.propertyDictionary;\n\n                if (!dict[widget]) {\n                    dict[widget] = {};\n                }\n\n                dict[widget][PREFIX] = prefix;\n            }\n\n            function registerValues(widget, args) {\n                var dict = kendo.cssProperties.propertyDictionary,\n                    i, j, prop, values, newValues, currentValue;\n\n                for (i = 0; i < args.length; i++) {\n                    prop = args[i].prop;\n                    newValues = args[i].values;\n\n                    if (!dict[widget][prop]) {\n                        dict[widget][prop] = {};\n                    }\n\n                    values = dict[widget][prop];\n\n                    for (j = 0; j < newValues.length; j++) {\n                        currentValue = newValues[j];\n\n                        if (isArray(newValues[j])) {\n                            values[currentValue[0]] = currentValue[1];\n                        } else {\n                            values[currentValue] = currentValue;\n                        }\n                    }\n                }\n            }\n\n            function registerCssClass(propName, value, shorthand) {\n                if (!defaultValues[propName]) {\n                    defaultValues[propName] = {};\n                }\n\n                defaultValues[propName][value] = shorthand || value;\n            }\n\n            function registerCssClasses(propName, arr) {\n                for (var i = 0; i < arr.length; i++) {\n                    if (isArray(arr[i])) {\n                        registerCssClass(propName, arr[i][0], arr[i][1]);\n                    } else {\n                        registerCssClass(propName, arr[i]);\n                    }\n                }\n            }\n\n            function getValidClass(args) {\n                var widget = args.widget,\n                    propName = args.propName,\n                    value = args.value,\n                    fill = args.fill,\n                    cssProperties = kendo.cssProperties,\n                    defaultValues = cssProperties.defaultValues[propName],\n                    widgetProperties = cssProperties.propertyDictionary[widget],\n                    overridePrefix = args.prefix,\n                    widgetValues, validValue, prefix;\n\n                if (!widgetProperties) {\n                    return \"\";\n                }\n\n                widgetValues = widgetProperties[propName];\n                validValue = widgetValues ? widgetValues[value] || defaultValues[value] : defaultValues[value];\n\n                if (validValue) {\n                    if (propName === \"themeColor\") {\n                        prefix = widgetProperties[PREFIX] + fill + \"-\";\n                    } else if (propName === \"positionMode\") {\n                        prefix = \"k-pos-\";\n                    } else if (propName === \"rounded\") {\n                        prefix = \"k-rounded-\";\n                    } else if (propName === \"resize\") {\n                        prefix = \"k-\";\n                    } else if (propName === \"overflow\") {\n                        prefix = \"k-overflow-\";\n                    } else if (propName === \"layoutFlow\") {\n                        prefix = \"\";\n                    } else {\n                        prefix = widgetProperties[PREFIX];\n                    }\n\n                    prefix = overridePrefix || prefix;\n\n                    return prefix + validValue;\n                } else {\n                    return \"\";\n                }\n            }\n\n            registerCssClasses(\"themeColor\", themeColorValues);\n            registerCssClasses(\"fillMode\", fillValues);\n            registerCssClasses(\"shape\", shapeValues);\n            registerCssClasses(\"size\", sizeValues);\n            registerCssClasses(\"positionMode\", positionModeValues);\n            registerCssClasses(\"rounded\", roundedValues);\n            registerCssClasses(\"resize\", resizeValues);\n            registerCssClasses(\"overflow\", overflowValues);\n            registerCssClasses(\"layoutFlow\", layoutFlowValues);\n\n            return {\n                positionModeValues: positionModeValues,\n                roundedValues: roundedValues,\n                sizeValues: sizeValues,\n                shapeValues: shapeValues,\n                fillModeValues: fillValues,\n                themeColorValues: themeColorValues,\n\n                defaultValues: defaultValues,\n                propertyDictionary: propertyDictionary,\n\n                registerValues: registerValues,\n                getValidClass: getValidClass,\n                registerPrefix: registerPrefix\n            };\n        }());\n\n        //To do: delete below after implementing new styles and classes for BottomNavigation\n        kendo.registerCssClass = function(propName, value, shorthand) {\n            if (!kendo.propertyToCssClassMap[propName]) {\n                kendo.propertyToCssClassMap[propName] = {};\n            }\n\n            kendo.propertyToCssClassMap[propName][value] = shorthand || value;\n        };\n\n        kendo.registerCssClasses = function(propName, arr) {\n            for (var i = 0; i < arr.length; i++) {\n                if (isArray(arr[i])) {\n                    kendo.registerCssClass(propName, arr[i][0], arr[i][1]);\n                } else {\n                    kendo.registerCssClass(propName, arr[i]);\n                }\n            }\n        };\n\n        kendo.getValidCssClass = function(prefix, propName, value) {\n            var validValue = kendo.propertyToCssClassMap[propName][value];\n\n            if (validValue) {\n                return prefix + validValue;\n            }\n        };\n\n        kendo.propertyToCssClassMap = {};\n\n        kendo.registerCssClasses(\"themeColor\", themeColorValues);\n        kendo.registerCssClasses(\"fill\", fillValues);\n        //kendo.registerCssClasses(\"postition\", postitionValues);\n        kendo.registerCssClasses(\"shape\", shapeValues);\n        kendo.registerCssClasses(\"size\", sizeValues);\n        //kendo.registerCssClasses(\"align\", alignValues);\n        kendo.registerCssClasses(\"positionMode\", positionModeValues);\n\n        kendo.applyStylesFromKendoAttributes = function(element, styleProps) {\n            let selector = styleProps.map(styleProp=> `[${kendo.attr(`style-${styleProp}`)}]`).join(',');\n            element.find(selector).addBack(selector).each((_, currentElement) => {\n                let $currentElement = $(currentElement);\n                styleProps.forEach(function(styleProp) {\n                    let kendoAttr = kendo.attr(`style-${styleProp}`);\n                    if ($currentElement.attr(kendoAttr)) {\n                        $currentElement.css(styleProp, $currentElement.attr(kendoAttr));\n                        $currentElement.removeAttr(kendoAttr);\n                    }\n                });\n            });\n        };\n\n        // jQuery deferred helpers\n\n        // influenced from: https://gist.github.com/fearphage/4341799\n        kendo.whenAll = function(array) {\n            var resolveValues = arguments.length == 1 && Array.isArray(array) ? array : Array.prototype.slice.call(arguments),\n                length = resolveValues.length,\n                remaining = length,\n                deferred = $.Deferred(),\n                i = 0,\n                failed = 0,\n                rejectContexts = Array(length),\n                rejectValues = Array(length),\n                resolveContexts = Array(length),\n                value;\n\n            function updateFunc(index, contexts, values) {\n                return function() {\n                    if (values != resolveValues) {\n                        failed++;\n                    }\n\n                    deferred.notifyWith(\n                        contexts[index] = this,\n                        values[index] = Array.prototype.slice.call(arguments)\n                    );\n\n                    if (!(--remaining)) {\n                        deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);\n                    }\n                };\n            }\n\n            for (; i < length; i++) {\n                if ((value = resolveValues[i]) && kendo.isFunction(value.promise)) {\n                    value.promise()\n                        .done(updateFunc(i, resolveContexts, resolveValues))\n                        .fail(updateFunc(i, rejectContexts, rejectValues));\n                }\n\n                else {\n                    deferred.notifyWith(this, value);\n                    --remaining;\n                }\n            }\n\n            if (!remaining) {\n                deferred.resolveWith(resolveContexts, resolveValues);\n            }\n\n            return deferred.promise();\n        };\n\n        // kendo.saveAs -----------------------------------------------\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\n                var data = kendo.antiForgeryTokens();\n                data.fileName = fileName;\n\n                var parts = dataURI.split(\";base64,\");\n                data.contentType = parts[0].replace(\"data:\", \"\");\n                data.base64 = parts[1];\n\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\n                form.appendTo(\"body\").submit().remove();\n            }\n\n            var fileSaver = document.createElement(\"a\");\n            var downloadAttribute = \"download\" in fileSaver && !kendo.support.browser.edge;\n\n            function saveAsBlob(dataURI, fileName) {\n                var blob = dataURI; // could be a Blob object\n\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\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\n                navigator.msSaveBlob(blob, fileName);\n            }\n\n            function saveAsDataURI(dataURI, fileName) {\n                if (window.Blob && dataURI instanceof Blob) {\n                    dataURI = URL.createObjectURL(dataURI);\n                }\n\n                fileSaver.download = fileName;\n                fileSaver.href = dataURI;\n\n                var e = document.createEvent(\"MouseEvents\");\n                e.initMouseEvent(\"click\", true, false, window,\n                    0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n                fileSaver.dispatchEvent(e);\n                setTimeout(function() {\n                    URL.revokeObjectURL(dataURI);\n                });\n            }\n\n            kendo.saveAs = function(options) {\n                var save = postToProxy;\n\n                if (!options.forceProxy) {\n                    if (downloadAttribute) {\n                        save = saveAsDataURI;\n                    } else if (navigator.msSaveBlob) {\n                        save = saveAsBlob;\n                    }\n                }\n\n                save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n            };\n        })();\n\n        // kendo proxySetters\n        kendo.proxyModelSetters = function proxyModelSetters(data) {\n            var observable = {};\n\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\n            return observable;\n        };\n\n        kendo.getSeriesColors = function() {\n            var seriesColorsTemplate = '<div class=\"k-var--series-a\"></div>' +\n                    '<div class=\"k-var--series-b\"></div>' +\n                    '<div class=\"k-var--series-c\"></div>' +\n                    '<div class=\"k-var--series-d\"></div>' +\n                    '<div class=\"k-var--series-e\"></div>' +\n                    '<div class=\"k-var--series-f\"></div>',\n                series = $(seriesColorsTemplate),\n                colors = [];\n\n            series.appendTo($('body'));\n\n            series.each(function(i, item) {\n                colors.push($(item).css(\"background-color\"));\n            });\n\n            series.remove();\n\n            return colors;\n        };\n\n        kendo.isElement = function(element) {\n            return element instanceof Element || element instanceof HTMLDocument;\n        };\n\n        // Kendo defaults\n        (function() {\n\n            kendo.defaults = kendo.defaults || {};\n            kendo.setDefaults = function(key, value) {\n                var path = key.split(\".\");\n                var curr = kendo.defaults;\n\n                key = path.pop();\n\n                path.forEach(function(part) {\n                    if (curr[part] === undefined$1) {\n                        curr[part] = {};\n                    }\n\n                    curr = curr[part];\n                });\n\n                if (value.constructor === Object) {\n                    curr[key] = deepExtend({}, curr[key], value);\n                } else {\n                    curr[key] = value;\n                }\n            };\n\n            // Use external global flags for templates.\n            kendo.debugTemplates = window.DEBUG_KENDO_TEMPLATES;\n\n            // Setup default mediaQuery breakpoints\n            kendo.setDefaults('breakpoints', defaultBreakpoints);\n        })();\n\n        // Implement type() as it has been depricated in jQuery\n        (function() {\n            kendo.class2type = {};\n\n            jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n                function( _i, name ) {\n                    kendo.class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n                } );\n\n            kendo.type = function(obj) {\n                if ( obj == null ) {\n                    return obj + \"\";\n                }\n\n                // Support: Android <=2.3 only (functionish RegExp)\n                return typeof obj === \"object\" || typeof obj === \"function\" ?\n                    kendo.class2type[Object.prototype.toString.call(obj)] || \"object\" :\n                    typeof obj;\n            };\n        }());\n\n        var KendoLicensing = { validatePackage: function() { return true; },setScriptKey: function() {} };\n\n        window.KendoLicensing = {\n            setScriptKey: KendoLicensing.setScriptKey\n        };\n\n        function validatePackage() {\n            return KendoLicensing.validatePackage(packageMetadata);\n        }\n\n        function addWatermarkOverlay(el) {\n            KendoLicensing.addWatermarkOverlay && KendoLicensing.addWatermarkOverlay(el, packageMetadata);\n            KendoLicensing.showBanner && KendoLicensing.showBanner(packageMetadata);\n        }\n\n    })(jQuery, window);\n    var kendo$1 = kendo;\n\n    return kendo$1;\n\n}));\n"]}